欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,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)寫(xiě)了一些 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 寫(xiě)出來(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)寫(xiě)法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寫(xiě)法為 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 為什么寫(xiě) CASE 而不是直接 LAG 減 1有同學(xué)會(huì)問(wèn)既然 LAG 能拿到前一日日期能不能直接用一個(gè)字段標(biāo)記“是否連續(xù)”然后分組我給你一個(gè)反面示例-- 錯(cuò)誤寫(xiě)法示意 if(datediff(login_date, lag_date)1, group_id, group_id1)這樣寫(xiě)的問(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ù)不寫(xiě)的話默認(rèn)就是 NULL。這里我們故意不寫(xiě)因?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)烈建議不要寫(xiě)兩遍重復(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è)寫(xiě)法更清晰每行計(jì)算一次 LAG整體性能更好。我第一次寫(xiě)的時(shí)候直接套復(fù)雜 CASE數(shù)據(jù)量500萬(wàn)行跑了很久改成上面的寫(xiě)法之后快了一倍多。后來(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 陷阱很多人在寫(xiě)斷點(diǎn)判斷時(shí)只判斷 datediff 是否等于1忽略了第一行的前一日期是 NULL。如果寫(xiě)成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è)寫(xiě)法在實(shí)際運(yùn)行中是對(duì)的。但為了可讀性我還是建議在 NULL 判斷上明確寫(xiě)出來(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;寫(xiě)入時(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ū)間。寫(xiě)成 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)橐咔椤⒀b修停業(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 上寫(xiě)起代碼非常啰嗦要用 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)就寫(xiě)復(fù)雜 SQL先把邏輯用筆畫(huà)出幾行樣例手動(dòng)推一遍分組結(jié)果再寫(xiě)代碼。很多問(wèn)題在紙面上想清楚后代碼就是一步到位的翻譯而已。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
成人精品视频99在线观看免费| www久久久久久久久久久久久久久久久| 日韩草草草草草草草草草草草草| 免费观看全黄做爰的视频| 五月婷婷久久网| 久久久大香蕉| 色播播婷婷| 五月天婷婷色播综合在线| 久久婷婷综合五月天| 五月婷婷久| 午夜丁香久久久久久| 亚洲成人婷婷| 在线婷婷| 97综合在线| 九九热视频首页/这里只有精品| 强辱丰满人妻HD中文字幕| 一级二级色大片| 色噜噜狠狠色综无码久久合欧美| 大香蕉婷婷丁香视频在线| 婷婷丁香激情五月| 日韩小视频在线99| 超碰1999| 日本在线噜噜| 婷婷十月激情综合网| 亚洲一区二区无码蜜乳av| 狠狠五月激情在线| 免费日韩99| 国产综合丁香五月天| 五月丁香啪啪激情| 噜噜干日本| 婷婷成人综合免费视频| 久久av电影| 婷婷五月天.com| 综合色五月天| 激情综合五月丁香六月婷婷| 日韩成人不卡| 亚洲无aV在线中文字幕 | 婷婷综合在线观看视频| 超碰不卡在线| 嫩草AV久久伊人妇女超级A| 丁香六月婷婷| 久久受www免费人成| 欧美A级成人婬片免费看理论| 99日在线观看视频| 香蕉综合在线| 日本va网站| 婷婷五月色网| 色香欲综合| 91干在线视频| 婷婷成人综合免费视频| 99激情| 在线中文亚洲| 91男人资源站| www,超碰| 亚洲成人黄色网| 九九久久99| 色99色| 99玖玖视频| 色欲九区| 成人 在线 日韩| 全部老头和老太XXXXX| 伦乱天堂| 婷婷综合九色伊人| 久久99热这里只有精品23| 成人色站,在线视频,看片-SS1AV| 亚洲欧美一区二区三区四区爱爱动图| 亚洲啪啪精品| 婷婷开心激情五月激情网| 精品久久99码| 色色色9 9 9| 丁香五月婷婷激情123| 五月婷婷五月天| www.色五月| 偷拍九九五月丁香婷婷| 激情另类综合| www.色五月.com| 大香蕉520| 99久久婷| 九九视频这里只有精彩| 久久受www免费人成| 五月色情婷婷开心五月色情| 99情色五月天| 99热这里只有免费| 强辱丰满人妻HD中文字幕| 中美月韩免费A片| 色五月激情婷婷| 久久人人九九| 狠狠穞A片一區二區三區| 97色在线观看视频| 欧美日朝成人| 色情综合网| 亚洲九九在线| 26UUU欧美激情一区二区| 久9热视频在线| 五月天婷亚洲天综合网综合| 色噜噜综合网| 色综合色欲综合天天免费| 怡红院AV亚洲一区二区三区H | 婷婷五月天影院| 色色色免费视频| 激情五月瑟瑟| 欧美成人va| 五月丁香婷婷99| 精品无吗va视频免费观看| 成人短视频免费| 天天做天天爱天天综合网| 中文字幕五月久久婷婷| 色欲婷婷五月天丁香| 久久视网36| 国产肥白大熟妇BBBB视频| 综合xx网| 狠狠干,狠狠操| 爱婷婷久久视频| 色婷婷影视99| 五月天久久婷婷| 婷婷瑟五月天久久综合| 国产成人高清| 亚洲激情| 99re这里只有| 婷婷综合视频| 婷婷五月天啪啪| 色5月婷婷| 91丨九色丨熟女| 日本精品人妻无码77777| 亚洲va欧洲va国产va不卡| 无码区婷婷五月花开| 久久综合播放| 99国产精品久久久久久久久久久| 国产精品久久7777777精品无码| AⅤ在线播放网| 超碰人人干| 天天夜夜六月丁香五月婷婷老师| 密黄站| 影音先锋一区二区资源站| 日本高清久| 色五月综合97| 婷婷五月丁香亚洲| 99啪啪视频| 五月婷婷婷| 色六月丁香婷婷狠狠干| 久久这里面只有精品视频| 超碰成人在线观看| 日韩成人电影在线播放| 99热费观看| 天天搡日日搡aaaaⅩ| 少妇真实被内射视频三四区| 五月婷婷五月| 99色网站| 日本婷婷| 五月丁香香蕉| 亚洲九区| 丰满少妇猛烈A片免费看观看| 久久98| 丁香五月激情久久麻豆| 激情五月天婷婷色色色色色色色色色色色 | 狠狠舔| 91人人操人人爱| 99riAV国产精品视频| 狠狠爱婷婷丁香| 欧美三级欧美一级| 五月婷婷中字在线| 婷婷天天婷婷天天澡| 九九人人操| 五月天婷婷久久视频| 久热这里只有| 超pen个人视频97| 天天澡天天狠天天天做| Av大香蕉| 婷婷丁香大香蕉| aaaa.黄| 色婷婷丁香| 99久久国产宗和精品1上映| 热久久成人| 狠狠狠人妻| 丁香涩涩爱| www,久久久| 级情九色| 91窝窝| 噜噜狠狠色综合久| 欧美色小说婷婷| 国产一二三四五六七八视频| 五月丁香六月色| AA片在线观看视频在线播放 | 久人操| 人人人操Av| 激情五月婷婷丁香综合网| 大香蕉五月婷婷| 91精品91久久久中77777| 丁香五月成人自拍| 五月天婷婷乱| 中文字幕日产A片在线看| 精品视频网| 狠狠做五月| 另类 在线| 内射干少妇亚洲69XXX| 久色激情| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 色热久| 天天爽夜夜爽夜夜爽精品视频| 99性视频| 丁香色情五月综合激情| 色色综合网站| 色天使色婷婷| 五月婷婷丁香婷婷| 五月婷婷丁香大陆免费| 橾逼网| 五月婷婷色色| 国产午夜精品一区二区| 日韩在线婷婷五月天综合| A片女女女女女女BBBB| 久久久久婷婷五月热综合| 亚洲综合另类| 色伊人啪| 色99久草在线| 91婷婷在线| 丁香六月婷婷激情| PORNY九色9l自拍视频成人| 激情视频综合| 激情视频网址| 丁香五月天社区| 丁香五月天.com| 91婷婷丁香| 看婷婷五月天网| 91丨九色丨高潮丰满日本| 丁香五月婷婷综合激情哟哟哟| 亚洲av骚货| www.久9| 婷婷五月天视频免费在线观看| 偷拍九九五月丁香婷婷| 少妇性按摩无码中文A片| 97人人看一| 偷拍91九色| 丁香六月婷婷综情欧美| a性生活久久无| 欧美丁香婷婷天天操| 五月丁香人妻| 久色中文| 人人叉久| 97人妻碰碰中文无码久热丝袜| 激情影院内射| 狠狠99| 天天日夜夜爽| 呦呦视频无码播放| 激情丁香淫荡婷婷| 9久久精品视频| 99热国产这里只有精品| 5月丁香六月婷婷| 色婷婷精品小视频| 天堂久久婷婷| 99视频内射三四| 热热久久久久久久久| 婷婷五月色综合| 沈娜娜av| 中文不卡av| 97干在线| 婷婷五月电影院| 99精品综合| 夜夜操天天干| 天天操综合网| 丁香婷婷六月| 91在线日| 色色哒五月婷婷六月丁香| 开心五月婷婷六月丁香| 精品人妻伦| 激情五月丁香综合蜜桃| 丁香婷婷五色月| 亚洲人妻av| 久久久999精品| 色婷婷影院| 99热永久在线观看| 开心色五月天久久久久久久| 色5月丁香婷婷| 爱iii做iiii日日| 性欧美日本| 亚洲秘 无码一区二区三区妃光/1| 婷婷五月天激情综合网| 色色色.COM| 五月婷婷 激情五月| 天天爽天天干| 天天天天操| 国产成人综合亚洲| 91久久综合亚洲噜噜成人在线 | 九九色色| 五月婷婷啪啪| 色色五月婷婷狠狠| 色综合久久88色综合天天看| 亚洲va日| 久久久精品AV| 国产精品汇聚精彩第二页 - 高清完整版在线 - 青蛙AV | 青青福利网| AV操逼网| 婷婷五月综合网| 久久精品五月天| 一起草Av| 国产又粗又大又爽又黄| 美女主播野战视步页| 97综合视频在线| 这里只有精品9| 婷婷丁香五月天熟女丝袜| 久久婷婷成人综合色怡春院| 综合激情在线| 国产激情综合五月久久| 五月婷婷开心色伊人| 国产精产国品一二三在观看| 狠狠草在线观看| 六月婷婷七月丁香| 久色网| 亚洲综合丁香五月| 国产高潮白浆一区二区| 欧美日韩成人| 婷婷五月天成人网站| 搡BBBB搡BBB搡五十| 五月激情丁香| 久久婷婷五月天蜜桃| 色香欲综合| 丁香久久五月天视频在线观看| 五月刺激丁香月综合| 99精品色| 丁香香五月激情免费视频| 日本不卡高字幕在线2019| 色色网五月激情| 黄色精品五月婷婷| 五月天综合久久| 日日操日日射| 色综合com| 国产熟妇的荡欲午夜视频| 激情色视频| 五月激情网站| 大香蕉伊人丁香五月| 新激情五月天天在线网| 色情五月天se| 婷婷六月激情| 丁香婷婷浪潮AV久久综合| 久久久精品人妻录| 五月天激情播播网| 97婷婷丁香五月天激情图片| 亚洲亚洲人成综合网络| A1片久久久| 婷婷六月激情啪啪| 亚洲激情综合网| 成人国产网站在线免费看| 97九色视频| 婷婷激情蜜桃玖玖丁香| 九九热自拍| 婷婷丁香六月天| 人人澡玖玖一| 五月丁香另类图片| 激情黄色小说五月天| 五月激情婷婷国产精品久久久久久| 99热99色| 变态另类9| 在线A色| 大香蕉久| 久久婷婷五月综合色丁香| 无码激情AAAAA片-区区| 亚洲精品视频在线播放| 色人妻五月| 99精品久久| 久久国产AV| 性做久久久久久久免费看| a久久| 五月婷婷伊人久久| 五月激情精品视频| 99热在线观看免费中文| 免看黄大片AA | 久久九九爽| 五月婷婷啪啪啪啪| 五月色婷婷激情| 日本色道视频网站| www.久久99热地址发布| 亚洲久艹| 丁香婷婷五月综合欧美另类| 欧美顶级少妇做爰HD| 天天干 夜夜爽| Www,五月天| 情欲综合网| 99久久综合网| 外国碰视频网站97| 超级碰91| 欧美成人一区二区三区在线视频| 欧美色五月| 九九久久五月天| 丁香五月六月| 婷婷五月天狠狠| 色久在| 亚洲永久四色| 无码人妻激情| 99无码超碰| 玖玖99精品视频| 超级97碰碰| 67194中文在线| 变态 另类 在线| 日本色婷婷| 五月天亭亭俺也| 欧美色色色色色| 久久婷婷五月天| 婷婷五月天小说网| 成人婷婷色五月天| 伊人婷婷激情| 六月婷婷网站| 精品久久久久久久人妻| 五月精品免费XXX| 婷婷 久综合| 日本久久99| 婷婷欧美综合| 九月丁香婷婷| 久久色五月| 91婷婷丁香五月天免费视频网站| 婷婷久久五月天| 六月激情婷婷| 亚洲热手机在线观看| 九月丁香| 九九99在线免费在线观看视频| 999婷婷综合| 色玖玖爱| 99久久66| 六月丁香婷婷尤物| 蜜桃五月天| 国产精品热搜丁香五月婷婷| 96丁香六月婷婷蜜桃综合久久| 婷婷丁香18| 国产这里只有精品| 色综合久久44| 综合色99| 六月丁香婷婷六月激情综合| 99爱视频在线播放| 狠狠爱五月婷婷| www.minyis.com【JT】实力收量可预付QQ2101460746 | 婷婷五月无码| 色婷婷免费观看| 大香蕉网站,大香蕉综合| 五月天综合久久| 午夜免费试看| 婷五月丁香| 日韩AV色色色| 五月丁香花免费视频| 丁香五月五婷| 久久婷婷色综合| 亚州操人在线视频| 激情内射人妻1区2区3区| 蜜桃人妻无码AV天堂三区| 99国产精品白浆在线观看免费 | 婷婷丁香六月| 日操熟女| 伊人玖玖精品| 欧美综合婷婷欧美综| 激情五月天婷婷视频| 99久在线精品99re8热| 区美毛片子| 99色精品| 狠狠狠狠草草| 超碰人人操在线| 久久久婷婷婷| 亚州精品久久久久AV无码| 婷婷五月天无码| 91精品丝袜久久久久久| 男同91 | 亚洲视频在线网| 国产精品电影网| 4399在线日本A片| 开心五月婷婷六月丁香| 色五月欧美| 婷婷五月天社区| 性爱激情五月| 成人短视频在线| 色婷婷伦理| 另类激情中文| www五月| 九热视频| 久热亚洲| 欧美噜一噜| 五月激情婷婷六月| 亚洲精品色| 91热久88| 婷婷成人网五月天| 激情五月色播五月| 91碰碰碰| 婷婷久久婷婷色五月| 欧美日韩成人在线网| 凹凸7777操操操| www.henhengan| 激情网五月天| 五月婷婷综合天天操| 武则天精品久久| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 啪啪91| 99综合一区| 日韩成人综合网| 欧美五月丁香| 色综合99| 97干欧美| 婷婷五月天播播| 男女啪啪做爰高潮无遮挡| 狠狠色大香蕉| 五月丁花色综合网| 开心婷婷五月| 涩婷婷视频快播人妻| 亚洲成人网无码| 亚洲精品国产精品乱码视99| 久久视频在线视频| 九九热99免费视频| 五月激情婷婷在线| aV直接看| 99日本在线| 色狠狠综合入口| 99热久久这里只有精品| 97人人操人人干| 婷婷成人视频| 国产女人十八水真多1| 国产99精品免费视频| 99re热在线视频观看| 新激情婷婷| 亚洲AV网站在线观看| ss99热| 色99色| 久久青草国| 五月激情综合婷婷| 五月婷婷六月天| 五月天伊人综合| 五月婷婷中文| 亚洲AV无码电影| 久久婷婷五月天| 色天堂在线| 一级性感毛片| 婷婷开心久久| 99久久九九视频| 丁香五月AV在线| 亚洲色久| 99色在线| 91日韩在线| 一本久道综合99| 亚洲丁香五月| 草草色情综合网| 激情婷婷五月天网址| 人人摸人人干| 玖玖婷婷婷丁香五月| 五月丁香九九九综合| 九九综合九九| 99视频自拍| 久久久.COM| 第四色五月婷婷| 精品成人无码A片观看香草视频 | 色丁香六月| 色.五月综合网| 狠狠干激情五月| 青草视频在线观看视频| 久久99这里只有精品| 五月婷婷婷婷| 国产激情久久| 99操逼| 激情综合自拍五月婷婷色五月| AV九九| 亚洲国产婷婷色五月| www久久99| 97精品欧美91久久久久久久| 99久久婷婷国产综合| 日韩性视频| 九九人人操| 五月婷婷性爱| 婷婷五月天小说网| 九九成人高清视频| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 久鲁鲁色网| 五月天激情国产综合婷婷婷| 婷婷丁香五月精品| 老师高潮流白浆喷水的A片| 99黄色| 亚洲乱码日产精品BD| 思思热再线视频| 日韩一级| 九九99热久久精品66中文字幕| 亚洲婷婷基地| 色无码| 日韩成人电影AV| 色婷婷网| 五月婷婷欧美激情| 五月天天综合| 色播播五月天| 色九九九综合| 亚洲va综合va国产va中文| 国产脫衣舞一区二区三区| 玖玖婷婷五月天| 日韩三级片一区二区| 五月天婷婷综合网| 五月综合精品| 男人天堂99| 97天堂| 丁香五月婷婷欧美成人色图| 99五月婷| 99热国产| 91啪级电影| 婷婷五月激情视频网| 玖玖在线视| 深情六月婷婷综合久久| 国成人网| 综合网激情| 九九無碼| 九一九九黄色| 99热这里只有精品22| 五月天色婷婷视频| 亚洲殴洲精品Av在线| 久久久香| 九伊人网| 国产精品国产成人国产三级| 婷婷丁香五月激情| 激情另类综合| 激情婷婷综合网| 五月天婷婷在线播放| 久久视频这里都是精品| 婷婷五月色播天| 天天综合网91| 人妻乱码久久久| 久久九⑨| h在线看免费版在线看| 婷婷色正月| 伊人婷婷青青cao| 天天射天天操天天干| 激情六月婷婷| 99re这里只有精品免费| 韩日AV片| 色五月亚洲| 99九九视频精彩在线| 深爱激情五月天色婷婷| 琪琪色五月天| 色五月美女| 精品久久99码| 国产日韩欧美性爱| 五月婷婷欲色| 婷婷欧美偷拍综合| 五月天AV大香蕉| 91久久综合亚洲鲁鲁五月天| 五月丁香六月综合激情网| 亚洲AV成人精品日韩在线播放| 热99色| 日日夜夜天天综合| 五月天婷婷综合免费| 婷婷大美在线| 国产一级片| 日韩视频女神99| 久久久国产精品黄毛片| 久久99综合| 思思热精品在线| 亚洲五月婷天天操| 天久久久久| 9|人妻人人操| 97色吧| 亚洲区视频| 开心激情五月天网| 99热视精品| .操區COm| 日韩欧美老妇性视频91久久久| 久久综合九色综合97婷婷| 超碰AV在线| 婷婷亚洲综合| av中文网站| 久久只这里有精品| 午夜美女人啪最红院| 99热这里都是精品| 久久在线大香蕉| 一级无码作爱片| 67194线路二在线观看| 九九Av| 六月丁丁香| 色色色99| 五月婷视频在线| 婷婷五月激情欧美大胆视频| 婷婷激情综合无月| Se.婷婷五月天| 97人人操人人干| 九九热内射| 91碰碰| 九九热精品| 九九99精品视频在线观看| 成人免费在线电影| 天天色天天舔天天爱天天爽| 夜夜操狠狠操天天操| 激情婷婷五月天网址| 日本女va| 丁香五月在线伊人| 九九热10| 开心五月丁香综合久久| 91精品久久久久久| www久| 一逼色综合| 玖玖爱资源站| 九九色中文| 亚洲人成网站999综合| 久久五月婷综合| 亚洲狠狠色丁香婷婷综合久久| AA片在线观看视频在线播放| 久久在线视频免费观看| 666555。COm毛片| 亚洲久热| 激情玖玖sh| 开心色色五月天综合| 国产人妻人伦精品一区二区| 拍真实国产伦偷精品| 嫩草AV久久伊人妇女超级A| 亚洲人妻av伦理| 香蕉AV777XXX色综合一区| 免费看欧美成人A片无码| 91九色最新视频| 色99综合色88| 婷婷WWW久久| 亚洲4区国产欧美| 在线视频99| 国产成人av在线播放| 九九色逼| 五月情四婷婷| 亚洲午夜精品久久久久久人妖| 99热香港| 亚洲 六月 综合| 情色五月天 网站| 色综合播放| 99riAV国产精品视频| 成人av免费观看| 99激| 色五月天成人| 综合久久97| 欧美人与性动交CCOO| 丁香五月狠狠在线观看| 天堂久久婷婷| 再次出发二| 草做免费在线观看| 色综合久久88色综合天天99| 99久re热视频精品98| 丁香婷婷九月在线| 五月婷婷,狠狠操| 五月丁香激情综合啪| 婷婷丁香五月天狠狠| 欧美25p| 九九久久精品| 五月婷婷久久大片| 国产免费av在线| 九九热10| 森林影视大全,最好看的2019年视频| 亚洲人妻五月丁香婷婷| 97婷婷狠狠| 色色99| 久草丁香婷婷五月天婷| 狠狠舔| 丁香五月婷婷色| 超碰成人在线观看| 超碰婷婷五月| 欧洲毛片基地c区| 丁香五月婷婷激情视频播放| 色色热| 中文字幕日产A片在线看| 996热re视频在线观看视频| 亚洲综合婷婷| 日日艹思思热| 色五月五月婷婷| 五月婷无码| 99综合网| 色色综合色| 久色视频| 2015超碰| 五月丁香啪啪啪啪| 亚洲国产成人在线| 婷婷丁香六月天| 玖热精品综合视频| 99色亚洲| 99爱精品| Caop在线| 99热综合在线观看| 五月婷婷五月丁香| 国产毛片精品一区二区色欲黄A片| 另类丁香综合| 26uuuavcom| 激情人妻综合| www.婷婷久久五月天| 99re这里只有精品99| 色婷婷狠狠| 亚洲国产精品二二三三区| 久久久久激情| 色五月婷婷激情| 亚洲精品国产熟女久久久| 91尤物九色在线| 五月天婷婷在看| 久久九九爽| 久久99免费视频| 欧美噜一噜| 婷婷伊人五月天| 婷婷五月色惰| 骚货艹网站视频| 久久人妻精品| 91色在线/日韩| 婷婷六月丁香欧美视频在线| 色天堂婷婷| 99久热| 蜜臀av粉嫩av懂色av| 激情AV综合| 99久久这里只有精品免费官网| 丁香婷婷色九月| 大香伊人婷婷影院| 天天狠狠色| 青草青草视频2免费观看| 九九热这里只有精品23| 色色色色色色色色五月先| 亚洲热久| 天天色宗合| 极品精品一区二区三区在线| 99re这里只有精品免费| 午夜一区| 九九热这里只有精品23| 日韩无码成人电影| 日本久久视频| 五月天婷婷免费| 色婷婷影| 综合久久99| 日韩久久日| 婷婷五月AV| 中文字幕免费高清电视剧| tingtingjiqingwuyue| 五月丁香色婷婷色| www.金莲av| 99爱免费在线视频| 99视频在线观看地址| 免费日韩99| 丁香五月成人| 欧美va精品va老师va| 五月天社区婷婷丁香社区| 99热天堂| 丁香 久久| 色色婷婷色色| 97色 五月天丁香| 大香蕉福利导航| 色久综合天天做视频| 风流少妇A片一区二区蜜桃| xxxx五月| 超碰碰碰碰| 婷婷激情五月吧| 综合色99| 欧美激情 日韩无码 婷婷 五月天| 热99这就是精品视频| 五月综合久久| 精品人妻一区二区| 亚洲丁香五月天在线视频| 亚洲成人一区| 五月天啪啪| 综合久| 五月丁香猫咪久久婷婷综合视频激情四射网入口| 91人妻人人做人碰人人爽九色| 1024手机在线观看看片_日韩精品| www.91久久| 婷婷伊人綜合中文字幕小说| www超碰| 婷婷色香六月综合激情| 精品欧美性爱超级爽| 日撸夜撸日操| 婷婷六月天国产综合| 婷婷五月精品中文字幕| 一区中文字幕电影| 丁香美女五月天婷婷| 夜夜大香蕉婷婷丁香| 六月激情婷婷| 婷婷五月天天| 亚洲影院婷婷色| 日韩一级网站| 五月 成人 婷婷| 亚洲热久久| 立川无码av| 综合色、色综合| 丁香六月婷婷综合欧美| 日本婷婷在线| 超碰女人天堂| 久热2025无码| 婷婷丁香综合网| 丁香五月在线观看| 久久精品色| 国产乱子轮XXX农村| 五月丁香中文字幕| 色狠狠色综合久久久绯色AⅤ影视| 99色视频| 久久欧洲综合网| 五月天丁香网站| 久久激情视频| 色色色无码| 亚洲成人影视在线观看| 久久精品99国产精品日本| 色狠狠色综合| txt五月激情四射网综合俺也来了| 1024操逼视频| 99精品视频在线6| 色综合女人99| 婷婷九月色| 成年人99热| 人人性久久| 91狠狠综合久久久久久| 天天日日综合| 五月丁香六月香香蕉| 中国女人内射6XXXXX| 啪啪小说五月天| 久久这里精彩免费在线观看| 综合 激情 婷婷| 亚洲成人AV在线播放| 天天爱天天做天天舔| 欧美婷婷丁香五月| 色色色99| 无码婷婷五月天| 人伦30P| www.金莲av| 99re在线精品视频| 五月综合亚洲婷婷| 超碰色综合| 婷婷色综合| 五月丁香香蕉| 色色婷五月天| 欧美三级黄色片久久| 中文字幕乱码亚洲精品一区 | 九月停停| 99性视频| 婷婷爱五月| 婷婷五月激情综合| 久久精品噜噜噜成人A∨色欲| 久热91| 国产99视频永久免费| 9久国产精品| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 午夜美女人啪最红院| 九色地址91视频| 无码AV久久久久久久久| 婷婷情色五月天| 狠狠五月天婷婷激情网。| 九九色精品| 人操人人| 大色鬼综合| 蜜桃婷婷丁香| 五月丁香啪啪| 99久99久| 嫩草AV久久伊人妇女超级A| 色九月婷婷丁香| 五月丁香久久呀| 超碰男人色| 婷婷五月丁香性爱| 思思热在线观看| 操操国产| 99这里只有精品视频| 婷婷五月丁香色情| 婷婷五月天播| 色丁香婷婷| 婷婷五月天首页激情| 大色鬼综合| 激情五月天色播| 人人色婷婷| 99热在线观看免费| 夜夜天天久久婷婷| 激情深爱五月婷婷| 99热在线观看精品| 97成人超碰免| 国产操逼视频网站| 激情婷婷丁香五月| 国产精产国品一二三在观看| 色色色色热| 久久激情五月婷婷| 97色色网| 99在线精品视频在线观看| 激情五月激情综合网一级丸片| 欧美图片丁香五月天| 国产色香蕉精品五夜婷| 蜜臀av 粉嫩av 懂色av| 国产乱子轮XXX农村| 婷婷五月激情网| 中文字幕 码精品视频网站| 成人在线日韩欧美| 婷婷五月天无码| 久久色五月天激情小说| 色综合久久88色综合中文字幕| 狠狠操天天操| 在线国产精品色| 婷婷导航| 成人婷婷| 亚洲综合无码| 91ncm视频| 婷婷五月天AV在线| 翔田千里 50岁 无码| www,com,五月色色| 六月丁香网| 色五月av| 99热99这里只有精品| 99热777| 99热这里只有精品一区| 日本欧美国产| 9久热这里只有精品| 婷婷综合五月色播| 国产另类综合| 99热的无码| 六月久久狠狠| 五月天综合激情网| 激情综合网五月激情| 亚洲综合激情五月| 久久婷婷五月| www.黄色片-久久成人国产精品在线播放-999AV| 色色日本| 久久久性爱视频| 色色色热| 五月婷婷久久综合| 色玖玖爱| 99热在线精品观看| 天天综合色| 九九热在线视频| 国产欧美日韩综合精品一区二区| 亚洲色久| 日韩中文字幕| 五月丁香综缴情性爱| 香蕉97碰碰碰超视精品| 91精品国产99久久久久久天美| 九九九九毛片| 婷婷欧美激情综合| 丁香5月综合啪啪| www.lingjunshare.com| 深爱激情六月天| 色婷婷精品视频| 婷婷操逼| 亚洲人人操| 久久免费高| 亚洲成人无码免费| 色欲九区| 欧美天天五月丁香免费观看| 五月天堂在线| 五月天色婷婷av| www.av骚货| 激情久久久久久久久久久| 成人网址在线观看| 97干在线视频| 欧美成人AAA片一区国产精品| 婷婷五月丁香激情| 99婷婷国产最新视频| 蜜臀丁香黄色婷婷五月天| 色婷婷五月天天天天天天天天天| 婷婷香五月综合激情| 97干视频在线| 色婷婷综合视频| 五月婷视频在线观看| 少妇高潮一区二区三区99欧美| 婷婷午夜丁香| 开心婷婷五月花| 色狠狠色综合| 中文资源在线a | 五月丁香啪啪网| 五月天婷婷丁香人人操91| 成人国产网站| 影音先锋按摩| 欧美va亚洲va在线播放| 丁香五月AV| 国产毛片精品一区二区色欲黄A片| 日本人妻伦在线中文字幕| 天天综合久久| 玖玖在线资源视频| 五月天亚洲综合网| 看片视频在线免费日产在线看| 狠狠插.com| www九九免费视频| 五月丁香婷婷狠狠操| 性爱网五月天| 99re这里只有精品9| 五月婷婷久久激情| 中文字幕色色| 九九免费视频| 亚洲av电影网站| 亚洲另类电影| 亚洲无码九九| 26uuu最新地址| 婷婷中文综合网| 色丁香五月婷婷婷| 人人干人人操人人摸| 少妇熟女视频一区二区三区| 成人短视频免费| 久久这里在精品视频| 婷婷丁香亚洲色综合91| 欧美大片| 丁香婷婷九月| 一本综合丁香日日狠狠色| 五月婷婷综合网| 人妻六月天| 天天 青草 制服丝袜 在线| 天天插天天干| 中文字幕无码人妻少妇免费视频| 亚洲综合网 665566| 丁香五月天成人| 99精品视频免费观看| 亚洲成人无码片| 丁香五月婷婷动漫| 激情六月综合| 激情又色又爽又黄的A片| 伊人网碰碰| 五月丁香花激情综合网| 久久精品人妻| 99久精品视频| 一本伊人色婷| 五月丁香啪啪网| 97碰碰人人视频| 五月丁花六月丁香综合| 深爱五月天婷综合| www.色色五月天.com| www.色色色com| 久草 天堂| 99性色| 夜夜嗨一区二区三区直播内容 | 成人在线99| 97很鲁在线视频| AV中文在线| 99精品在线观看视频| 丁香五月婷婷国产在线| 伦99热| 午夜少妇在线观看视频| 99伊人性爱在线影院| 情久久综合五月天| 免费三级黄色| 色情五月天se| 丁香在线视频| 六月婷婷激情图片| 婷婷激情在线| 色色色宗合网| 三十路磁力链接| 五月婷婷六月色| 久久免费精品小视频| 激情五月天综合网| 2021日韩无码| 日本熟女内射| 五月丁久久| 久热这里精品免费| 丁香六月综合激情| 丁香丁婷五月激情| 9久视频| 七七九色| 日本狠狠网| 色五月激情综合网站| 天天天天天天天操| 少妇性按摩无码中文A片| 欧美丁香婷婷天天操| 丁香五月天激情综合| 99久久天堂婷婷| 婷婷五月综合激情小说| 不卡在线视频| 少妇久久诱惑视频| 欧美顶级少妇做爰HD| 蜜臀A∨在线水帘洞| www五月| 26UUU一区二区| 九九Av| 九九色中文| 99视频九九热| 色原狠狠综合| 久青草影院| 五月婷婷偷拍| 秋霞成人毛片一级A片| 五月婷婷啪啪啪| 97色色色色色| 久久精品爱爱| 欧美精品中文字幕亚洲专区| 亚洲色激情| 欧美综合五月丁香六月婷| 色五月婷婷操逼| 97人凄人人操人人爽| 日本欧美在线| 天天爽天天日| 五月天色播网| 美国少妇性做爰| 五月综合在线婷婷图片| 99超超碰| 青草少妇激情| 久久综合无| 91狠狠综合久久久| 婷婷五月天美女| 92久久精品一区二区| 天天干天天干天天干天天干天天干天天 | 另类伊人婷婷| 久久久久人妻网址| 丁香 亚洲 久久| 九九精品综合| 九九99久久| 丰满老熟妇BBBBB搡BBB| 五月丁香六月婷婷亚洲视频| 精品无码片| 狠狠爱婷婷| WWW.夜夜操.com| 成人国产欧美大片一区| 色色色色色综合| 99视频久久| 欧美婷婷| 丁香五月,激情五月,深爱五月| 久久久久久久91| 免费亚洲婷婷| 99久久免费性爱视频`| 国产AV一区二区三区最新精品| 色婷婷五月综合网| 桃色激情五月天| 久久人人九九| 玖玖99福利| 色综合播放| 久久作爱| 色婷婷成人| 五月丁香久久| 久久人妻伊人| 欧美激情伊人| 开心五月网 | 激情五月少妇| 大香蕉99| 极品少妇XXXX精品少妇偷拍| 天天天天天日| 欧美99热| 95精品区一区二| 色婷婷9| 亚洲99视频| 99偷拍视频在线日本| 99在线免费观看| 深爱激情五月婷婷| 97碰免费视频在线| 综合AV网| 婷婷五月天色综合| 婷婷色基地在线看 | 国产肥白大熟妇BBBB视频| 丁香五月天成人网站| 丁香婷婷激情综合五月激情 | 五月婷婷五月天| 丁香五月婷婷啪| 51精品国内探花| www.婷婷五月天| 颜射 精品性爱av| 综合久久高清| 99久操视频| 色五月激情网| 一本综合丁香日日狠狠色| 影视av久久久噜噜噜噜噜三级| 在线看片h站| 美女网黄| 天天色激情| 99热精品在线| 深爱综合网| 丁香五月98| 丁香六月婷婷开心| 伊人激情AV一区二区三区| 这里只有精品无码| 五月丁香久久久日婷婷久久婷婷日| 色婷婷最新域名| 99热精品在线观看| 97人人操| www.夜夜.com| 五月婷婷激情刺激| 碰超在线九色| 五月天丁香| 黄网在线免费观看| 色色综合网络| 熟女重口味αV| 色九亚洲| 亚洲在线网站| 五月天国产| 亚洲操精品| 国产性色蜜乳| 九九黄色网| 五夜丁香| 狠狠狠狠青草| 在线99热| 色播五月婷婷| 激情小说 五月天| 夜夜天天久久婷婷| 久久HD| 毛v一区二区视频| 日本色啪| 婷婷五月丁香五月| 99热在这里只有精品| 欧美色性色好| 亚洲综合婷婷六月丁香五月| 开心五月激情| 99re99在线看|