久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Hive SQL連續(xù)登錄天數(shù)計(jì)算:開(kāi)窗函數(shù)LAG與ROW_NUMBER實(shí)戰(zhàn)

Hive SQL連續(xù)登錄天數(shù)計(jì)算:開(kāi)窗函數(shù)LAG與ROW_NUMBER實(shí)戰(zhàn) 1. 項(xiàng)目需求拆解連續(xù)登錄到底在算什么先說(shuō)結(jié)論這個(gè)需求在數(shù)據(jù)分析里幾乎屬于“必考題型”它本質(zhì)是兩個(gè)問(wèn)題第一個(gè)問(wèn)題一個(gè)用戶歷史上最多連續(xù)多少天登錄過(guò)比如連續(xù)3天、連續(xù)7天中間斷開(kāi)一天就重新計(jì)數(shù)。第二個(gè)問(wèn)題用戶每次斷開(kāi)后重新登錄要生成一個(gè)從1開(kāi)始的序號(hào)讓后續(xù)統(tǒng)計(jì)能區(qū)分“第幾段連續(xù)區(qū)間”。比如用戶1月1日、1月2日登錄1月3日沒(méi)登錄1月4日又登錄那么前兩天的序號(hào)是1、2后一天的序號(hào)重新從1開(kāi)始。這兩件事聽(tīng)起來(lái)簡(jiǎn)單但真正落到 Hive SQL 里需要想清楚“連續(xù)”的數(shù)學(xué)定義、日期去重、跨天跨月邊界以及 Hive 特有的并行和字段處理細(xì)節(jié)。我在實(shí)際項(xiàng)目中接過(guò)不少類似需求有的要算連續(xù)簽到、有的要算商家連續(xù)營(yíng)業(yè)天數(shù)、有的要算用戶活躍連續(xù)性底層邏輯完全一致。只要把核心方法吃透任何連續(xù)性問(wèn)題都能直接套。這個(gè)方案適合誰(shuí)參考一類是剛接觸 Hive 開(kāi)窗函數(shù)的人另一類是已經(jīng)寫了一些 SQL 但總覺(jué)得邏輯繞不清的人。我會(huì)從最基礎(chǔ)的行文思路上講把每一步拆開(kāi)連 SQL 里每一步在干什么都解釋清楚最后給出完整可復(fù)制的實(shí)現(xiàn)。2. 前置知識(shí)Hive 開(kāi)窗函數(shù)和下鉆的邏輯基礎(chǔ)2.1 為什么計(jì)算連續(xù)性問(wèn)題必須用開(kāi)窗函數(shù)先明確一個(gè)痛點(diǎn)普通 GROUP BY 只能做聚合算不出“連續(xù)”。因?yàn)槟悴恢滥骋恍惺遣皇呛颓耙恍腥掌谶B續(xù)而有了開(kāi)窗函數(shù)后每一行都能看到它前一行、后一行的對(duì)應(yīng)字段。這就像排隊(duì)點(diǎn)名你不僅知道自己是誰(shuí)還能看到排在自己前一位的人是誰(shuí)一下就能判斷中間有沒(méi)有缺人。Hive 里常用的開(kāi)窗函數(shù)有 ROW_NUMBER()、LAG()、LEAD()、SUM() OVER() 等。計(jì)算連續(xù)登錄天數(shù)的核心套路有兩個(gè)基于 LAG() 判斷與前一行是否連續(xù)再給斷開(kāi)處打標(biāo)記基于日期減去行號(hào)的差值分組把連續(xù)的行歸到同一個(gè)組里。這里要特別提醒不要用自關(guān)聯(lián)去判斷連續(xù)性。數(shù)據(jù)量一上來(lái)自關(guān)聯(lián)的性能和復(fù)雜度都不可控而且 SQL 寫出來(lái)很難維護(hù)。開(kāi)窗函數(shù)的方式幾乎是固定的性能和可讀性都最好。2.2 日期去重很多連續(xù)性算錯(cuò)的第一步登錄記錄表可能一行一天也可能同一人同一天有很多條記錄比如用戶一天內(nèi)多次打開(kāi) App每個(gè)事件都落了一條日志。如果不去重1月1日有三條記錄就會(huì)被錯(cuò)誤地認(rèn)為是連續(xù)三天。所以在計(jì)算之前必須對(duì)登錄日期做去重才能進(jìn)入“連續(xù)日期序列”的下一步。去重標(biāo)準(zhǔn)寫法SELECT DISTINCT user_id, login_date FROM login_log;如果你用的是 SparkSQL也可以用 GROUP BY user_id, login_date效果一樣。這個(gè)操作看起來(lái)簡(jiǎn)單但漏掉這一步后面全盤皆輸。2.3 日期格式與日期相減的攔路問(wèn)題另一個(gè)常見(jiàn)坑是日期并不是標(biāo)準(zhǔn)日期類型。有的是字符串20250101有的是y-M-d格式有的是帶時(shí)間戳的 2025-01-01 12:34:56。做日期差之前必須統(tǒng)一為標(biāo)準(zhǔn)日期類型。Hive 里常用的日期函數(shù)to_date(字段)把時(shí)間字符串轉(zhuǎn)成日期格式date_sub(日期, n)日期往前推n天datediff(日期1, 日期2)返回日期1減日期2的天數(shù)regexp_replace把 20250101 轉(zhuǎn)成 2025-01-01寫法為 regexp_replace(dt, (\d{4})(\d{2})(\d{2}), $1-$2-$3)我見(jiàn)過(guò)很多同學(xué)在測(cè)試環(huán)境日期格式正常生產(chǎn)環(huán)境因?yàn)槿掌谧侄螏Я藭r(shí)分秒導(dǎo)致連續(xù)判斷全部失效。所以第一步必須做數(shù)據(jù)探查看清楚日期字段的真實(shí)類型和格式。3. 核心方法一基于 LAG 和分組標(biāo)記實(shí)現(xiàn)最大連續(xù)登錄天數(shù)3.1 思路拆解怎么定義“同一段連續(xù)區(qū)間”假設(shè)有這樣一個(gè)用戶的登錄日期序列2025-01-01 2025-01-02 2025-01-03 2025-01-05 2025-01-06可以看到1月1日到1月3日是連續(xù)的之后斷了1月5日到1月6日又是連續(xù)的。我們需要讓 SQL 自己識(shí)別出這兩段區(qū)間并給每段區(qū)間一個(gè)組編號(hào)。識(shí)別斷點(diǎn)的思路如果當(dāng)前行的日期減去它上一行的日期結(jié)果大于1說(shuō)明上一行和當(dāng)前行之間不連續(xù)當(dāng)前行就是一段新區(qū)間的起點(diǎn)。具體實(shí)現(xiàn)先用 LAG(login_date, 1, NULL) OVER (PARTITION BY user_id ORDER BY login_date) 拿到前一行日期。然后判斷 datediff(當(dāng)前日期, 前一行日期) 是否等于1。如果不等于1說(shuō)明當(dāng)前行是新一段連續(xù)區(qū)間的開(kāi)頭標(biāo)記為1否則標(biāo)記為0。有了標(biāo)記之后再用 SUM(標(biāo)記) OVER (PARTITION BY user_id ORDER BY login_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 做累加。這個(gè)累加結(jié)果就是分組編號(hào)。因?yàn)樾聟^(qū)間起點(diǎn)為1累加后會(huì)把后續(xù)所有行都?xì)w到同一個(gè)段數(shù)字下直到下一個(gè)斷點(diǎn)出現(xiàn)。拿上面的例子走一遍登錄日期 前一日 是否斷點(diǎn) 累加和 2025-01-01 NULL 1 1 2025-01-02 2025-01-01 0 1 2025-01-03 2025-01-02 0 1 2025-01-05 2025-01-03 1 2 2025-01-06 2025-01-05 0 2可見(jiàn)前三天分組為1后兩天分組為2分段完全正確。3.2 完整 SQL直接能跑的 Hive 腳本下面給出一套完整可用的 Hive SQL。假設(shè)登錄日志表名為 login_log字段為 user_id、login_datetime可能有多條重復(fù)日期也可能有時(shí)間戳。第一步做清洗去重第二步算分組第三步按組聚合算出每次連續(xù)天數(shù)第四步取最大。WITH login_dedup AS ( SELECT user_id, to_date(login_datetime) AS login_date FROM login_log GROUP BY user_id, to_date(login_datetime) ), login_group AS ( SELECT user_id, login_date, CASE WHEN datediff(login_date, LAG(login_date) OVER (PARTITION BY user_id ORDER BY login_date)) 1 THEN 0 ELSE 1 END AS is_new_group_start, LAG(login_date) OVER (PARTITION BY user_id ORDER BY login_date) AS prev_login_date FROM login_dedup ), login_with_group_id AS ( SELECT user_id, login_date, SUM(is_new_group_start) OVER (PARTITION BY user_id ORDER BY login_date) AS group_id FROM login_group ), login_duration AS ( SELECT user_id, group_id, MIN(login_date) AS start_date, MAX(login_date) AS end_date, COUNT(*) AS continuous_days FROM login_with_group_id GROUP BY user_id, group_id ) SELECT user_id, MAX(continuous_days) AS max_continuous_days FROM login_duration GROUP BY user_id;如果想把最大連續(xù)登錄天數(shù)對(duì)應(yīng)的起止日期也一起帶出來(lái)可以在最后一步用排序或結(jié)構(gòu)體。常見(jiàn)做法是把每段連續(xù)的天數(shù)、開(kāi)始日期、結(jié)束日期都聚合到一個(gè) map 中再取天數(shù)最大的那一個(gè)。但實(shí)際業(yè)務(wù)中大多數(shù)只要求一個(gè)數(shù)字所以上面這個(gè) SQL 已經(jīng)足夠。3.3 為什么寫 CASE 而不是直接 LAG 減 1有同學(xué)會(huì)問(wèn)既然 LAG 能拿到前一日日期能不能直接用一個(gè)字段標(biāo)記“是否連續(xù)”然后分組我給你一個(gè)反面示例-- 錯(cuò)誤寫法示意 if(datediff(login_date, lag_date)1, group_id, group_id1)這樣寫的問(wèn)題在于每一行的 group_id 都依賴前一行計(jì)算完的結(jié)果而 SQL 開(kāi)窗函數(shù)中不能以這種方式迭代賦值。正確做法是把“是否新組”做成0/1的獨(dú)立標(biāo)記再通過(guò) SUM 累加生成組號(hào)。這是 SQL 實(shí)現(xiàn)連續(xù)分組的經(jīng)典范式理解了這個(gè)后面很多問(wèn)題都能解決。另外要注意 LAG 的第一個(gè)參數(shù)是列名第二個(gè)參數(shù)是偏移量第三個(gè)參數(shù)是默認(rèn)值。第三個(gè)參數(shù)不寫的話默認(rèn)就是 NULL。這里我們故意不寫因?yàn)榈谝恍械那耙蝗帐?NULLdatediff(NULL) 結(jié)果是 NULLCASE 的判斷條件不成立會(huì)走 ELSE 分支得到1正好符合“第一行作為新起點(diǎn)”的語(yǔ)義。3.4 跨年、跨月、時(shí)區(qū)問(wèn)題一并處理連續(xù)登錄的日期可能跨年比如 12月31日 到 1月1日。只要日期類型正確、datediff 直接用日期相減跨年不是問(wèn)題Hive 的日期函數(shù)內(nèi)部會(huì)處理好絕對(duì)天數(shù)差。真正要注意的是時(shí)區(qū)問(wèn)題。如果日志里的登錄時(shí)間是 UTC而業(yè)務(wù)期望的是北京時(shí)間那么直接 to_date 會(huì)使得部分用戶晚上登錄被算到前一天。比如 UTC 時(shí)間 1月1日16點(diǎn)北京時(shí)間已經(jīng)是1月2日0點(diǎn)但 to_date 后還是1月1日。這在計(jì)算連續(xù)登錄次數(shù)時(shí)會(huì)造成偏差。穩(wěn)妥的做法是在清洗層統(tǒng)一做時(shí)區(qū)轉(zhuǎn)換再 to_dateto_date(from_utc_timestamp(login_datetime, GMT8)) AS login_date具體時(shí)區(qū)名要按集群支持情況調(diào)整。如果你們公司日志埋點(diǎn)本身就統(tǒng)一用東八區(qū)那就不存在這個(gè)問(wèn)題但建議每個(gè)項(xiàng)目都確認(rèn)一次別想當(dāng)然。4. 核心方法二斷連后重新編號(hào)連續(xù)序號(hào)4.1 業(yè)務(wù)場(chǎng)景什么叫連續(xù)序號(hào)“連續(xù)序號(hào)”本質(zhì)是給用戶每一段連續(xù)登錄區(qū)間內(nèi)部的行從1、2、3……依次編號(hào)一旦登錄日期斷開(kāi)則重新從1開(kāi)始。也就是user_id login_date seq A 2025-01-01 1 A 2025-01-02 2 A 2025-01-03 3 A 2025-01-05 1 A 2025-01-06 2這個(gè)序號(hào)在很多場(chǎng)景下有用比如判斷用戶是否連續(xù)登錄第7天直接取 seq7 的記錄統(tǒng)計(jì)用戶有多少次連續(xù)3天以上的活躍期可以先按 seq 判斷生成“連續(xù)簽到獎(jiǎng)勵(lì)”報(bào)表比如第幾段連續(xù)簽到的第幾天。如果讓排序字段直接 ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date)得到的將是全量序號(hào) 1、2、3、4、5而不是在斷點(diǎn)重置的序號(hào)。所以必須先對(duì)連續(xù)區(qū)間分組再在每組內(nèi)做編號(hào)。4.2 實(shí)現(xiàn)思路先分組再編號(hào)分組的方法和上一節(jié)完全一樣先用 LAG 判斷斷點(diǎn)再用 SUM(0/1) 累加成 group_id。之后組內(nèi)排序編號(hào)就非常簡(jiǎn)單ROW_NUMBER() OVER (PARTITION BY user_id, group_id ORDER BY login_date) AS seq注意這里 PARTITION BY 是 user_id 和 group_id 兩個(gè)字段的組合。group_id 在同一個(gè)用戶內(nèi)不同連續(xù)區(qū)間取值不同所以可以準(zhǔn)確地把每一段連續(xù)區(qū)間分出來(lái)。4.3 完整 SQL連續(xù)序號(hào)生成WITH login_dedup AS ( SELECT user_id, to_date(login_datetime) AS login_date FROM login_log GROUP BY user_id, to_date(login_datetime) ), login_with_flag AS ( SELECT user_id, login_date, CASE WHEN LAG(login_date) OVER (PARTITION BY user_id ORDER BY login_date) IS NULL THEN 1 WHEN datediff(login_date, LAG(login_date) OVER (PARTITION BY user_id ORDER BY login_date)) 1 THEN 0 ELSE 1 END AS is_new_start FROM login_dedup ), login_with_group AS ( SELECT user_id, login_date, SUM(is_new_start) OVER (PARTITION BY user_id ORDER BY login_date) AS group_id FROM login_with_flag ) SELECT user_id, login_date, ROW_NUMBER() OVER (PARTITION BY user_id, group_id ORDER BY login_date) AS seq FROM login_with_group ORDER BY user_id, login_date;這段 SQL 把1月1日、1月2日、1月3日編為1、2、31月5日因?yàn)閿帱c(diǎn)形成新組所以重新從1開(kāi)始。實(shí)際運(yùn)行結(jié)果和預(yù)期完全一致。4.4 小心重復(fù)日期導(dǎo)致的組內(nèi)編號(hào)錯(cuò)亂上面已經(jīng)做了 user_id login_date 去重所以不會(huì)出現(xiàn)同一天多條記錄。但如果去重沒(méi)做同一登錄日期會(huì)出現(xiàn)多條相同日期記錄組內(nèi) ROW_NUMBER 會(huì)給他們編出 1、2、3看起來(lái)就像連續(xù)多天其實(shí)是誤報(bào)。還有一個(gè)隱蔽細(xì)節(jié)如果登錄時(shí)間字段是帶時(shí)分秒的直接用 to_date 后再去重是對(duì)的但如果你用的是原始時(shí)間戳字段去做 LAG 比較比如直接 LAG(login_datetime)則同一天的兩次登錄會(huì)因?yàn)闀r(shí)間不同而判定為斷點(diǎn)導(dǎo)致連續(xù)區(qū)間被錯(cuò)誤切分。所以全程必須使用 date 類型的字段同一標(biāo)準(zhǔn)從一而終。5. 兩個(gè)需求合體同時(shí)輸出最大連續(xù)天數(shù)和斷連序號(hào)5.1 一條 SQL 搞定兩個(gè)指標(biāo)的建模邏輯實(shí)際業(yè)務(wù)中經(jīng)常需要同時(shí)輸出兩種信息一個(gè)是每個(gè)人最大的連續(xù)登錄天數(shù)一個(gè)是每次登錄對(duì)應(yīng)的第幾天序號(hào)。這兩個(gè)需求的前半部分完全一致都是“去重 → 打斷點(diǎn)標(biāo)記 → 生成 group_id”。我強(qiáng)烈建議不要寫兩遍重復(fù)代碼而是把公共部分放在 WITH 子句里一步到位。這也是 Hive 開(kāi)發(fā)中非常重要的習(xí)慣先做一個(gè)高質(zhì)量的明細(xì)模型再?gòu)拿骷?xì)模型派生不同的聚合結(jié)果。用代碼來(lái)表達(dá)就是公共部分得到 user_id、login_date、group_id基于公共部分用 ROW_NUMBER 生成組內(nèi)序號(hào)基于公共部分按 user_id、group_id 聚合求 COUNT 得到每段連續(xù)天數(shù)再按 user_id 聚合取 MAX 得到最大連續(xù)天數(shù)。如果希望最后一張表既包含明細(xì)又包含每人最大連續(xù)天數(shù)一種簡(jiǎn)單做法是先把明細(xì)和聚合算好再做 JOIN。下面給出完整的合體 SQL。5.2 完整合體 SQL可直接復(fù)制WITH login_dedup AS ( SELECT user_id, to_date(login_datetime) AS login_date FROM login_log GROUP BY user_id, to_date(login_datetime) ), login_with_group AS ( SELECT user_id, login_date, SUM(CASE WHEN LAG(login_date) OVER (PARTITION BY user_id ORDER BY login_date) IS NULL OR datediff( login_date, LAG(login_date) OVER (PARTITION BY user_id ORDER BY login_date) ) 1 THEN 1 ELSE 0 END) OVER (PARTITION BY user_id ORDER BY login_date) AS group_id FROM login_dedup ), login_detail_with_seq AS ( SELECT user_id, login_date, group_id, ROW_NUMBER() OVER (PARTITION BY user_id, group_id ORDER BY login_date) AS seq FROM login_with_group ), login_duration AS ( SELECT user_id, group_id, COUNT(*) AS continuous_days FROM login_with_group GROUP BY user_id, group_id ), user_max_duration AS ( SELECT user_id, MAX(continuous_days) AS max_continuous_days FROM login_duration GROUP BY user_id ) SELECT d.user_id, d.login_date, d.group_id, d.seq, m.max_continuous_days FROM login_detail_with_seq d JOIN user_max_duration m ON d.user_id m.user_id ORDER BY d.user_id, d.login_date;輸出結(jié)果示例user_id login_date group_id seq max_continuous_days A 2025-01-01 1 1 3 A 2025-01-02 1 2 3 A 2025-01-03 1 3 3 A 2025-01-05 2 1 3 A 2025-01-06 2 2 3這樣用戶在明細(xì)每一行都能看到“我現(xiàn)在第幾天”也能看到“歷史最多連續(xù)幾天”對(duì)后續(xù)報(bào)表分析非常友好。5.3 性能優(yōu)化減少重復(fù) LAG 計(jì)算上面的 SQL 在 login_with_group 子句里CASE 中調(diào)用了兩次 LAG。雖然邏輯上不報(bào)錯(cuò)但 Hive 執(zhí)行時(shí)會(huì)對(duì)每一行計(jì)算兩次 LAG生產(chǎn)環(huán)境大表下不夠優(yōu)雅。更穩(wěn)妥的做法是先用 LAG 把上一行日期計(jì)算出來(lái)再做判斷l(xiāng)ogin_with_prev AS ( SELECT user_id, login_date, LAG(login_date) OVER (PARTITION BY user_id ORDER BY login_date) AS prev_date FROM login_dedup ), login_with_group AS ( SELECT user_id, login_date, SUM(CASE WHEN prev_date IS NULL OR datediff(login_date, prev_date) 1 THEN 1 ELSE 0 END) OVER (PARTITION BY user_id ORDER BY login_date) AS group_id FROM login_with_prev )這個(gè)寫法更清晰每行計(jì)算一次 LAG整體性能更好。我第一次寫的時(shí)候直接套復(fù)雜 CASE數(shù)據(jù)量500萬(wàn)行跑了很久改成上面的寫法之后快了一倍多。后來(lái)排查發(fā)現(xiàn)有些引擎對(duì)重復(fù)開(kāi)窗函數(shù)識(shí)別不全確實(shí)會(huì)真實(shí)計(jì)算兩次。6. 常用陷阱與真實(shí)排查記錄6.1 表里存在未來(lái)時(shí)間戳導(dǎo)致連續(xù)天數(shù)虛高有次遇到一個(gè)項(xiàng)目某用戶的最大連續(xù)登錄天數(shù)突然從15天跳到了40天直覺(jué)上不對(duì)勁。查數(shù)據(jù)后發(fā)現(xiàn)該用戶有幾條登錄時(shí)間來(lái)自用戶本地設(shè)備時(shí)間改過(guò)系統(tǒng)時(shí)間后產(chǎn)生了未來(lái)時(shí)間戳。這類數(shù)據(jù)如果不加過(guò)濾會(huì)把未來(lái)日期也算進(jìn)登錄序列導(dǎo)致連續(xù)天數(shù)被錯(cuò)誤拉長(zhǎng)。解決方案很簡(jiǎn)單在清洗層增加過(guò)濾條件保留登錄日期小于等于當(dāng)前日期或業(yè)務(wù)允許的最大日期。WHERE to_date(login_datetime) current_date()如果是離線數(shù)倉(cāng)因?yàn)榕芘醒舆t也可以統(tǒng)一對(duì)時(shí)間做上限控制。這一條原本不在需求里但實(shí)際開(kāi)發(fā)中必須考慮臟數(shù)據(jù)對(duì)連續(xù)計(jì)算的影響。6.2 用戶在多設(shè)備登錄導(dǎo)致同一天多次記錄很多業(yè)務(wù)場(chǎng)景是一個(gè)賬號(hào)綁定多個(gè)設(shè)備一天內(nèi)可能在手機(jī)、平板、電腦上都有登錄事件。如果不做去重直接計(jì)算會(huì)得出user_id login_dt A 2025-01-01 A 2025-01-01 A 2025-01-01然后按 login_date 排序這里因?yàn)橛腥龡l同日期記錄LAG 判斷 datediff 為0因?yàn)椴坏扔?所以第二個(gè)和第三個(gè)都被標(biāo)記為新組起點(diǎn)得出用戶有三次“1天連續(xù)登錄”的假象。正確去重方式SELECT user_id, MAX(login_date) AS login_date FROM ... GROUP BY user_id, login_date;這里用 MAX 是為了兼容可能有空值的情況其實(shí)DISTINCT 就足夠。我在實(shí)際中發(fā)現(xiàn) DISTINCT 在 Hive 某些版本對(duì)大量字段會(huì)有 shuffle 性能問(wèn)題但只針對(duì)兩三個(gè)字段沒(méi)毛病。6.3 斷點(diǎn)標(biāo)記中的 NULL 陷阱很多人在寫斷點(diǎn)判斷時(shí)只判斷 datediff 是否等于1忽略了第一行的前一日期是 NULL。如果寫成CASE WHEN datediff(login_date, LAG(login_date) OVER (...)) 1 THEN 0 ELSE 1 END第一行因?yàn)?datediff 結(jié)果為 NULL判斷結(jié)果為 NULL走到 ELSE 得到1恰恰也是正確結(jié)果。所以這個(gè)寫法在實(shí)際運(yùn)行中是對(duì)的。但為了可讀性我還是建議在 NULL 判斷上明確寫出來(lái)避免后續(xù)維護(hù)的人閱讀困難CASE WHEN LAG(login_date) OVER (...) IS NULL THEN 1 WHEN datediff(login_date, LAG(login_date) OVER (...)) 1 THEN 0 ELSE 1 END6.4 大表下開(kāi)窗排序帶來(lái)的數(shù)據(jù)傾斜PARTITION BY user_id 時(shí)會(huì)按用戶分桶如果少數(shù)超級(jí)用戶登錄記錄特別多會(huì)導(dǎo)致單個(gè) reducer 處理量過(guò)大形成數(shù)據(jù)傾斜。常用優(yōu)化手段有三個(gè)設(shè)置 hive.optimize.sort.dynamic.partition 等參數(shù)但有時(shí)效果有限按用戶維度判斷是否為大用戶單獨(dú)分桶處理再 union 回主流程在清洗層把明顯異常的超高頻用戶比如機(jī)器人賬號(hào)過(guò)濾掉或者按業(yè)務(wù)口徑剔除以秒級(jí)頻率登錄的異常數(shù)據(jù)。如果只是離線報(bào)表且數(shù)據(jù)量在億級(jí)以內(nèi)通常并行度調(diào)一下就能解決問(wèn)題。我遇到實(shí)際傾斜時(shí)會(huì)用以下參數(shù)先試試SET hive.exec.reducers.bytes.per.reducer256000000; SET hive.exec.paralleltrue;不過(guò)每個(gè)集群版本不一樣參數(shù)名可能會(huì)有差異要根據(jù)實(shí)際環(huán)境確認(rèn)。6.5 對(duì)連續(xù)天數(shù)的“自然日”定義要保持一致業(yè)務(wù)上“連續(xù)登錄7天”是不是一定要7個(gè)自然日有些產(chǎn)品的連續(xù)簽到規(guī)則是“任意7天內(nèi)有登錄即算連續(xù)”這種口徑就不能用上面的方法需要改成滾動(dòng)窗口統(tǒng)計(jì)。例如用SUM(1) OVER (PARTITION BY user_id ORDER BY login_date RANGE BETWEEN INTERVAL 6 DAYS PRECEDING AND CURRENT ROW)或者先展開(kāi)日期再計(jì)算。實(shí)際中業(yè)務(wù)方說(shuō)“連續(xù)”通常默認(rèn)自然日連續(xù)但你要主動(dòng)確認(rèn)一次。我吃過(guò)虧開(kāi)發(fā)完后業(yè)務(wù)說(shuō)他們想要的是“任意7天內(nèi)登錄過(guò)5天”完全不是一個(gè)東西返工成本很高。7. 從志經(jīng)驗(yàn)談什么時(shí)候用 SQL 什么時(shí)候用腳本7.1 SQL 方案的優(yōu)缺點(diǎn)這套用 Hive SQL 實(shí)現(xiàn)的方案優(yōu)點(diǎn)是純 SQL、好維護(hù)、跑批穩(wěn)定不依賴外部 Python 或代碼環(huán)境數(shù)據(jù)量大時(shí)只要調(diào)參數(shù)能扛住。缺點(diǎn)在于如果業(yè)務(wù)很復(fù)雜比如需要判斷自然日還是活躍日、需要排除指定節(jié)假日、需要每個(gè)用戶有自定義起始周期SQL 表達(dá)起來(lái)會(huì)比較繞。這時(shí)用 Python、Scala 或者 Spark RDD 也可以實(shí)現(xiàn)但不一定更快。7.2 讓臨時(shí)表變成數(shù)倉(cāng)模型我在實(shí)際項(xiàng)目中一般情況下不會(huì)讓業(yè)務(wù)查詢直接訪問(wèn)原始登錄日志。要先構(gòu)建一個(gè)“用戶登錄密集模型”包含 user_id、login_date、group_id、seq、max_continuous_days 字段落在 Hive 表中后續(xù)所有報(bào)表都查詢這張表。這樣處理有幾個(gè)好處計(jì)算一次多處復(fù)用原始日志變化時(shí)只需要刷新這張表下游各種報(bào)表不需要重復(fù)計(jì)算同樣的分組邏輯。建表語(yǔ)句簡(jiǎn)單示意CREATE TABLE dws_user_login_continuous ( user_id STRING COMMENT 用戶ID, login_date STRING COMMENT 登錄日期, group_id BIGINT COMMENT 連續(xù)區(qū)間分組ID, seq BIGINT COMMENT 連續(xù)區(qū)間內(nèi)序號(hào), max_continuous_days BIGINT COMMENT 歷史最大連續(xù)登錄天數(shù) ) COMMENT 用戶登錄連續(xù)明細(xì)表 PARTITIONED BY (dt STRING COMMENT 數(shù)據(jù)分區(qū)日期) STORED AS ORC;寫入時(shí)把上面的合體 SQL 結(jié)果 insert overwrite 到表中即可。注意分區(qū)字段 dt 與 login_date 不要混淆一個(gè)是數(shù)據(jù)加工日期一個(gè)是業(yè)務(wù)登錄日期。7.3 連續(xù)問(wèn)題的一招通吃日期減去行號(hào)除了 LAG SUM(標(biāo)記) 的方法還有一種非常經(jīng)典的方法用日期減去所在組內(nèi)的行號(hào)得到一個(gè)穩(wěn)定的日期基準(zhǔn)這個(gè)基準(zhǔn)相同則屬于同一連續(xù)區(qū)間。寫成 SQL 就是SELECT user_id, login_date, date_sub(login_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date)) AS group_date FROM login_dedup;舉例說(shuō)明連續(xù)登錄三天行號(hào)分別是1、2、3日期分別是 2025-01-01、2025-01-02、2025-01-03那么 date_sub 后得到 2024-12-31、2024-12-31、2024-12-31完全相等。而斷掉后再出現(xiàn)的 2025-01-05行號(hào)是4date_sub 得到 2025-01-01和前一段的 2024-12-31 不同于是分到不同組。這個(gè)方法實(shí)現(xiàn)起來(lái)代碼更短WITH login_dedup AS ( SELECT user_id, to_date(login_datetime) AS login_date FROM login_log GROUP BY user_id, to_date(login_datetime) ), login_with_gap AS ( SELECT user_id, login_date, date_sub(login_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date)) AS group_date FROM login_dedup ) SELECT user_id, login_date, ROW_NUMBER() OVER (PARTITION BY user_id, group_date ORDER BY login_date) AS seq FROM login_with_gap;這個(gè)方法被稱為“差值和行號(hào)法”比 LAG 判斷少一個(gè)開(kāi)窗計(jì)算性能通常更好。但有一個(gè)前提條件登錄日期必須是嚴(yán)格連續(xù)且沒(méi)有重復(fù)的日期值。只要已經(jīng)做了去重完全可行。我個(gè)人更喜歡先用 LAG 法因?yàn)楦菀桌斫獗阌趧e人接手但差值和行號(hào)法在某些大表場(chǎng)景下更快值得掌握。8. 實(shí)操場(chǎng)景擴(kuò)展不只是登錄天數(shù)8.1 統(tǒng)計(jì)商家連續(xù)營(yíng)業(yè)天數(shù)電商平臺(tái)經(jīng)常要分析商家是不是“僵尸店”或者評(píng)選“金牌店鋪”其中就有連續(xù)營(yíng)業(yè)天數(shù)指標(biāo)。和用戶登錄基本一樣只要把 user_id 換成 shop_idlogin_date 換成 business_date。業(yè)務(wù)上要考慮實(shí)體店可能會(huì)因?yàn)橐咔?、裝修停業(yè)這種斷點(diǎn)自然也會(huì)重新分段。8.2 計(jì)算用戶連續(xù)簽到獎(jiǎng)勵(lì)等級(jí)很多 App 有簽到活動(dòng)連續(xù)簽到7天給獎(jiǎng)勵(lì)。利用 seq 字段可以很輕松地篩出每個(gè)用戶當(dāng)前連續(xù)簽到的天數(shù)并判斷是否達(dá)到獎(jiǎng)勵(lì)條件SELECT user_id, MAX(seq) AS current_continuous_days FROM login_detail_with_seq WHERE login_date current_date() GROUP BY user_id;還可以進(jìn)一步統(tǒng)計(jì)每個(gè)用戶的連續(xù)簽到段數(shù)、每一段跨了多少天。這些指標(biāo)都可以基于上面已經(jīng)構(gòu)建好的模型完成。8.3 監(jiān)控?cái)?shù)據(jù)回補(bǔ)導(dǎo)致的歷史連續(xù)性重算數(shù)倉(cāng)里經(jīng)常有上游數(shù)據(jù)回補(bǔ)的情況比如某天的日志數(shù)據(jù)凌晨沒(méi)有到位第二天補(bǔ)了上來(lái)。如果模型表沒(méi)有做冪等處理重跑全量時(shí)會(huì)因?yàn)樾略龅臍v史日期導(dǎo)致 group_id 和 seq 變化。這種情況下建議模型表按全量覆蓋方式刷新或者給原始日志增加過(guò)濾條件避免重復(fù)接入。我在實(shí)際中試過(guò)增量更新連續(xù)模型邏輯非常容易出 bug最簡(jiǎn)單的就是每天重刷全量只要數(shù)據(jù)量可控這是最穩(wěn)的。9. 排障速查表遇到連續(xù)計(jì)算問(wèn)題對(duì)照查看癥狀可能原因解決辦法最大連續(xù)天數(shù)比實(shí)際多很多未按 user_id login_date 去重清洗層加 GROUP BY 或 DISTINCT序號(hào)從2開(kāi)始或中間亂跳分組標(biāo)記沒(méi)有正確生成檢查 LAG 是否取到上一日期斷點(diǎn)處序號(hào)沒(méi)有歸1group_id 沒(méi)有累加或用錯(cuò)分區(qū)字段確保 SUM(標(biāo)記) 的窗口按 user_id 排序跨年數(shù)據(jù)算斷日期字符串參與 datediff 時(shí)格式不對(duì)全部轉(zhuǎn)成 date 類型再計(jì)算同一天多條記錄導(dǎo)致連續(xù)天數(shù)虛高去重不徹底按 user_id、to_date 去重分組結(jié)果全一樣date_sub 差值法與 ROW_NUMBER 聯(lián)合使用時(shí)日期未被去重先 GROUP BY 后再執(zhí)行數(shù)據(jù)傾斜、運(yùn)行極慢個(gè)別用戶記錄過(guò)多調(diào)大 reducer 或?qū)Υ笥脩魡为?dú)處理連續(xù)天數(shù)與業(yè)務(wù)預(yù)期不符口徑不同自然日 vs 任意X天提前和業(yè)務(wù)確認(rèn)口徑這張表的每一條我都實(shí)際踩過(guò)或幫別人排查過(guò)建議收藏。它們比任何理論都更能節(jié)省你的時(shí)間。10. 最后一個(gè)實(shí)驗(yàn)性技巧用數(shù)組函數(shù)實(shí)現(xiàn)連續(xù)分組如果你所在的環(huán)境是 SparkSQL 3.0 以上還支持一些高版本的 Hive 函數(shù)比如 collect_list、sort_array??梢韵劝岩粋€(gè)用戶的所有登錄日期用 collect_list 收集成一個(gè)數(shù)組再遍歷數(shù)組判斷連續(xù)性。但這種方式在 Hive 上寫起代碼非常啰嗦要用 explode 再打散不同版本函數(shù)支持差異很大。我不建議常規(guī)場(chǎng)景用它只在某些特殊場(chǎng)景下比如已經(jīng)有一個(gè)用戶數(shù)組字段不希望多次 join 時(shí)才考慮。這里點(diǎn)到為止重點(diǎn)還是掌握上一節(jié) SQL 法。我在實(shí)際項(xiàng)目中逐步形成了一套自己的模板以后只要遇到“連續(xù) x 天”類需求直接復(fù)制改字段名。核心就是四個(gè)關(guān)鍵步驟去重登錄日期用 LAG 標(biāo)記斷點(diǎn)用 SUM 累加生成分組聚合取最大或組內(nèi)排號(hào)。這套流程已經(jīng)被我用到用戶活躍、店鋪營(yíng)業(yè)、事件觸發(fā)連續(xù)性等多個(gè)場(chǎng)景每次都很穩(wěn)。如果非要說(shuō)一點(diǎn)個(gè)人體會(huì)那就是千萬(wàn)不要一上來(lái)就寫復(fù)雜 SQL先把邏輯用筆畫出幾行樣例手動(dòng)推一遍分組結(jié)果再寫代碼。很多問(wèn)題在紙面上想清楚后代碼就是一步到位的翻譯而已。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
狠狠干妹子| 91免费看一区二区三区| 91色情黑丝搞鸡在线观看一区二区三区三州| 久久国产精品视频| 欧美情色男人的天堂| 日本操BAV| 亚洲国产欧美一区二区潘金莲| 香蕉国产97| 884t在线| 91久精品| 另类在线| 无码色| 亚洲欧美色图小说| 日本伦乱九九九综合| 97精品全部| 精品国产91久久久久久一区黄无| 九九久久久久久爱| 丁香六月婷婷| 久久久久9999| 精品超碰国产| 九九色热| 女色视频社区| 丁香五月综合| 99久久婷婷国产综合精品草原| 三级三级三级a级全黄三| 强奸乱伦免费网站| 久久精品午夜国产亚洲AV无码| 国产白丝网站| 国产精品乱码久久久久| 久草午夜| 一区二区三区美女超清| 欧美人与动性人交a| 亚洲色婷婷综合久久久久中文| 青草视频人妻在线观看| 欧美BT 亚洲色图| 超碰 国产熟女精品一区| 97少妇人妻中文字幕久久| 天天摸夜夜操视频| 91中出在线| 美女91网址| 亚洲第一页综合在线| 91老熟女91老女人| 伊人欧美大香蕉视频| 78m成人视线| 欧美日韩国产精品久久色婷婷| 超碰97久久国| 夜夜草我| 97精品熟女少妇一区 | 国产亚洲 中文欧美久久| 毛片电影一区二区三区| 黄页大片在线观看| 国产久久一区二区| 大色网久久| 91丝袜| 青娱乐啪啪视频| 91精品人| 中文字幕日本久久| 五月天黄色av| 色老久久| 亚洲天堂2020| 在线观看AV片| 熟女精品一区二区三区| 97色爱| 久日91在线| 伊人在线大香蕉视频久久| 日韩BBN| 欧美精品一二三| 欧美18老人禁| 成人熟女视频一区二区三区| AV色五月| 激情抓乳插进去啪啪啪日韩| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 99久久99久久综合| 99国产精品在线观看| 老汉网| 亚洲情色 自拍| 亚洲电影中字一区二区| 色婷婷九月| 亚洲熟妇丝袜在线观看| 网友自拍第1页| 美日韩男女操屄视频| 欧亚性爱啪啪| 97 超碰 人人做 人人爱| 亚洲双插| 亚洲成a人片在线观看中文!!!| 欧美一区二区三区日韩| 97精品视频网站| 国产熟女无套内射| 操我无码| 偷拍新久久| 色欲久久久久综合网| 国产麻豆福利av在线播放| 国产一区96在线| 色综合超碰超| 精品日韩中文在线| 搡老女人老妇女老妇老熟女怎么读| 精品成人女人久久| 自拍偷拍草一草| 超碰人人在线| 夜夜躁狠狠躁日日躁av| 婷婷成人五月天| 日欧毛片久久| 国产操逼视频在线观看| 中文字幕精品丝袜| 午夜性刺激视频免费观看| 青青草天天亲夜夜操网| 欧色网址| 五月丁香啪啪网| 欧美999999| 丝袜人妻av一区二区| 亚洲欧洲综合视频在线| 婷婷九月丁香| 韩国一区二区精品亚洲| 中文字幕99999| 九九伊人网| 日本一二三免费久久| 日本免费专区| 蜜桃传媒视频第一区入口在线看| 欧美日韩性爱视屏免费看了| 97国产精品久久久久| 亚洲男人久久综合天堂| se,,,亚洲欧美| 天天艹天天日| 亚洲性综合| 亚洲综合五月天婷婷丁香| www九九热| 日本 情色 1区2区3区| 成人性爱全视频观看| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 日韩人妻大香蕉| 亚洲精品国产拍免费91在线| 亚洲宅男天堂| 伊人一区二区在线播放| 91强在线播放| 国产超碰| 91久久久亚洲| 亚洲天天影视色综合| 超碰色97| 另类欧美色| 国产 热久久久久国产精品| 欧美色偷拍| 五月婷在线| 啊啊啊免费视频| 狠狠躁AV| 91动漫操逼视频| 四虎免费在线播放| 日本丝袜美腿人妻九九| 国产精品久久久久综合| 亚洲国产丝袜熟女av| 天天干天天日天天射黄色大片| 国产精品爱欲| 国内操逼视频二区| 99免费视频| 国产无码三级视频在线观看| 欧美精品,四区。五区| 探花熟女,姿勢到位,體驗感也到位| 久久是精品| 骚逼高潮久久精品| 中文字幕一区二区三区字幕| 超碰97人人乐| 偷窥自拍亚洲色图| 亚洲无码久久久久久久| 久久专区| …亚洲黄色厕厕女女在线播…| 九热大香蕉| 在线观看黄色电话| 人人干人人操人人爱| 日韩大香蕉精品在线视频| 殴美牲| 18禁中文字幕| 激情熟女12P| 人妻人久久精品中文字幕| 亚洲日本男人天堂网| 国产激情av女片自拍| 人妻性爱一区二区| 黄页| 免费精品AB| 婷婷五月天激情四射| 国产女人9999| 女人天堂网| 熟女欧美日韩综合婷婷| 国语人妻精彩刺激| 香蕉久久国产AV一区二区| 777AV电影| 人妻一区二区三区熟女| 99热在线只有精品| 新怡红院| 亚洲毛片基地专区| 亚洲日韩天堂| 天天做天天爱夜夜爽毛片试看| 暴力av在线| 99国产精品久久久在线播放| 一区,二区,三区网站| 婷婷六月色| 国产麻豆一级精品视频| 一级免费啪啪片| 成人5码视频| 成人亚欧免费视频| 国产AV激情无码久久无码| 丁香五六月啪啪| 在线97视频| 2017天天拍大香蕉| 精品人妻一区二区免费蜜桃视频| 超碰97亚洲| 97鸡把在线视频| 国产白丝网站| 亚洲人妻中文在线视频| 日韩精品免费高清视频在线| 中文字幕狠狠玩| 中文字幕精品日韩中文字幕| 首页中文字幕中文字幕免费| 操91| 亚洲春色激情小说| 精品国模无码| A片A5445444| AV一起草在线| 亚洲AV无码国产精品久久久久| 一区二区三区成人高清视频| 欧美婷婷五月天| 91一起操| 蜜臀久久99精品久久久久久久久| 九九九九88| 加勒比AV网| 福利在线视频一区二区| 久久黄黄黄| 九九九久久久| 亚洲精品毛片在线观看| 日韩国产中文字幕| 亚洲色堂免费视频| 欧美色图 人妻| 天天日天天干天天摸天天操| 日韩免费在线观看不卡| 精品偷拍13p欧美dodk视频| 九月丁香综合网| 九月丁香婷婷| 色婷婷成人综合| 色婷婷一区二区三区久久午夜| 丰满欧美放荡少妇在线| 亚洲影视综合| 波多野结衣先锋影音| 色丁香五月婷婷| 亚洲中文字幕妇伦久久| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 91红杏| 97精品在线| 啊啊啊啊啊在线| 成人免费看吃奶视频网站| 欧美第一页| 99999国产| 久久天天艹| 午夜人妻精品综合在线| 久久综合久色欧美综合狠狠 | 久热婷婷| 97精品久久久久中文字幕| 亚洲天堂一二| 青青伊人这里只有精品| 极品色社| 中文字幕1区2区| 玖玖爱在线视频免费观看| 黄片aaaaa一区| 青娱乐av在线| 清纯唯美亚洲另类| 日韩中文字幕人妻视频| 亚洲国产欧美日韩人妻日中文| 欧美91久久久久| 欧美色网| 色999人与兽| 亚欧操逼片在线观看 | · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 啪啪啪精品视频| 亚洲欧美爆| 亚洲a色| 免费伦费视频在线观看| 超硑97精品| 91天天综合网| 九九热免费国产视频婷婷伊人五月 | 综合欧美日韩在线观看| 夜夜嗨av午夜成人| 精品无码久久久久久久久果冻糖心| 中文字幕免费看大片| 欧美中字二区| 国产一进一出视频网站| 中文字幕十五区| 国产毛片毛片4p懂色| 99精品无码| 亚洲狠狠入| 人妻乱仑一区二区三区| 自拍第一页| 欧美视频一区二区在线| 欧美在线视频观看一二三四区高清| 亚洲无992tv| 少妇免费视频| 92性色国产午夜福利在线661| 色噜噜人妻av 中文字幕| 日韩无限资源| 偷窥自拍亚洲色图| www.久久制服糖| 蜜桃视频一区二区三区在线观看| 青春草莓视频在线观看网址| 日韩人妻精品中文字幕| 欧美aaaaaaa| 久久久久921| 亚洲制服欧美另类内射| 免费视频一二三区| 丁香婷婷激情五月天无毒不卡 | 人人爱操| 亚洲色图欧美一区二区不卡| 熟妇精品juliaannAV| 日韩中文字幕精品一区在线| 另类图片五月天| 色五月综合| 色妺妺AⅤ| 麻豆区99999| 狠狠中文字幕| 久草电影网| 久久麻豆一区二区| 国产精品嫩草久久久久| 欧美熟女逼久久久久久| 五月激情小说| 亚洲精品一二区| 热热色综合网| 日韩pv中文| 欧美亚洲第一页| 性感美女啊啊啊在线| 26uuu欧美| 国产欧美在线观看免费观看| 精品女同一区| 美女高潮视频91| 人妻中文字幕日韩电影| 99热| 九九九九九九免费视频| 国产精品久久久久久夜夜夜| 九九色逼| 黄页视频网站野外| 91国产操逼视频| 爱丝福利| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 日韩精品在线视频,日韩精品……| 裸模AV女优| 性爱精品一区| 国产91av在线播放| 啊啊啊爽爽| 天天舔天天日天天射| 九久9精品| 国产黄色视频久久| 狼人狠干| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 嗯嗯啊啊操死我| 手机在线观看不卡无码av| 91色交| 天天欧美97| 国产精品色哟哟| 色婷婷亚洲婷婷| 久草视频在线视频在线视频在线观看| 人人干人人操人人爱| yazhououmeizongya| 九九拍拍精品视频在线播放| 亚洲欧洲小说图片视频 | 亚洲综合一| 宅男午夜在线视频| 久久天天摸| 亚洲成人久久美女| 丁香婷婷啪啪| 久久久久国产精品片区无码直播| 成人免费毛片| 日本潮催一卡操| 国产深夜福利| 久久久9999| 传媒在线观看一区二区三区| 尤物视频偷拍免费| 操曰本熟女| 粉嫩小泬久久久一区二区| 一区二区久久天天干狠狠| 91日韩在线| 免费操逼视频下载| 亚洲乱码尤物193YW| 正在播放国产精品一区| A级毛片在线看免费| 欧美乱伦专区| 亚洲无码 国产无码| 五十路熟女人妻一区二区在线观看| 青青草原香蕉日本Ap| 欧美日韩国产色五月综合在线| 欧美97视频| 黄色十八禁网站| 国产精品高潮久久AV| 蜜臀AV一区二区三区激情综合| 无码99| 日本女厕偷拍| 97日视频| 天天热精品| 亚洲在线A| 亚欧美综合| 91女日逼| 青娱乐淫乱1314| 日本韩国国产精品一区| 91社操逼| 欧美1727免费观看视频| 91久久伊人婷婷青青草| 69丨亚洲丨精品丨入口免费播放| 国产吹潮女在线观看| 天天爽入口| 欧美高清色| 乱伦熟女专区| 国产精品成人无码av| 99爱在线视频| 少妇一区二区三区在线观看| 欧美在线色| 日韩91网| 欧美欧美啪啪视频| 天堂中文日本在线观看| 中文字幕 人妻不满 在线视频| 美国美女AV在线| 人人搡人人肉久久精品| 亚洲中文字幕久久无码精品| 精品福利| 亚洲激情在线一区二区| 91欧美长吊| 久久精品高清无码一区| 九九九久久久| 亚洲精品人妻吞精av| 亚洲国男人的天堂| 学生妹天天看| 在线a亚洲视频播放在线| 日韩精品中文字幕一| 九九成人视频| 东京热大香焦| 丁香五六月啪啪| 免費黃色視頻觀看一| 国产13区| 97中文热色| 国产最新小视频在线播放下载| 99久在线精品99re8| 色九九九九| 春色综合网| 国模艳艳啪啪一区| 丝袜综合| 天天躁日日躁狠狠躁| 影音先锋中文字幕日本好一区二区| 日本美女性生活久久久久久久| 长久操视频| 国产综合日韩伦理| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 综合影院永久入口国产| 久久婷婷五月综合| 天堂精品一区| 无码精品久久久天天影视 | 欧美大波激情xxxx| 禁止观看美女黄| 欧美综合综合| 91精品国产麻豆国产自产在| 成人久久久精品| 国产女s强制榨精视频| 久久超碰久| 青草伊人网| www黄片免费看com| 操淫穴亚洲五月丁香| 色网站导航大全| 五月花婷婷| 麻豆色99999| 亚洲二区精品在线观看| 亚洲drav色图| 伊人激情五月天一区二区| 屌妞视频久久久久久久久久久久| 国产精品一区二区久久精品| 一区中文字幕二区日韩| 级做a爱无码性色永久免费| 搡老女人老妇女老妇老熟女怎么读| 日天天九九天堂666| 九九无码视频| 日韩99999| 思思热在线观看| 伊香蕉综合久久久久久久噜噜噜 | 亚洲性综合11| 久热99| 五十路三区在线| 伊人网av| 在线播放成人高清免费视频| 97超视频在线观看| 狠狠爱综合| 亚洲a色| 久草成人福利导航| 亚洲中字幕日本一区二区三区| 大香樵伊人网| 操逼视频国产无套| 粉嫩久久久久| 99久久九九| 亚洲丝袜诱惑| 清清草影| 1024日韩| 亚洲成人黄色在线观看| 久久精品视| 91久久久久久久久18| 野狼福利社区| 亚洲欧洲色情高清| 国产免费永久精品无码| 一区二区中文| 久久九操在线观看| 天堂九九九九九九九九九| 人妻偷拍一区二区三区| 中文字幕二区| 久久久一区二区三区四区五区| 97视频在线免费看| 嗯啊抽插大香蕉网页| 久久国产精品视频| 精彩视频日韩| 天天干人妇| 精品无码久久久久久久久果冻糖心 | 蜜臀AV一区二区三区| 97色欧州| www.久久爱| 精品国产无码中文| 超碰人妻97| 亚洲欧美日产国产91毛片| 激情五月婷| 国产美女裸体秘 永久无遮挡| 色九九久九九| 色综合99999| 久久精精区一区二区一蜜桃一区二区| 波多野42部无码喷潮在线观看| 蜜臀久久99精品久久久久电影| 欧美在线伊人色| 日韩一级片在线看| 欧美A片中文字幕| 97chaopengongkai| 亚洲精品黑丝| 99re69| 天天影视网综合少妇| 免费伦费视频在线观看| 青娱乐老司机视频| 久久久96| 黄页av| 偷窥自拍亚洲| 日日嗷| 亚州熟妇精品| 大香蕉宅男伊人| 国产欧美美女免费观看视频| 激情99| 曰韩无码777| 美中日韩无码| 国产精品动态一区二区三区四四| 精品成人av一区二区三区在线| 亚洲性综合11| 97青青操视频| 亚洲高清无码免费观看视频| 久久成人东京热人妻| 国产精品国产自产拍高清AV| 网页导航五月天免费一二三区| 亚洲三级网址久久最新| 熟妇女伦乱视频| 久久亚洲AV无码专区首页| 亚洲啪啪性视频| 夜夜狼人妻| 亚洲自拍欧美国产首页网曝| 丝袜性亚洲| 亚洲最新Av| 草b在线 | 蜜臀久久99精品久久久老,,| 久九干| 天天拍天| 欧美视频一| 天天综合精品| 本道在线| 日本一区二区成人在线| 丝袜美腿欧美| 欧美一区二区| 色牛牛AV| 久久久精品九| 玖玖玖玖精品国产剧情| 色超碰综合| 涩综合导航| 欧美大香蕉97| 伊人网免费视频| 欧美日韩人人精品| 亚洲天堂男人天堂| 色九九九九久| 屁股久久久久久久久久| 九九99久久| 人妻少妇精品| 日韩97超碰中文字幕| 久久男人天堂| 67914在线精品观看| 男人天堂网站| 久久偷拍人| 中日亚韩免费视频| 中文子幕一二三| 伊人久久婷婷| 97免费在线| 日本久久综合| av网站国产主播在线| 亚洲综合欧美| 色色色色网站| 亚洲欧美色综合| 亚洲自拍欧美色综合| 色五月激情综合网| a天堂视频| 色97欧美| 日本精品性生活久久久| 26UUU欧美日本| 1204金沙人妻懂旧版免费| 屁股久久久久久| 思思热国产高清| 五月大香蕉| 丁香五月性| 欧美日日夜夜| 97这里只精品| 91大神精品长腿在线观看网站| 久久9免费视频| 丝袜剧情| 亚洲欧美国产中文视频| 欧美一区二区三熟女剧情| 操穴国产| 99热这里只有精品8| 日韩人妻有码免费视频| 变态综合色| 久久一本大香蕉| 久久久久精| 九九色精品| 思思热影视| 最近2018中文字幕在线高清第一页| 亚洲欧美变态| 蜜臀在线看片| av东京热男人的天堂| 青青操少妇| 91黑丝少妇| 精品国产一区二区久久| 日韩欧美视频青青| 久久99综合| 欧美性爱五月天| 亚洲欧洲国产综合av| 欧美极度丰满熟妇hd| 大香蕉专区| 久久精品国产亚洲AV片多多| 神马久久久久久伦理片| 伊人久久大香线蕉无码| 1024人妻熟女一区二区三区| www.99中文字幕| 国产精品女久久久久av爽| 日韩中文字幕人妻视频| 操逼不卡中文字幕| 人妻熟女av国产网站| 草久久久| 99热在线观看| 黑人天8A∨高清网站| 色香色欲天天综合网天天来吧| av2014 日韩在线中文字幕| 日韩激情毛片一级久久久| 3P乱轮视频| 五月天综合在线| 精品妇女一区二区三区| 欧美性五月| 日本视频一区二区三区| 精品中文字幕一区二区| 78久久久| 很黄很色的视频在线观看| 日本天天干天天搞一区| 免费又黄又裸乳的视频| 2019午夜福利视频| 国产三级日产三级韩国三级| 亚洲女人毛茸茸91| 婷婷操逼| 麻豆久久一区二区三区| 亚洲男人的天堂V| 亚洲国产精品成人综合| 久久精品视频在线观看| 国产精品麻豆视频网站| 干美女人妻| 天天舔天天| 四虎国产精品永久在线囯在线 | 干婷婷综合网| 中国91AV| 成人精品视频一区二区| 国产一进一出视频网站| 欧美亚洲清纯| 中文字幕在线观看第二页| 无码人妻精品一区二区三区99不卡 | 亚洲中文电影| 久久婷婷综合国际产色怕| 农村少妇久久久久久久| 91 国产丝袜在线放观看| 亚洲色图尤物视频| 中文字幕av一区二区三区人妻少妇| 久久九九99| 91一区二区三区蜜桃| 啊啊啊啊啊好舒服视频| 人妻激情偷乱视频一区二区三区| 强奸乱伦 亚洲一区| 欧美激情亚洲情色| 综合日本女人伊人| 嫩草一区二区在线观看| 69精品| 97在线资源| 天美AV片| 国产精选三级在线观看| 亚洲乱码精品一区二区| 97久久久久久久久久| 天天操天天射青青草| 精品国产乱码久久久久久口爆网站| 男人天堂东京热| 国产一区二区三区久久精品太古里| 色婷婷九月| 国产一进一出视频网站| 大香蕉78| 精品少妇一区二区| 亚洲性少妇| 艳美熟妇先锋一二三区| 欧美性爱另类综合| 激情抓乳插进去啪啪啪日韩| 蜜桃av色偷偷av老熟女| 天操天操夜操夜月月年年操操 | 久夜视频| 日本97久久| 美欧老女人97| 久久精品视频久久久| www.久久久久| 在线国产一区二区av| 国产精品区在线12p| 国产精品久久| 亚洲高清91| 91亚.色| 青青草久草AV| 狠狠2050在线观看| 久久久久久91香蕉国产| 亚洲美女精品| av中文字幕在线熟女| 日本久久天堂| 91GD.COM| 国产激情综合| 婷婷视频网| 亚洲国产欧美中日韩成人综合视频| a一区二区三区乱码在线| 精品国产三级av韩国在线| 久久人| 丝袜AV一区二区三区| 婷婷10月天青娱乐| 天美传媒精品久久视频| 亚洲少妇自拍中文字幕懂色| 941超碰| 干妹子| 骚货 中文字幕 av| 偷拍亚洲情色| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 久久综合资源一区二区| 亚洲熟女性高潮久久久| 国产精品麻豆视频网站| 成人亚欧免费视频| 爱av免费| 五月激情视频| 久久人妻丝袜一区二区三| 亚洲欧美精品一区天堂久久| 大香樵伊人网| 97精品一二区| 天天综合网入口~91| 素颜老阿姨乱情色| 久久久少妇诱惑精品视频| 精品少妇一区二区三区| 网友自拍第1页| 蜜桃狠狠色伊人亚洲综合网站| 久久久96| 日韩中文字幕精品一区在线| 午夜福利精品| 9久热| 欧美日韩夜夜| 九九热在线精品视频| 一区二区亚州激情久婷婷欧美| 后入式999| 97亚洲在线| 日韩成人精品| 天天插天天操| 久久精品视频久久久| 青青草大香蕉在线视频| 欧美综合在线第一页| 超碰九7| av网站在线观看了| 综合色播| 在线黄色污污网站| 久久久青青草| 亚洲一曲日韩精品| 五月天精品| 综合天天网| 精品九区| 国产无马视频| 操九九九九九九| 天天干1区2区在线| 性夜影院爽黄A爽免费动漫| 97人妻免费中文字幕| 2010男人的天堂| 大香蕉之青青草原| 亚洲综合电影| 黄片不用下载在线观看| 无码一区二区三区四区五区六区七区八区九区十区视频 | 亚洲精品国产AV天美传媒| 超碰综合97在线| 久久久久久99AV无码免费网站| 国产亚州精品美女久久久免费| 97久精品| 色狠狠一区二区三区香蕉| 日小BB小视频| 久操黄色视频| 久久久女人| 国产AV激情无码久久无码| 欧美熟爽综合| 怡红院久久老司机| 无码精品一区二区三区潘金莲| 嗯啊不要在线观看嗯啊| 欧美亚洲韩国视频十五区| 国产成人精品必看| 色性荡荡荡荡视频| 亚洲丝袜少妇在线| 久久人人爽人人爽人人片Ⅴ| 超碰碰激情97+久| 白丝一区| 亚洲影视综合网| 国产精品另类| 国产精品熟女丝袜一区二区| 人妻少妇精品久久久| 偷拍偷窥与盗摄视频专区| 天天日天天插| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 麻豆传媒一区二区在线观看| 欧美性爱第一页久久| 国语人妻精彩刺激| 欧美不在线| 丁香六月婷婷综合| 熟妇人妻精品一区二区| www久久99| 素人伊尹大香蕉免费下载视频| 欧美日韩在线国产在线| 啊啊啊啊啊啊啊啊啊啊在线观看| 精品久久无码午夜福利| 久久综合精品一区二区三区| 亚洲天堂精品日韩电影| 国内精品999| 一区二区三区视频| 天天淫人人妻日日色| 乱欲视频| 国产一区二区三区不卡手机在线| 欧美第一页| 按摩中文字幕| AV乱伦专区| 欧美白嫩女HD| 久久五十路熟女人妻| 亚洲日韩乱码中文无码蜜桃臀网站| 天天色,天天干,天天干| 色天欧美| 无码国产精品午夜不卡(| 超碰久久.com| 花野真衣| 国产福利电影| 亚洲天堂日本| 国产 v乱码一区二| 亚州欧美另类| 97资源制服丝袜| 99精品国产户外露出| 麻豆AV短剧| 国产不卡免费在线视频| 亚洲素人综合| 九九热免费视频| 亚洲国产另类在线中文| 淫骚熟女一区二区三区| 老司机射| 九九热三级片| 青青操在线亚洲视频观看欧美在线| 狠狠操官网| 天天综合站| 中文字幕黑人大片| 国产91av在线播放| 中文字幕第95页| 日韩有码免费视频| 国产又猛又粗又爽又黄| 国产后入清纯| 夜夜肏2021| 国产日韩在线播放av| 色欲久久99精品久久| 综合网欧美在线| 欧美国产欧美在线观看| 五月天日日操夜夜操| 成 人 影视 一区 二区 三区 四区| 最新日日夜夜天天干干| 亚洲亚洲亚洲天堂天堂| 艳美熟妇先锋一二三区| 日本性爱网址| 国产高清成人免费视频| 天天干夜夜肏| 中文字幕视频在线观看一区二区| 亚洲啪啪视频一区二区| 婷婷爽人人婷婷爽视频| 美女干逼2| 丰满欧美少妇| www色日本| 国产婷婷综合在线观看| 我爱操| 欧美 日韩 国产传媒| 日本精品第一视频在'| 一级性爱视频免费观看 | 俞拍久久国应视频| 国产欧美黑人丰满在线| 久久一区无码| 午夜大香蕉| 国产操逼逼网| 国产丝袜美女在线一区| av2014 日韩在线中文字幕| 久久九七| 一区二区三区 丝袜 高跟 美腿| 亚洲最新a在线观看| 人人操人人插 - 百度 - 百度| 婷婷8月天青娱乐| 综合91网| 精品小视频在线| 一区二区三区 丝袜 高跟 美腿| 92人人操人人| 免费亚洲黄色视频在线观看 | 欧美白嫩在线放| 久久秀这里有精品| 免费AV播放| 亚洲午夜福利视频| 国产高清无码一区三区二区| 大色综合| 国产97免费视频| yazhououmeizongya| 91色伦综合| 麻豆九九九| 欧美不卡在线美女| 99亚洲精品| 国产又爽又黄| 福利在线观看一区二区| 精品欧美А∨无码黑人大荫蒂| 国产在线播放成人免费| 伊香蕉综合久久久久久久噜噜噜| 久久精品男人的天堂| 欧美午夜视频| 97在线无精品 | 国产三级多多影院2022国产AA一级毛片无码 | 久久久久久久唑| 南澳成人一级片在线播放| 久久久精品视频欧州站| 久草在| 9长久久精品| 中文字幕日韩人妻视频一区二区三区交换夫妻| 国产日本熟女顶级一区二区三区视频 | 亚洲色图加勒比| 极品粉嫩一区二区| 97久久精品亚洲中六字幕| 亚洲 se图 欧美电影| 亚洲国产一级中文综合久久天堂在线免费观看| 夜夜爽爽爽| 蜜臀久久一区二区| 久久色一区| 亚州精品丝袜-不卡成人免费| 亚洲一二三精品久久网 | 国产精品一区二区久久精品| 精品国产Av无码久久久亚洲| 成 人 A V免费视频在线观看| 精品无码久久久久久久杏吧| 色综合国产在线观看| 超清福利精品视频在线| 人妻81p| 日本高清一区二区在线| 久操婷婷| 啪啪91| 91九九九小逼| 国产久久成人| 欧美日韩国产高清在线一二三区 | 亚洲精品中文字幕一区在线视频| 亚洲精品成人激情在线| 亚洲天堂男人在线| 欧亚第一综合网| 黄久在线| 精品亚洲天堂| 在线有码中文字幕| 亚洲aV性爱| 精品久久久久,69国产成人精| 91色爽欧美| 乱色老一区二区三区的观看方式| 99少妇| 最近2018中文字幕在线高清第一页| 国产av又色又爽又黄| 伊人99热| 欧美中文狠| 97久久超碰国产精品| 国产精品懂色tv影视免费观看| 秋霞久久亚洲精品成人| 日韩人妻少妇 一区二区三区| 青青草久久| 天天干人人看综合| 日本国产欧美高清在线| 久操B网| 日本熟妇自慰性高潮一区二区三区| 大香蕉欧美| 东亚亚洲无码高清| 久久精品视频久久久| 97少妇人妻中文字幕久久| 亚洲欧美国产va在线播放频| 秋霞欧美性爰视频| 丝袜综合| 九九九网站| 日韩性爱视频免费在线 | 日韩一性一交一A片俄罗斯 | 欧美一区二区日韩三区| 成人在线日韩| 久久99深爱久久99精品| 12一15性XXXX粉嫩国产| 亚洲精品视频在线播放| 福利天堂| 青青操网| 一区二区偷拍拍视频| 校园春色家庭伦理欧美激情| 亚洲精品一二牛牛| 色老汉玖玖爱| 中文字幕第二页| 探花熟女,姿勢到位,體驗感也到位| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 亚洲AV麻豆Aⅴ无码电影一| 久久五月综合| 夫妻AV网站| 日韩欧美中文| 亚洲综合九| 日本欧美韩国国产在线| 欧美亚综合色图| 玖玖爱影院| 夜夜爽爽爽| www.男人的天堂| 91狠狠色丁香婷婷综合久久| 欧美性Fer办公室秘书| 一区二区三区黄片免费观看| 超碰人妻久久人妻中文97| 欧美一区二区三区不卡高清视频| 狠狠操狠狠爱| 外国免费性情大片| 偷窥自拍亚洲天堂网爆| 久久9999| 免费精品福利在线观看| 色哟哟av| 欧美一级黄片免费播放| 97超碰国产亚洲精品| 色乱二区| 久草成人影片| 99re国产中文字幕| 欧美日综合| 国内外色色色色色成人视频| 久久久久女教师免费一区 | 天天久久久久久| 香蕉久久国产AV一区二区| 竹菊一区二区三区AV线| 国产97/欧美| 国产区91柔拿会所技师| 破处bbq| 日本中文字幕在线视频| 精品在线78| 日本有码久久| 日韩啊V| 日日夜夜噜| 午夜影美女日鸡鸡天天视频国产| 久久人体一区二区| 色综合色欲色综合色综合色综合| 青青草大香蕉视频| 精品四五区| 久久天天艹| 亚洲青青草| 狠狠操狠狠爱| 91久久久亚洲| 欧美久久久| 操一区| 日韩av无码网站| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 97超碰影音| 丝袜夫妻自拍| 人人艹亚洲| 99热这里只有精品1| 天美传媒av 在线| 俄罗斯一区二区视频在线观看| 午夜精品久久久久久久99| 五月色丁香| 综合av社区| 日本二区不卡| 男人的天堂成人的社区| 福利伊人玖玖国产| 天天干嫩逼网| 96免费视频在线| 精品成人av一区二区三区在线| 亚洲天堂久久久久久粉红视频| 亚洲揄拍网| 九九热精品| 成年人三级黄色片视频| 99热这里都是精品| 午夜福利区| 天天做天天爱| 亚洲精品国产专区在线观看| 亚洲av资源| 亚州日韩97| 插入综合网| 黄色一级视| 一本色道综合久久欧美| 蜜桃AV天堂| 密臀在线一区尤物| 欧美少妇色综合| 亚洲天堂中文字幕无码男同| 少妇一区二区三区高速| 友优传媒精品在线一区二区| 超碰98综合网| 日本三级韩三级99久久| 亚洲AV秘 精品久久老牛影视| 久操免费在线| 日韩特一级久久| 久久欧洲| ′ !γ}丶。。久久精品欧美一区二区三区| 精品午夜福利国产一区二区在线观看 | 亚洲天堂久久久久久粉红视频| 久久精品视| 色女99一级片在线观看| 九九久久精品| 日韩成人性爱电影在线播放| 女人与公拘交酡2020视频| 91性情| 欧美综合色| 东方亚洲在线操逼天堂| 欧美三级免费伊人| 性色一线| 色播丁香| 中文字幕诱惑制服人妻丝袜美丝袜美 | 国产精品露脸在线观看| 青青操在线视频| 日日干夜夜欢| 黄资源| 白丝jkav| 97硬碰| 激情露脸爱| 国产高清1234区| 黄色AV影视| 一二三区在线| 大香蕉人妻| 日本岛国黄色网址| 欧美刺激色黄片免费看| 亚洲图片欧洲图片aⅴ| av天堂天堂av日韩| 国产日韩欧美中文在线播放| 高清无码久操视频| 欧美精品精品一区二区| V A在线| 99久久99久久免费精品蜜臀| 久久色精品视频在线| 淫荡网址| 亚洲欧美另类激情小说| 超碰在线人人射| 91社区伊人| 亚洲精品一二牛牛| 日B操| 亚洲欧洲综合av在线| AV和黑人在线播放| 樱花蜜乳av| 日本一区二区三区四区免费观看| 亚洲精品xxx| 亚洲成人性爱在线观看| 一级性爱aaaa| www.色婷婷| 吻戏激情性巴克| yirendaxiangjiashipin| 国产精品亚洲四五区在线观看| 久久內射| 无毛精品|