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

ARTICLE DETAIL

資訊詳情

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

Hive日期函數(shù)避坑指南:從時區(qū)陷阱到數(shù)倉分層最佳實踐

Hive日期函數(shù)避坑指南:從時區(qū)陷阱到數(shù)倉分層最佳實踐 1. 為什么日期函數(shù)是Hive開發(fā)者的分水嶺剛接觸Hive那會兒我總覺得日期函數(shù)不就是幾個轉(zhuǎn)換、加減、格式化的事能有多難。直到有一次跑月度報表發(fā)現(xiàn)同一批訂單數(shù)據(jù)在月初和月末跑出來的結(jié)果對不上排查了大半天才定位到問題出在unix_timestamp和from_unixtime的時區(qū)處理上。那次之后我才真正意識到Hive的日期函數(shù)看著簡單但里面藏著不少容易踩的坑尤其是涉及跨時區(qū)、跨年、閏年、夏令時這些邊界場景時一個參數(shù)寫錯整條數(shù)據(jù)鏈路的結(jié)果就全偏了。這篇內(nèi)容就是把我這些年在大數(shù)據(jù)開發(fā)中跟Hive日期函數(shù)打交道積累下來的經(jīng)驗做一次系統(tǒng)梳理。不管你是剛?cè)胄械臄?shù)據(jù)開發(fā)還是已經(jīng)寫了幾百行Hive SQL的老手只要你的日常工作涉及日期轉(zhuǎn)換、時間窗口計算、同比環(huán)比、留存分析、分區(qū)裁剪這些場景這里面的細節(jié)都值得過一遍。我會從最基礎的日期格式講起一路說到日期加減、截取、差值計算、時區(qū)處理再到實際數(shù)倉開發(fā)中那些教科書上不會寫的避坑技巧。每一段都配上可直接復制運行的SQL示例你可以在自己的測試環(huán)境里跟著跑一遍感受會更直觀。需要提前說明的是Hive的日期函數(shù)在不同版本之間有一些差異尤其是Hive 2.x和3.x在日期格式化符號上有細微調(diào)整我會在涉及的地方標注出來。另外Hive on Tez、Hive on Spark、以及各大云廠商的托管Hive服務在日期函數(shù)的實現(xiàn)上基本遵循Apache Hive的標準但個別函數(shù)可能有性能優(yōu)化或行為差異實際使用時建議先用小數(shù)據(jù)集驗證。2. Hive日期函數(shù)全景速覽與核心設計邏輯2.1 日期函數(shù)到底分幾類Hive的日期函數(shù)如果按功能來分大致可以歸為五類每一類解決的是不同層面的問題。理解這個分類比死記函數(shù)名要管用得多。第一類是日期獲取類代表函數(shù)有current_date、current_timestamp、unix_timestamp。這類函數(shù)的作用是拿到一個時間基準點通常用在ETL任務的入口處比如給當天跑的數(shù)據(jù)打上一個統(tǒng)一的日期標記。第二類是日期轉(zhuǎn)換類核心是from_unixtime、unix_timestamp、to_date、date_format這幾個負責在字符串、時間戳、日期對象之間來回倒騰。第三類是日期計算類包括date_add、date_sub、datediff、months_between、add_months、last_day用來做日期的加減和差值運算。第四類是日期截取類典型的是trunc、date_trunc、year、month、day、hour、minute、second、weekofyear用于從完整時間中提取某個粒度。第五類是條件判斷類比如if配合日期函數(shù)做邏輯分支或者用case when處理空值日期。這五類函數(shù)在實際開發(fā)中往往是組合使用的。比如你要算某個用戶的次日留存就需要先用date_sub拿到注冊日期的前一天再用datediff計算兩個日期的差值最后用case when判斷是否等于1。所以單獨記住某個函數(shù)的用法意義不大關鍵是要理解它們之間的組合邏輯。2.2 日期格式的底層邏輯為什么格式串寫錯就全亂Hive的日期格式化遵循的是Java的SimpleDateFormat規(guī)范這一點非常關鍵。很多人寫date_format的時候習慣性地用YYYY-MM-dd覺得大寫小寫無所謂結(jié)果跑出來的年份偶爾會差一年。原因在于yyyy表示的是日歷年而YYYY表示的是ISO周歷年。這兩個在一年中的大部分時間是一致的但在跨年前后那幾天會出現(xiàn)偏差。比如2024年12月30日按照ISO周歷已經(jīng)屬于2025年的第一周用YYYY格式化出來就是2025而用yyyy才是2024。這個坑我在至少三個項目里見過每次都是年底跑報表時才發(fā)現(xiàn)。常用的格式符號我整理了一個對照表建議收藏格式符號含義示例yyyy日歷年2024MM月份補零01-12dd日期補零01-31HH24小時制小時00-23mm分鐘00-59ss秒00-59EEE星期縮寫MonD一年中的第幾天1-366還有一個容易忽略的點是MM和mm的區(qū)別。MM是月份mm是分鐘寫反了不會報錯但結(jié)果完全不對。我見過有人把yyyy-MM-dd HH:mm:ss寫成yyyy-mm-dd HH:MM:ss跑出來的月份變成了分鐘數(shù)日期變成了月份數(shù)數(shù)據(jù)直接廢掉。這種錯誤在代碼審查時如果不仔細看很容易漏過去。2.3 時區(qū)問題最隱蔽的坑Hive默認使用UTC時區(qū)來處理時間戳但很多公司的服務器和業(yè)務數(shù)據(jù)是按東八區(qū)來的。這就導致一個現(xiàn)象你用unix_timestamp把一個東八區(qū)的字符串轉(zhuǎn)成時間戳再用from_unixtime轉(zhuǎn)回來結(jié)果差了8小時。這不是bug而是時區(qū)轉(zhuǎn)換的正常行為。解決方式有兩種。一種是在會話級別設置時區(qū)執(zhí)行set hive.local.time.zoneAsia/Shanghai;這樣Hive在處理時間戳時會按照東八區(qū)來轉(zhuǎn)換。另一種是在SQL里顯式做偏移比如from_unixtime(unix_timestamp(2024-01-01 00:00:00) 8*3600)。兩種方式各有適用場景前者適合整個ETL鏈路統(tǒng)一時區(qū)后者適合臨時性的單條SQL調(diào)整。需要特別注意的是current_date和current_timestamp返回的是服務器時區(qū)的時間而unix_timestamp()不帶參數(shù)時返回的是當前時間的Unix時間戳這個時間戳本身是UTC的。所以如果你用unix_timestamp()的結(jié)果直接做日期計算再轉(zhuǎn)成日期字符串一定要確認時區(qū)設置是否符合預期。3. 日期轉(zhuǎn)換與格式化從字符串到時間戳的完整鏈路3.1 unix_timestamp字符串轉(zhuǎn)時間戳的正確姿勢unix_timestamp是Hive日期處理中使用頻率最高的函數(shù)之一它的作用是把一個日期字符串轉(zhuǎn)換成Unix時間戳單位是秒?;居梅ㄊ莡nix_timestamp(2024-01-15 10:30:00)返回的是從1970-01-01 00:00:00 UTC到該時間點的秒數(shù)。這個函數(shù)有幾個重載形式很多人只知道不帶參數(shù)和帶一個參數(shù)的版本其實它還可以接受第二個參數(shù)來指定輸入格式。比如unix_timestamp(2024/01/15, yyyy/MM/dd)這樣就能處理非標準格式的日期字符串。如果不指定格式Hive會嘗試用默認的yyyy-MM-dd HH:mm:ss來解析解析失敗就返回NULL。這里有一個非常關鍵的細節(jié)unix_timestamp在解析失敗時返回的是NULL而不是報錯。這意味著如果你的數(shù)據(jù)里混有臟數(shù)據(jù)比如0000-00-00或者2024-13-01這種非法日期函數(shù)會靜默返回NULL后續(xù)的計算全部變成NULL但任務不會失敗。這種“靜默失敗”在數(shù)據(jù)質(zhì)量監(jiān)控不完善的情況下非常危險。我的做法是在ETL的清洗層加一個校驗步驟用case when unix_timestamp(日期字段) is null then invalid else valid end來標記異常數(shù)據(jù)提前攔截。另外unix_timestamp對日期字符串的格式要求比較嚴格。2024-1-5這種月份和日期不補零的寫法在某些Hive版本里能解析在另一些版本里會返回NULL。為了保險起見建議在數(shù)據(jù)源頭就統(tǒng)一成yyyy-MM-dd HH:mm:ss的標準格式或者在SQL里用lpad補零后再傳入。3.2 from_unixtime時間戳轉(zhuǎn)字符串的靈活運用from_unixtime是unix_timestamp的逆操作把Unix時間戳轉(zhuǎn)成指定格式的日期字符串?;居梅ㄊ莊rom_unixtime(1705300200)默認輸出yyyy-MM-dd HH:mm:ss格式。也可以指定第二個參數(shù)來控制輸出格式比如from_unixtime(1705300200, yyyyMMdd)輸出20240115。這個函數(shù)在實際開發(fā)中的一個典型用法是配合unix_timestamp做日期的加減運算。因為Hive的date_add和date_sub只能處理日期粒度如果你需要精確到小時或分鐘的加減就需要先轉(zhuǎn)成時間戳加減相應的秒數(shù)再轉(zhuǎn)回來。比如要算某個時間點之后3小時的時間可以這樣寫select from_unixtime(unix_timestamp(2024-01-15 10:30:00) 3*3600, yyyy-MM-dd HH:mm:ss);結(jié)果就是2024-01-15 13:30:00。這個模式在處理會話超時、訂單時效、活動倒計時等場景時非常實用。還有一個容易被忽略的點是from_unixtime的返回值類型。它返回的是字符串不是日期類型。如果你后續(xù)還要對這個結(jié)果做日期計算需要再用to_date轉(zhuǎn)成日期類型或者直接用unix_timestamp再轉(zhuǎn)回時間戳。很多初學者在這里會混淆寫出date_add(from_unixtime(...), 1)這樣的代碼雖然在某些版本里能跑通但依賴了隱式類型轉(zhuǎn)換不是好習慣。3.3 to_date與date_format提取日期部分的兩種方式to_date的作用是從一個日期時間字符串中提取日期部分返回yyyy-MM-dd格式的字符串。比如to_date(2024-01-15 10:30:00)返回2024-01-15。這個函數(shù)在只需要日期粒度時非常方便比用date_format寫一長串格式串要簡潔。date_format則更靈活可以按照任意格式輸出。比如date_format(2024-01-15 10:30:00, yyyyMM)返回202401date_format(2024-01-15 10:30:00, EEEE)返回Monday。在需要按周、按月、按季度聚合時date_format是首選工具。這兩個函數(shù)的選擇邏輯很簡單如果你只需要標準的日期部分用to_date如果你需要自定義格式用date_format。但從性能角度看to_date通常比date_format快一些因為它不需要解析格式串。在大數(shù)據(jù)量場景下這個差異會被放大所以能簡單就簡單。3.4 實操案例把非標準日期字符串標準化假設你有一批日志數(shù)據(jù)日期字段的格式五花八門有的是2024/01/15有的是20240115還有的是15-01-2024。你需要把它們統(tǒng)一成yyyy-MM-dd格式??梢赃@樣處理select case when 日期字段 rlike ^\\d{4}/\\d{2}/\\d{2}$ then date_format(to_date(regexp_replace(日期字段, /, -)), yyyy-MM-dd) when 日期字段 rlike ^\\d{8}$ then date_format(to_date(from_unixtime(unix_timestamp(日期字段, yyyyMMdd))), yyyy-MM-dd) when 日期字段 rlike ^\\d{2}-\\d{2}-\\d{4}$ then date_format(to_date(from_unixtime(unix_timestamp(日期字段, dd-MM-yyyy))), yyyy-MM-dd) else null end as 標準日期 from 日志表;這段SQL先用正則判斷格式再分別用對應的格式串解析最后統(tǒng)一輸出。實際項目中我會把這段邏輯封裝成一個UDF或者放在ETL的清洗層避免在每個查詢里重復寫。注意rlike后面的正則表達式在Hive里需要用雙反斜杠轉(zhuǎn)義因為Hive的字符串本身會做一次轉(zhuǎn)義。這一點跟Java的正則寫法不同初學者容易在這里卡住。4. 日期加減與差值計算數(shù)倉開發(fā)的核心操作4.1 date_add與date_sub最常用的日期偏移date_add(start_date, days)和date_sub(start_date, days)是Hive里最直觀的日期加減函數(shù)。前者返回開始日期之后N天的日期后者返回之前N天的日期。兩個函數(shù)的第一個參數(shù)可以是日期字符串也可以是current_date這樣的函數(shù)返回值。這兩個函數(shù)有一個特點它們只處理日期粒度不處理時間部分。如果你傳入2024-01-15 10:30:00函數(shù)會先截取日期部分2024-01-15然后加減天數(shù)返回的也是yyyy-MM-dd格式的字符串。所以如果你需要保留時間部分做加減就不能用這兩個函數(shù)得走時間戳那條路。在實際數(shù)倉開發(fā)中date_sub用得最多的是算T-1、T-7、T-30這些時間窗口。比如要算過去7天的活躍用戶可以這樣寫select count(distinct user_id) as 活躍用戶數(shù) from 用戶行為表 where dt between date_sub(current_date, 7) and date_sub(current_date, 1);這里用between配合date_sub既簡潔又不容易出錯。比用datediff再過濾要直觀得多。4.2 datediff計算兩個日期之間隔了多少天datediff(end_date, start_date)返回兩個日期之間的天數(shù)差。注意參數(shù)的順序第一個是結(jié)束日期第二個是開始日期結(jié)果是結(jié)束日期減去開始日期。如果寫反了結(jié)果就是負數(shù)。這個函數(shù)在計算用戶留存、訂單時效、賬期天數(shù)等場景中非常常用。比如算用戶的次日留存select a.注冊日期, count(distinct case when datediff(b.登錄日期, a.注冊日期) 1 then b.user_id end) as 次日留存用戶數(shù), count(distinct a.user_id) as 注冊用戶數(shù) from 注冊表 a left join 登錄表 b on a.user_id b.user_id group by a.注冊日期;這里datediff(b.登錄日期, a.注冊日期) 1就是判斷登錄日期是否比注冊日期晚一天。邏輯很清晰但要注意兩個日期字段的格式必須一致否則datediff可能返回NULL。datediff還有一個特性它只計算日期部分忽略時間。所以datediff(2024-01-15 23:59:59, 2024-01-14 00:00:00)返回的是1而不是0。這個特性在跨天場景下需要特別注意如果你需要精確到小時或分鐘的差值就得用時間戳相減再除以3600或60。4.3 months_between與add_months月度粒度的計算months_between(date1, date2)返回兩個日期之間相差的月數(shù)結(jié)果是一個浮點數(shù)。比如months_between(2024-03-15, 2024-01-15)返回2.0。如果兩個日期的“日”部分不同結(jié)果會帶小數(shù)。比如months_between(2024-03-14, 2024-01-15)返回1.9677...因為3月14日還沒到完整的兩個月。這個函數(shù)在計算賬期、合同周期、會員有效期等場景中很有用。但要注意浮點數(shù)比較的精度問題通常會用floor或round來處理。比如算用戶注冊了多少個完整月select floor(months_between(current_date, 注冊日期)) as 完整月數(shù) from 用戶表;add_months(start_date, months)則是在日期上加減月份。這個函數(shù)會自動處理月末的情況如果開始日期是1月31日加一個月會返回2月28日或29日取決于閏年。這個行為跟很多人的直覺一致但在跨年時要注意比如12月31日加一個月返回的是次年1月31日。4.4 last_day快速拿到月末日期last_day(date)返回給定日期所在月份的最后一天。這個函數(shù)在算月度匯總時特別方便比如你要把每天的數(shù)據(jù)匯總到月末可以用last_day(dt)作為分組字段。select last_day(dt) as 月末日期, sum(金額) as 月總額 from 交易表 group by last_day(dt);這樣每個月的所有交易都會歸到該月的最后一天后續(xù)做月度對比時直接按這個字段關聯(lián)就行。比用date_format(dt, yyyy-MM)再拼接-01要簡潔得多而且不用擔心月份天數(shù)的差異。4.5 實操案例計算用戶連續(xù)登錄天數(shù)連續(xù)登錄天數(shù)是用戶活躍分析中的經(jīng)典問題。用Hive的日期函數(shù)可以這樣實現(xiàn)with 登錄記錄 as ( select user_id, to_date(登錄時間) as 登錄日期, date_sub(to_date(登錄時間), row_number() over (partition by user_id order by to_date(登錄時間))) as 分組標記 from 用戶行為表 where 行為類型 login group by user_id, to_date(登錄時間) ), 連續(xù)分組 as ( select user_id, 分組標記, count(*) as 連續(xù)天數(shù), min(登錄日期) as 起始日期, max(登錄日期) as 結(jié)束日期 from 登錄記錄 group by user_id, 分組標記 ) select user_id, max(連續(xù)天數(shù)) as 最大連續(xù)登錄天數(shù) from 連續(xù)分組 group by user_id;這段SQL的核心思路是用date_sub減去row_number如果日期是連續(xù)的減出來的結(jié)果會相同從而把連續(xù)的日期分到同一組。這個技巧在算連續(xù)簽到、連續(xù)活躍、連續(xù)達標等場景中通用值得掌握。提示row_number()在Hive中需要配合over子句使用且Hive 2.x以上版本才支持窗口函數(shù)。如果你用的是更早的版本需要用自連接或者其他方式模擬。5. 日期截取與粒度聚合從明細到匯總的關鍵一步5.1 trunc與date_trunc截取到指定粒度trunc(date, format)是Hive中用于日期截取的函數(shù)format可以是YYYY、MM、DD等。比如trunc(2024-01-15, MM)返回2024-01-01trunc(2024-01-15, YYYY)返回2024-01-01。這個函數(shù)在按年、按月匯總時非常有用。date_trunc(format, date)是另一個截取函數(shù)功能類似但參數(shù)順序相反。date_trunc(month, 2024-01-15)返回2024-01-01 00:00:00。注意date_trunc返回的是時間戳格式而trunc返回的是日期字符串。兩者在Hive的不同版本中支持程度不同trunc在較早版本中就有date_trunc在Hive 2.1.0之后才引入。實際使用時如果只需要日期粒度用trunc更直接如果需要時間戳格式用date_trunc。但要注意date_trunc的format參數(shù)是英文單詞比如year、month、week、day、hour而不是YYYY、MM這種格式串。5.2 year/month/day/hour提取時間分量year(date)、month(date)、day(date)、hour(date)、minute(date)、second(date)這幾個函數(shù)分別返回日期中的年、月、日、時、分、秒。返回值都是整數(shù)。這些函數(shù)在需要按某個時間分量分組或過濾時非常方便。比如要統(tǒng)計每個小時的訂單量select hour(下單時間) as 小時, count(*) as 訂單量 from 訂單表 where to_date(下單時間) current_date group by hour(下單時間);這里hour函數(shù)直接從時間字符串中提取小時數(shù)比用date_format再轉(zhuǎn)成整數(shù)要簡潔。但要注意hour函數(shù)對輸入格式有要求必須是yyyy-MM-dd HH:mm:ss這種標準格式否則可能返回NULL。5.3 weekofyear按周聚合的注意事項weekofyear(date)返回日期所在的周數(shù)范圍是1到53。這個函數(shù)在按周匯總數(shù)據(jù)時很有用但有一個坑不同地區(qū)對“一周從哪天開始”的定義不同。Hive的weekofyear遵循ISO 8601標準即周一為一周的第一天且包含周四的那一周算作新年的第一周。這跟某些業(yè)務方理解的“周日為一周開始”不一致容易導致周數(shù)據(jù)對不上。如果業(yè)務方要求周日為一周開始就不能直接用weekofyear需要自己計算。一種方式是用date_sub把日期偏移到最近的周日然后按這個偏移后的日期分組select date_sub(to_date(日期字段), pmod(dayofweek(to_date(日期字段)) 6, 7)) as 周起始日, count(*) as 數(shù)量 from 表名 group by date_sub(to_date(日期字段), pmod(dayofweek(to_date(日期字段)) 6, 7));這里dayofweek返回的是1到71表示周日7表示周六。pmod是正取模函數(shù)確保結(jié)果為正數(shù)。這段邏輯稍微繞一點但能精確控制周的定義。5.4 實操案例按不同粒度匯總銷售數(shù)據(jù)假設你有一張銷售明細表需要同時輸出日、周、月三個粒度的匯總??梢杂胓rouping sets配合日期函數(shù)一次性完成select coalesce(date_format(to_date(銷售時間), yyyy-MM-dd), ALL) as 日期, coalesce(date_format(to_date(銷售時間), yyyy-ww), ALL) as 周, coalesce(date_format(to_date(銷售時間), yyyy-MM), ALL) as 月, sum(金額) as 銷售總額 from 銷售表 group by date_format(to_date(銷售時間), yyyy-MM-dd), date_format(to_date(銷售時間), yyyy-ww), date_format(to_date(銷售時間), yyyy-MM) grouping sets ( (date_format(to_date(銷售時間), yyyy-MM-dd)), (date_format(to_date(銷售時間), yyyy-ww)), (date_format(to_date(銷售時間), yyyy-MM)), () );這段SQL利用了grouping sets的多粒度聚合能力配合coalesce處理匯總行。實際跑的時候要注意數(shù)據(jù)量如果明細表很大建議先做一層預聚合再跑這個查詢。6. 時區(qū)處理與跨時區(qū)數(shù)據(jù)同步的實戰(zhàn)經(jīng)驗6.1 Hive時區(qū)設置的三個層級Hive的時區(qū)設置可以在三個層級生效優(yōu)先級從高到低分別是會話級、任務級、集群級。會話級通過set hive.local.time.zoneAsia/Shanghai;設置只影響當前會話。任務級通過set mapreduce.job.timezone或者Spark的spark.sql.session.timeZone設置影響整個任務。集群級在hive-site.xml里配置影響所有任務。實際開發(fā)中我建議在ETL任務的入口統(tǒng)一設置會話級時區(qū)這樣每個任務的行為都是確定的不會因為集群配置變更而受影響。設置的方式是在SQL腳本開頭加上set hive.local.time.zoneAsia/Shanghai; set hive.fetch.task.conversionnone;第二行是為了避免某些版本下fetch任務不走時區(qū)設置的問題。這個細節(jié)在官方文檔里沒有明確寫是我在實際踩坑后總結(jié)出來的。6.2 跨時區(qū)數(shù)據(jù)同步的常見問題很多公司的數(shù)據(jù)來源不止一個時區(qū)。比如服務器日志是UTC業(yè)務數(shù)據(jù)庫是東八區(qū)第三方接口返回的是美東時間。把這些數(shù)據(jù)統(tǒng)一到同一個時區(qū)下處理是ETL的第一道關卡。我的做法是在數(shù)據(jù)接入層就做時區(qū)歸一化統(tǒng)一轉(zhuǎn)成東八區(qū)。對于UTC時間加8小時對于美東時間加13小時夏令時或14小時冬令時。夏令時的判斷比較麻煩通常用from_utc_timestamp和to_utc_timestamp這兩個函數(shù)來處理。from_utc_timestamp(timestamp, timezone)把UTC時間轉(zhuǎn)成指定時區(qū)的時間。比如from_utc_timestamp(2024-01-15 02:30:00, Asia/Shanghai)返回2024-01-15 10:30:00。to_utc_timestamp則是反向操作。這兩個函數(shù)會自動處理夏令時比手動加減小時數(shù)要可靠。但要注意這兩個函數(shù)在Hive的不同版本中行為有差異。在Hive 1.x中它們只接受yyyy-MM-dd HH:mm:ss格式的字符串在Hive 2.x以上可以接受時間戳類型。實際使用時建議先用小數(shù)據(jù)驗證。6.3 實操案例統(tǒng)一多源數(shù)據(jù)的時區(qū)假設你有兩張表一張是UTC的服務器日志一張是東八區(qū)的業(yè)務數(shù)據(jù)需要關聯(lián)分析??梢赃@樣處理with 日志歸一化 as ( select from_utc_timestamp(日志時間, Asia/Shanghai) as 標準時間, 用戶ID, 行為類型 from 服務器日志表 ), 業(yè)務歸一化 as ( select 業(yè)務時間 as 標準時間, 用戶ID, 訂單金額 from 業(yè)務數(shù)據(jù)表 ) select date_format(標準時間, yyyy-MM-dd) as 日期, count(distinct 日志歸一化.用戶ID) as 活躍用戶, sum(業(yè)務歸一化.訂單金額) as 訂單總額 from 日志歸一化 full join 業(yè)務歸一化 on 日志歸一化.用戶ID 業(yè)務歸一化.用戶ID and date_format(日志歸一化.標準時間, yyyy-MM-dd) date_format(業(yè)務歸一化.標準時間, yyyy-MM-dd) group by date_format(標準時間, yyyy-MM-dd);這段SQL的關鍵在于用from_utc_timestamp把日志時間轉(zhuǎn)成東八區(qū)然后跟業(yè)務數(shù)據(jù)在同一個時區(qū)下關聯(lián)。關聯(lián)條件里同時限制了用戶ID和日期避免跨天關聯(lián)導致的數(shù)據(jù)膨脹。注意full join在Hive中會產(chǎn)生大量的NULL值如果數(shù)據(jù)量大建議先用left join或inner join再根據(jù)業(yè)務需求決定是否補全。7. 常見問題與排查技巧實錄7.1 日期函數(shù)返回NULL的六種原因在實際開發(fā)中日期函數(shù)返回NULL是最常見的問題。我整理了一個排查清單按出現(xiàn)頻率從高到低排列問題現(xiàn)象可能原因排查方法解決方案unix_timestamp返回NULL日期字符串格式不匹配用length和rlike檢查格式統(tǒng)一格式或指定格式串datediff返回NULL任一參數(shù)為NULL或格式非法檢查兩個日期字段的空值率用coalesce兜底或過濾臟數(shù)據(jù)date_format返回NULL格式串寫錯或輸入非日期用to_date先轉(zhuǎn)再格式化修正格式串先用to_datefrom_unixtime返回NULL時間戳超出范圍或為負檢查時間戳的數(shù)值范圍過濾異常時間戳months_between返回NULL日期格式不一致檢查兩個日期的格式統(tǒng)一轉(zhuǎn)成yyyy-MM-ddlast_day返回NULL輸入不是有效日期用to_date驗證清洗數(shù)據(jù)后再調(diào)用這張表我貼在工位上很久了每次遇到日期相關的NULL值問題先過一遍這張表八成能定位到原因。7.2 性能問題日期函數(shù)在WHERE子句中的陷阱很多人寫SQL時習慣在where子句里對日期字段做函數(shù)操作比如where date_format(dt, yyyy-MM) 2024-01。這種寫法在邏輯上沒問題但會導致分區(qū)裁剪失效。Hive無法通過函數(shù)操作后的結(jié)果來定位分區(qū)只能全表掃描性能會差很多。正確的寫法是把函數(shù)操作放在等號右邊讓分區(qū)字段保持原樣-- 不推薦 select * from 表名 where date_format(dt, yyyy-MM) 2024-01; -- 推薦 select * from 表名 where dt between 2024-01-01 and 2024-01-31;如果分區(qū)字段是yyyyMMdd格式而你需要按月過濾可以用dt between 20240101 and 20240131或者用dt like 202401%。后者在某些Hive版本中也能觸發(fā)分區(qū)裁剪但不如between穩(wěn)定。這個坑我在至少兩個項目里見過每次都是任務跑得特別慢排查半天才發(fā)現(xiàn)是where子句里用了date_format。后來我養(yǎng)成了一個習慣只要where子句里出現(xiàn)日期函數(shù)就停下來想一想能不能改成范圍過濾。7.3 跨年周數(shù)計算的坑前面提到weekofyear遵循ISO標準這會導致一個現(xiàn)象12月31日可能屬于下一年的第1周1月1日可能屬于上一年的第52周。如果你按year和weekofyear組合來分組跨年那幾天會出現(xiàn)年份和周數(shù)不匹配的情況。比如2024年12月30日year返回2024weekofyear返回1。如果你用concat(year(dt), -, weekofyear(dt))作為分組字段會得到2024-1但實際上這一天屬于2025年的第1周。正確的做法是用date_format(dt, yyyy-ww)它會自動處理這種跨年情況輸出2025-01。這個細節(jié)在算周同比、周環(huán)比時特別重要一旦搞錯跨年那周的對比數(shù)據(jù)就全亂了。我的建議是只要涉及周粒度的計算統(tǒng)一用date_format(dt, yyyy-ww)不要自己用year和weekofyear拼接。7.4 閏年與月末的邊界情況閏年的2月29日是一個經(jīng)典的邊界情況。date_add(2024-02-28, 1)返回2024-02-29date_add(2023-02-28, 1)返回2023-03-01。這個行為是正確的但在做同比計算時要特別注意。比如你要算“去年同一天”的數(shù)據(jù)如果今年是2月29日去年沒有這一天date_sub(2024-02-29, 365)返回的是2023-03-01而不是2023-02-28。處理這種問題的方式是先用last_day判斷月份天數(shù)再做偏移?;蛘哂胊dd_months來做年度偏移add_months(2024-02-29, -12)返回2023-02-28這個行為更符合業(yè)務直覺。月末的情況類似。date_add(2024-01-31, 1)返回2024-02-01這是對的。但如果你要算“下個月的同一天”用date_add加30天可能得到3月1日或3月2日而用add_months(2024-01-31, 1)返回2024-02-29這才是業(yè)務方期望的結(jié)果。所以涉及月度偏移時優(yōu)先用add_months而不是date_add。7.5 日期函數(shù)在數(shù)據(jù)傾斜場景下的優(yōu)化日期函數(shù)本身不會導致數(shù)據(jù)傾斜但如果用日期字段做group by或join的鍵而某些日期的數(shù)據(jù)量特別大比如促銷日、節(jié)假日就會引發(fā)傾斜。這種情況下可以用date_format把日期粒度調(diào)粗比如從按天改成按周或按月減少鍵的數(shù)量。另一種方式是在日期鍵上加隨機前綴打散數(shù)據(jù)后再聚合。比如select 日期, sum(金額) as 總額 from ( select date_format(dt, yyyy-MM-dd) as 日期, 金額, cast(rand() * 10 as int) as 隨機前綴 from 表名 ) t group by 日期, 隨機前綴 -- 再在外層做一次聚合這種方式會增加一次shuffle但在數(shù)據(jù)傾斜嚴重時能顯著提升性能。實際使用時需要權(quán)衡如果傾斜不嚴重沒必要引入這個復雜度。8. 日期函數(shù)在數(shù)倉分層中的最佳實踐8.1 ODS層保持原始格式不做轉(zhuǎn)換在ODS層我的原則是不做任何日期轉(zhuǎn)換保持數(shù)據(jù)接入時的原始格式。原因很簡單ODS層是數(shù)據(jù)的備份和溯源層任何轉(zhuǎn)換都可能丟失信息。如果源數(shù)據(jù)是yyyyMMdd格式就保持yyyyMMdd如果是時間戳就保持時間戳。轉(zhuǎn)換邏輯放在DWD層做。這樣做的好處是當業(yè)務方對日期格式有新的需求時不需要回溯ODS層的數(shù)據(jù)只需要修改DWD層的轉(zhuǎn)換邏輯即可。而且ODS層的數(shù)據(jù)量通常最大不做轉(zhuǎn)換也能節(jié)省計算資源。8.2 DWD層統(tǒng)一日期格式建立日期維度DWD層是日期轉(zhuǎn)換的主戰(zhàn)場。我會在這一層把所有日期字段統(tǒng)一成yyyy-MM-dd HH:mm:ss格式并額外生成一個dt分區(qū)字段格式為yyyy-MM-dd。這樣后續(xù)的DWS層和ADS層都可以直接用dt做分區(qū)裁剪不用再關心原始格式。同時我會在DWD層建立一個日期維度表包含日期、年、月、日、周、季度、是否周末、是否節(jié)假日等字段。這個維度表一次生成長期使用后續(xù)所有跟日期相關的分析都可以關聯(lián)這張表避免在每個查詢里重復計算。-- 日期維度表生成示例 select dt, year(dt) as 年, month(dt) as 月, day(dt) as 日, weekofyear(dt) as 周數(shù), quarter(dt) as 季度, case when dayofweek(dt) in (1, 7) then 1 else 0 end as 是否周末, datediff(dt, 2024-01-01) as 距年初天數(shù) from ( select date_add(2024-01-01, pos) as dt from ( select posexplode(split(space(365), )) as (pos, val) ) t ) t2;這段SQL用posexplode和space生成了一年的日期序列然后計算各個維度。實際項目中日期維度表通常用調(diào)度工具每天增量更新而不是一次性生成全年。8.3 DWS層與ADS層按需聚合避免重復計算到了DWS層和ADS層日期函數(shù)的使用頻率會降低更多的是直接用DWD層已經(jīng)處理好的dt字段做分組和過濾。這一層的重點是避免重復計算。比如日活、周活、月活這三個指標如果每個都單獨寫SQL會有大量的重復掃描。更好的方式是用grouping sets一次性算出多個粒度或者用物化視圖預聚合。我在實際項目中的做法是在DWS層按天粒度匯總好基礎指標ADS層再基于DWS層做周、月、季的匯總。這樣DWS層的數(shù)據(jù)量可控ADS層的查詢也快。日期函數(shù)主要用在DWS層的按天匯總上ADS層基本不直接調(diào)用日期函數(shù)。8.4 實操案例一個完整的日期處理ETL鏈路假設你要從ODS層的原始日志表加工出ADS層的日活指標完整的鏈路是這樣的-- ODS層原始數(shù)據(jù)日期格式為yyyyMMddHHmmss -- 不做任何處理 -- DWD層統(tǒng)一日期格式生成dt分區(qū) insert overwrite table dwd_用戶行為 partition(dt) select user_id, from_unixtime(unix_timestamp(原始時間字段, yyyyMMddHHmmss), yyyy-MM-dd HH:mm:ss) as 行為時間, to_date(from_unixtime(unix_timestamp(原始時間字段, yyyyMMddHHmmss))) as dt, 行為類型 from ods_原始日志; -- DWS層按天匯總?cè)栈?insert overwrite table dws_日活匯總 partition(dt) select dt, count(distinct user_id) as 日活用戶數(shù), count(case when 行為類型 login then 1 end) as 登錄次數(shù) from dwd_用戶行為 group by dt; -- ADS層直接查詢DWS層 select dt, 日活用戶數(shù) from dws_日活匯總 where dt between date_sub(current_date, 7) and date_sub(current_date, 1);這條鏈路里日期轉(zhuǎn)換只在DWD層做了一次后續(xù)所有層都直接用dt字段既保證了性能又避免了格式不一致的問題。9. 我踩過的那些坑與私房技巧9.1 不要相信默認格式Hive的很多日期函數(shù)都有默認格式比如unix_timestamp默認按yyyy-MM-dd HH:mm:ss解析from_unixtime默認按yyyy-MM-dd HH:mm:ss輸出。這些默認值在大多數(shù)情況下沒問題但一旦數(shù)據(jù)格式有偏差就會靜默返回NULL。我的習慣是永遠顯式指定格式哪怕跟默認值一樣。這樣代碼的可讀性更好也避免了版本升級導致的默認值變更。9.2 用to_date做防御性轉(zhuǎn)換在接收上游數(shù)據(jù)時我習慣先用to_date做一次防御性轉(zhuǎn)換。to_date對格式的容忍度比unix_timestamp高一些能處理yyyy-MM-dd、yyyy-MM-dd HH:mm:ss、yyyy/MM/dd等多種格式。如果to_date返回NULL說明數(shù)據(jù)確實有問題可以提前攔截。select case when to_date(日期字段) is null then 異常 else 正常 end as 數(shù)據(jù)質(zhì)量標記, count(*) as 數(shù)量 from 上游表 group by case when to_date(日期字段) is null then 異常 else 正常 end;這個檢查我通常放在ETL任務的第一步跑一遍全量數(shù)據(jù)看看異常比例。如果異常比例超過閾值就觸發(fā)告警人工介入。9.3 日期加減的秒數(shù)計算要留余量用時間戳做日期加減時秒數(shù)的計算要特別注意。比如算“7天前”的時間戳unix_timestamp() - 7*24*3600看起來沒問題但如果跨了夏令時實際的小時數(shù)可能不是168小時。雖然國內(nèi)沒有夏令時但如果你的數(shù)據(jù)涉及海外業(yè)務這個問題就真實存在。更穩(wěn)妥的方式是用date_sub先做日期偏移再拼上時間部分select concat(date_sub(current_date, 7), , 00:00:00);這樣得到的是7天前的零點不受夏令時影響。如果需要精確到秒再用unix_timestamp轉(zhuǎn)成時間戳。9.4 日期函數(shù)在Spark SQL中的差異很多公司用Spark SQL跑Hive表雖然語法大部分兼容但日期函數(shù)有一些差異。比如Spark SQL的date_format對YYYY和yyyy的處理跟Hive一致但weekofyear的起始日定義可能不同。Spark SQL默認周日為一周的第一天而Hive遵循ISO標準周一為第一天。這個差異在跨周計算時會導致結(jié)果不一致。我的做法是在Spark SQL里顯式設置spark.sql.legacy.timeParserPolicyLEGACY讓日期解析行為跟Hive保持一致?;蛘咴赟QL里統(tǒng)一用date_format(dt, yyyy-ww)避免直接用weekofyear。9.5 一個實用的日期函數(shù)速查表最后分享一個我常用的日期函數(shù)速查表貼在顯示器旁邊寫SQL時隨時瞄一眼需求函數(shù)示例當前日期current_date2024-01-15當前時間戳current_timestamp2024-01-15 10:30:00字符串轉(zhuǎn)時間戳unix_timestampunix_timestamp(2024-01-15 10:30:00)時間戳轉(zhuǎn)字符串from_unixtimefrom_unixtime(1705300200)提取日期to_dateto_date(2024-01-15 10:30:00)格式化date_formatdate_format(2024-01-15, yyyyMM)日期加N天date_adddate_add(2024-01-15, 7)日期減N天date_subdate_sub(2024-01-15, 7)日期差datediffdatediff(2024-01-15, 2024-01-01)月份差months_betweenmonths_between(2024-03-15, 2024-01-15)加N個月add_monthsadd_months(2024-01-15, 1)月末日期last_daylast_day(2024-01-15)截取到月trunctrunc(2024-01-15, MM)提取年yearyear(2024-01-15)提取月monthmonth(2024-01-15)提取日dayday(2024-01-15)提取小時hourhour(2024-01-15 10:30:00)周數(shù)weekofyearweekofyear(2024-01-15)UTC轉(zhuǎn)本地from_utc_timestampfrom_utc_timestamp(2024-01-15 02:30:00, Asia/Shanghai)本地轉(zhuǎn)UTCto_utc_timestampto_utc_timestamp(2024-01-15 10:30:00, Asia/Shanghai)這張表覆蓋了日常開發(fā)中90%以上的日期處理需求。剩下的10%通常是組合場景需要根據(jù)具體業(yè)務邏輯來拼接函數(shù)。日期函數(shù)這東西說難不難說簡單也不簡單。關鍵是要理解每個函數(shù)的行為邊界知道什么情況下會返回NULL什么情況下會有性能問題什么情況下結(jié)果跟直覺不一致。把這些邊界情況摸清楚了寫出來的SQL才靠譜。我在實際工作中最大的體會是日期處理沒有捷徑多測、多驗、多對比才能少踩坑。每次寫完涉及日期的SQL我都會用幾組邊界數(shù)據(jù)跑一遍確認結(jié)果符合預期再上線。這個習慣幫我避免了很多次生產(chǎn)事故。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
av东京热男人的天堂| rion磁力链接| 美欧色综合| 中文字幕一区二区三区字幕| 欧美性爱另类综合| 操b网站亚洲无码| 亚洲综合伊人无码久久| 天天做日日做| 天天日日本| 白嫩妹子国产骚| 欧美一区二区三区互相| 荡小穴在线观看| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 天美麻花大全视频| 亚州九九九精品视频| 日比av无码| 欧美精品xxxwww| 久久本道| 久久久精品电影| 亚洲国成人情色好看电影| 综合 亚洲 欧美| 日韩性爱播放| 欧美人妻制服| oumeisetu综合| 超碰美女97| 国模限制级电影| av影片在线观看不卡| 精品人妻1237| 亚洲国产一区二区三区四区国产| 蜜桃AV天堂| caoni国产亚洲av| 97一本大道亚洲一区| 蜜乳av一区二区| 午夜毛片高清免费不卡| 亚洲欧美日韩精品久久久一区二区| 人妻黑丝袜电影| 成片免费播放| 久久久久免费看少妇A片特黄| 中文字幕免费看| 欧美成人性爱视频大全| 国产精品美女久久久久久网站| 四虎884a| 超碰97起碰| 久操91视频| 久久久久久人体| 美女91在线观看| 激情看片网站| 欧美操逼熟女| 色在线视频导航| 亚洲色图国产另类| 日韩女优在线| 大香蕉操久久| 东京热激情视频一二三区| 涩涩涩综合| 久久久久久人体| 欧美午夜视频| 98精品国产乱码久久久久久| 亚洲 欧美 色图| 91激情网| 俺去久久| 亚洲色五月| 久久精品一区二区| 蜜臀99久久精品久久久懂爱| 欧美色狠| a'v在线资源| 久久久久久精| 色色色日本| 久操精品| 男女性感激情网站| 白嫩国模丰满一二三区| 日本三级网页| 欧洲一级性爱视频在线观看| 美女被艹尤物视频| 九九色逼| 大香蕉啪啪啪| 亚洲欧美九九| 五月婷婷hd| 久久精品夜色国产亚洲AV| 蜜桃视频一区二区三区| 91白虎| 四虎884a| 呻吟 欧美 日本 中出| 91午夜无码| 日韩av免费一级电影| 超碰97男人| 欧洲精品区| 一区二区三区麻豆| 18禁无码永久免费无限制| 黄色一区二区秘书性感| 91女网站| 狠狠97| 亚洲黑人在线| 激情综合网五月婷婷五月天| 欧美色棕合| 久噜噜| 99re综合伊人| 免费自拍三级综合| 人妻啊啊人妻啊啊| 18精品一二区| 3D污黄视频在线观看| 92福利社视频| 精人妻一区二区三区| 一级婬片120分钟试看| 亚洲强奸乱伦影视网| 校园春色制服丝袜中文字亚洲| 中文字幕超碰CAO| 日韩精品三级| 美女操逼福利视频| 青青草久久一区网| 日本伦乱九九九综合| 十八禁啪啦拍视频无遮挡| 91国产丝袜足交精品视频| 色婷婷一区二区三区久久午夜| 国产精品久久久久婷婷二区次| 国产av强奸美女| 大香蕉碰碰| 夜夜欧美| 久久久97| 欧美碰碰综合色| 成人精品一区二区91毛片不卡| 97在线免费看| 羞涩视频| 天堂蜜桃无码视频一区二区| 97精品久久| 99免费在线视频| 日韩无码服务区| 一二三四视频中文字幕在线看| 女同亚洲欧美一二三区久久电影| 青娱乐妇女性生活| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| 91丝袜在线播放| 手机看片1024你懂的国产| 91网站视频在线观看| 成人性爱免费播放| 九九热五区| 日韩精品在线视频,日韩精品……| 韩国一级婬片A片AAAAA| 少好三P| 人干人人人操人人摸| 亚洲AV不卡在线观看尤物| 日韩一区二区精彩视频| 欧美综合制服在线| 开心激情婷婷| 爱爱啊啊啊| 青青青国产| 私人尤物在线精品不卡| 91亚洲不卡一区| 成人小说另类在线| 老女人碰碰在线碰碰视频| 久久久久久日韩| 亚洲91网站| 人妻日日干| 国产自啪精品视频网站黑丝| 婷婷五月天成人网| 成·人免费午夜在线观看| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 在线观看岛国有码| 中文字幕一区二区三区四五区| 热九九精品| 久久久久久久91| 男女91| 中文字幕精品日韩中文字幕| 亚洲狠| Av色五月| 99热精品在线| 亚洲AV性爱电影| 熟女乱伦A| 大香蕉伊人一区在线观看| 亚洲天堂五月天国产| 亚洲色丰满少妇高潮| 国产激情久久久| 亚洲高清自拍| 春色91| 夜夜操av亚洲一区二区| 欧美日韩在线国产在线| 中文字幕乱码在线观看| 亚爽爽爽爽爽爽爽爽| 亚洲无码久久久久久久| 一区二区三区亚洲| 欧美日韩中文字幕不卡| 一及黄久一点| 国产少妇与亚洲av| 国产精品无码在线| 国产传媒午夜理伦精品| 美女91在线| 极品后入免费视频| 超碰性爱97| 日本日逼视频网| 久夜视频| 日本五区不卡| 嗯嗯啊啊的视频| 99热这里只有精| 乱伦3P视频| 黄色视频高清无码网站| 亚洲欧美97√| 插B在线观看| 中文字幕加勒比海高清无码免费视频| 免费看久久久性性| 日本免费一级AAA大片器 | 国产一进一出视频网站| 久久精品熟妇丰满人妻99| 日韩精品人妻中文字幕有码午| 99视频内射三四| 国产女人与拘做受视频免费| 亚洲日韩精品久久久久一区壹牛| 欧美色图20P| 色妇91| 一区二区三区四区姦女| 少妇同性| 亚洲色图欧美色图制服丝袜| 人妻天天操天天爽视频免费| 玖玖色综合| 国产一区二区在线电影| 天天天天天天天天天天干美女| 男人的天堂午夜av| 人妻少妇久久中文字幕一区二区 麻豆 | 91久久免费视频互動交流 | 男女真人网18| 欧美性爱97超碰| 婷婷色婷婷| 国产精品熟女丝袜一区二区| 伊人91| 色色五月天婷婷| 丁香六月婷婷| 婷婷五月天久久精品视频一区二区三区 | 精品无码欧美三级| 浓厚中出中文字幕在线| 无码不卡八戒| 美国一区二区三区视频| 伊人影院综合是一个与深夜成人在线| 自拍偷拍 日韩无码| 日韩卡一卡二卡三在线| 久99热| www.99在线| 大香蕉久| 成人精品在线| 精品一区二区三区蜜桃臀赵总| 天天干少妇| 国产少妇与亚洲av| 精品人妻一区二区三区-国产| 国产性感在线观看| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 黄骗免费| 久久久久9999| 高清肉丝中文无码| 成人草草视频| 日韩成人高清一区二区| av网页一区二区三区| 日本黄 R色 成 人网站| 免费看毛片操穴| 欧美狠狠弄| 成人在线视频一区| 强乱老妇中文字幕| 精品久久久av无码免费| 国语精品内射在线观看| 五月激情综合网| 精品久久久久黄少妇| 大香蕉伊在线久草麻豆天堂故事| 久草精品在线| 国内亚洲高清无码| 成人AV在线电影| 毛片视频白嫩| 日本性爰一道本| 亚洲av综合色区无码一| av优播| 五月天亚洲网| 天天躁日日躁狠狠狠躁| 国产女人高潮嗷嗷嗷叫小说| 能看的AV| 久久视频少妇美女| 老司机深夜18禁污污网站| 美国人人操人人操| 99热99re超碰精品| 欧美视频一区二区三区| 岛国大片在线观看网站入口| 殴美牲| 夜夜 中文视频rt| 久久久久久久9| 3d成人精品一区二区| 人妻精品综合中文字幕在线 | 手机av亚洲丝袜美腿日韩第一页二页| 92久久| 国产精品免费美女视频| 色91综合网| 精品国产99999| 亚洲乱色熟女一区| 综合欧美日本三级| 亚洲999综合| 老熟女乱伦一区| 国产精品麻豆成人AV艾秋| 男人下部插入女人下部| 欧美黑人与女人91| 欧美 亚洲 偷拍自拍| 91中文精品日韩欧美在线| 精品亚洲天堂| 一色网男人的天堂| 九久精品| 91美女中出| 欧美色图99| 黑人无码一区二区| 欲女人妻性色av| 亚洲av国产av综合av卡| 极品丝袜无码| 国内外内射高清视频| 久久激情网| 日本亚欧爱爱| 色综合久久888| 综合熟妇一区二区三区| 久久精品亚洲成a人天堂| 成人熟女区| 中文字幕一区二区三区字幕| 日韩精品第3页| 免费成人在线观看91| 狠肏骚人妻| 成人26uuu| 欧美 青青草| 91九色网| 欧美人体性爱互联网第一页婷婷日本| 久久久久精| 性色综合网| 九月丁香| 亚洲av性爱电影| 影音综合网| 国产品精品自在在线午夜免费| 国模少妇一区二区三区| 亚洲色图欧美色18直播在线| 992这里有精品| 97欧美综合| 天美精品av| 久草看看看| 91N欧美| 精品久久久av无码免费| 欲射影视| 欧美成人性爱视频免费观看| 久久久偷拍| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 69少妇一区二区| 国产乱人妻精品入口| 亚洲国产一级精品毛一级精品看免费视频| 超碰在线1234区| 超碰碰碰碰| 日韩欧美大片免费高清啪啪| 91男同| 另类图片五月| 一级性爱网| 天天舔天天日天天射| 秋霞视频一区二区| 亚洲春色一区二区三区| 免费亚洲国产精品久久一区| 五月天婷婷色| 久久9久| 操淫穴亚洲五月丁香| 精品婷婷| 日韩中文字幕国产| 超碰九7| 亚洲性猛交| 九九亚洲| 天天操天天舔| 国产成年女人免费视频播放a| 夜夜做夜夜爽精品视频| 97色插| 日韩午夜精品一区二区三区电影| 91麻豆天美| 乱码人妻一区二区三区| 91 丝袜在线| 这里只有精品视频在线| 国产一区二区三区精品观看啪| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 91久精品| 在线99热| 亚洲精品精品一区二区| 欧美亚洲自拍另类人妻| 99热伊人| 欧美色图欧美| 91中文字幕在线观看| 一直超碰| 久久水蜜臀亚洲AV无码精品| www.91色综合| 激情综合婷婷| 成人国产精品三级A片| 人人操 欧美| 久久久久亚洲| 亚洲91在线| 国产人妻久久精品一区二区三区| 韩日巨乳美女免费视频在线观看| 99在线视频播放| 欧美色图偷拍另类| 欧美日韩淫加| 久无码| 精品人妻二区三区| 抽查国产福利主播| 67194无码不卡| 精品国产乱码久久久久久影片| 激情AV| 国产无马av| 啪啪啪精品视频| 人人摸人人摸人人干| PMv在线观看| 国产自制av蜜乳| 91在线欧美| 亚洲成人在线资源| 亚洲黄色AV电影| 亚洲黄色| 97资源站日韩| 91亚洲综合| 亚洲欧美色图片| 啪啪综合网| 国产丝袜欧美在线视频| 三级激情网站| 99久久精品无码一区二区| 美國A片| 国产成人无码网站在线视频| 欧美日综合| 日韩另类色图| 五月天久久婷婷亚洲| 亚洲 欧美 天天| 婷婷五月天丁香花| 久视频在线观看| 日韩AV一区二区三区三州三州| 97干天天| 精品福利| 亚洲日韩成人性爱视频| 国产后入精品| 我爱搞逼综合网| 啊啊啊啊啊在线| 正在播放国产精品一区| 男人a天堂手机在线版| 丝袜美腿制服人妻二区中文字幕| av优播| 97欧美色资源| 欧美麻豆成人同性GⅤ在线| 精品亚洲国产成人AV制服丝袜| 亚洲综合色网| 国产免费一区| 国产在线视频二区| 国产精品九9| 2020中文字幕在线| 大香蕉视频一二三区| 自偷自拍的亚洲视频| 综合欧美日韩在线| 人妻精品视频一区二区三区| 夜夜草网站| 一本久久精品中文字| 欧美色另类| 亚洲四虎熟女精品| 熟妇高潮二区三区| 日韩综合无码色欲vv| 超碰超碰95| 啊啊啊啊,啊啊好多水| 在线有码中文字幕| 久久综合久久综合人久久夜精品| 久久啊啊| 婷婷综合在线| 久久精品噜噜噜成人看免欧美大片| 成人资源中文字幕在线观看天天| 欧美性生活男人的天堂| 26uuu国产| 十八禁一区二区无码观看| 成年人黄色| 色婷婷丁香五月| 欧美亚州色的图| heyZO天然素人无码AⅤ专区| www.婷婷| 91精品91久久久久77777| 国产精品女生av| 久久久久中出| 大学生美女口爆| 91在线色综合| 精品传媒在线一区| 欧美日韩成人在线| 蜜臀99精品国产高清在线观看| 国产精品激情久久久久久久| 亚洲91网。| 日韩欧美午夜一区二区| 97一区二区蜜臀| 十八禁视频一区二区| 国产嫩草精品A88AV在线| 26UUU欧美日本| 久操操| 欧美五十路熟| www.AV有限公司一区| 手机在线免费看的av| 美女毛片999| 国产精品欧美日韩久久| 欧美九一精品久久久熟妇| 8050午夜少妇无码| 天天肏天天干| 亚洲欧美九九九| 网页导航五月天免费一二三区| 国产自产22区| 骚货操死你| 性色aV一区二区三区噜噜| 性爱网站一区二区| 怡红院怡春院| 日韩色香| 天美国产三级传媒| m欧洲一级午老| 中美日韩毛片| 亚洲男人综合网| www.91色综合| 亚洲欧美大香蕉| 欧美久久九九| 日本一级真人黄色性爱视频| 久久国99999| 翔田千里AⅤHD无码| 密臀AV在线| 91亚洲欧洲| 天天摸夜夜添无码小视频| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 夜草网站| 国产青视频| 国产男女无套视频免费观看| 亚洲图片小说欧洲| 97天天爽| 超碰成人最新最好看| 91超碰丝袜制服| 97精品综合| 香蕉黄色一级视频| 精品无人区麻豆乱码1区2区图片 | 天天躁日日躁xxxxx| 青青草国产一区二区三区| 91亚洲人电影| 日韩一级成人毛片免费观看| 精品国产99999| 麻豆婷婷成人一二三| 最新中文字幕在线亚洲| 国产农村妇女精品| 九色 蝌蚪 熟女自 | 国内精品久久人妻性色av| yazhouzaixian| 亚洲熟女乱熟乱熟妇综合网二区| 无码抄逼网| 国产高清免费不卡av| 欧美性夜| 九九九不卡| 性交一区二区在线播放| 伊人五月天青青草婷婷| 睡产熟女乱伦| 特级毛片特黄久久免费看 | 久久久精品视频欧州站| 久久亚洲天天做| 国产精品天美传媒| 色婷婷小说| 婷婷亚洲色| www.色综合| 色婷婷丁香| 婷婷丁香久久| 久热免费视频| 青青青国产| 欧美视频激情久久久久久| 性色一线| 东京太热久久久| 亚洲有薄码区日本系列中文字幕| 亚洲色图在线视频| 97看操| 在线97在线| 一级黄碟| 人妻另类| 欧美Ⅴ性爱| 1769国内精品视频| 亚洲欧美日韩二区视频| 国产精品一二三区18| 国产精品久久久无码aV去| 69国产对白刺激| 人妻日日干| 天天综合网国产| 97这里都是精品| 亚洲素人综合| 中文字幕精品探花视频| 在线v中文字幕一区二区三区| 99热精品在线观看| 夜夜狠狠躁日日躁色视频| 69人妻精品丰满熟女区| 日日夜夜精品视频| 午夜影美女日鸡鸡天天视频国产| 91狠| 黑人精品欧美一区二区蜜桃| 日韩在线国产字幕| 成年人性爱日韩| 久操在97| 操逼无码一区| 素颜老阿姨乱情色| www.伪伪| 天堂综合| 日日躁天天躁狠狠躁| 性久久久| 久久久久久久久久黄色网| 东北女人操比视频| 91性网| 爆乳免费黄网站| 天天干夜夜鈤| 一起草av| 91狠狠综合网| 天美传媒国产原创中文字幕亚洲欧美另类| 人妻夜爽夜夜爽| 婷婷久久五月天| 亚洲精品电影| 久久理论字幕视频| 国产激情在线| 中文字幕第二页| 欧美性爱另类综合| 四方色播| 麻豆婷婷成人一二三| 91一区二区三区蜜桃| 俺去也婷婷| 躁躁躁日日躁2020| 中文字幕视频2区| 少妇高潮流水av免费| 爱欲AV| 97在线精品观看视频| 欧美91网站| 九九热AV| 精品成人无码| 大香蕉淫人| 中文字幕av色| 日本一区二区三区四区免费观看| 精品人妻一区二区三区蜜桃视频| 99日精品欧美国产| 1769一区| 亚洲综合有码| AV一二区| 丰满人妻-区二区三区免费| 18禁看网站一区| 青青草久草AV| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 操b在线观看| 9999九九九久久久| 性色avv| 久久高清欧美国产| 蜜臀久久99精品久久久久电影| 亚洲综合性感在线| 日本天天吊| 口爆综合网| 欧美嗯啊……在线观看视频免费| 中文字幕一区二区三区高清| 夜色综合| 人妻天堂网| 99re6在线视频播放免费精品| 免费观看啪视频| 日韩啪啪视频| 亚洲色欲天天天堂色欲网女| 欧美日韩另类激情图片| 日本免费二区三区| 超碰综合97在线| 天天天天天天天天综合| 欧美一二在线| 欧洲一区二区三区免费| 九月AV| 免费久久9999| 亚洲欧洲日产国产综合网| 国产精品制服丝袜中文字幕日韩一区二区三区| 国人欧美精品一区二区| 永久免费发布性爱网| 这里只有精品视频在线观看麻豆| 中国一级特黄大片护士| 免费的很黄很污的全部视频| 操操逼视频| 欧美另类精品xxxx| 国产欧美一区激情交| 99操| 日本久久久久久久久| 精精夜夜| 美女诱惑在线一区| 国产免费一区| 超碰在线一区| 国产女性无套 免费观看| 97任你吞精| 天美AV片| 国产一| 97超碰大| 超碰成人公开| 美女刺激久久国产欧美| 粉嫩AV一区夜夜嗨| 午夜精品久久99蜜桃的功能章节| 日韩性爱视频在线免费观看| 超碰碰碰碰| 国产成人天堂| 欧美男人天堂| 在线国产探花| 色在线69堂| J?P?NESEHD熟女熟妇伦| 日本午夜福利影院| 日韩精品怡红院| 丰满熟女一区二区三区在线播放| 亚洲美女自拍偷拍视频| 欧美日韩精品国产91| 欧美翘臀视频网站一区二区三区| 亚洲AV永久无码一区仙野| 亚洲91网。| 国产熟女无套内射| 自拍鲍鱼一区在线高清观看免费| 熟女网站最新| 一级AV性爱| 综合色图,成人综合网| 亚洲日本大香蕉1| 99色热国产视频精品| 国产AV人人 夜夜人人澡| 91欧美网| 冬京热男人的天堂| 国产精品高潮呻吟av久久4虎| 色色五月婷婷| 91丝袜视频在线观看| 国产一区二区视频在线播放| 桑老女人九区| 亚洲黑丝在线| 中文字幕丰满人妻日本| 狠肏骚人妻| 亚洲国产精品成人综合| 品亲网欧美品亲网| 91人妻Pr| 美女网站黄页| 色婷婷狠狠| 精品人妻中文字幕4399| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 欧美日韩另类在线| silk lablo在线观看一区二区| 综合欧美日本三级| 日本操逼视频免费| 人人操人人精品影片| 歐美一級亂黃99在綫精品| 亚洲午夜福利视频| 国产精品无码成人精品| 天天综合网在线观看| 极品色电影院| 色九九九综合| http://qxhbdz.com| 国产精品午夜高潮呻吟久久av| 欧美一区二区三区不卡高清视频| 精品熟妇视频一区二区| 男人精品天堂一区| 天美欧美国产| 亚洲 欧美 另类 日韩 人妻一区| 五月天婷婷基地| 人人看人人摸人人色| 小日子操bb在线看| a片 xxxx受爽视频| 曰韩中文人妻视频| 2019天天干| 大香蕉中文在线| 天天射日日干| 精品人妻一二三| 久久97超碰| 奇米四色网| 亚洲第一页色网| 日韩在线地址一| 狠狠97| 日韩精品一二三| 久久中文字幕人妻熟av女蜜柚| Aa东京男人的天堂| 欧洲一区二区| 精品人妻一二三| 日韩免费簧片| 免费啪啪一级视频| 九九av| 啊好爽受不了无码| 欧洲亚洲人人爽爽视频| 青青操日韩| AV乱伦国产| 全球成人中文在线| 99自拍视频| 无码不卡八戒| 熟妇操花| 亚洲人妻精品一区二区| 丝袜 中出 制服 人妻 美腿 中文字幕| 日韩人妻精品| 91热热色| 美女被啪到深处抽搐视频| 欧美性爱精品七区| 日韩欧美成人午夜福利| 亚洲一区二区三区AV无码 | 丁香六月综合激情| 97色在线观看| 亚洲精品蜜桃久久久久久久| 丰满欧美放荡少妇在线| 99热在线播放| 日韩av不卡在线看| 秋霞视频一区二区| 国产原创精品| 国产精品在线一区二区| 东京热男人天堂| 欧美偷拍区| 中文字幕成人理论在线| 熟妇在线视频一区二区| 久久蜜色情在线视频xxx免费观看| 色麻豆AV| 久久色精品视频在线| 一级片在线观看高清无码| 无遮挡猛进视频免费无限观看| 欧美亚州手机在线| 青青草玖玖爱| 亚洲福利影院一区久久| 国产精品女久久久久av爽| 99色色网| 97超碰免费生活| 亚洲精品久久久久毛片A片拉屎| 欧美综合娱乐久久| 国产999精品久久久久久| 噜噜噜亚洲精品| 色97干| 人人操人人搞人人草| 91 刺激在线| 欧美成人国产精品| 亚洲欧美日韩制服另类| 乱色视频中文字幕| 欧美曰韩国产精品| 欧美中文综合| 日韩性爱视频免费在线 | 午夜男女爽爽大片免费观看| 成人av动漫在线观看| 大香蕉99热| 亚洲全色网| 中文字幕在线日亚洲9| 欧美人妻制服| 精品成人亚洲午夜电影| 成人影 天天操 亚洲| 91中文字幕在线观看| 日韩性爱1级片视频| 日日日啊啊啊| 天美91| 看一级黄色视频| 嗯嗯啊啊的视频| 亚洲av无码成电影在线播放| 丝袜六区| 欧美激情区| 色色婷婷五月| 亚洲性刺激| 亚洲 欧美 手机在线观看| 欧美白嫩在线放| 99人妻碰碰碰久久久久禁片| 亚洲精品视频二区| 国产精品不卡少妇白| 午夜天堂啪啪| 蜜臀在线网站| www久久99| 限制级中的三级片中的黑粗大屌屌日人妻熟女 | 韩国一级AAA| 精品人妻一区二区乱码一区二区| 国产精品人妻免费精品| 人人乐大香蕉| 亚洲情色欧美| 久久精品天美| 亚洲精品尤物yw在线影院| 午夜成人福利影视| 国产一区免费午夜视频| 欧美白嫩女HD| 日本东京热加勒比久久| 欧美大色交| 福利色色| 亚洲综合有码| 青青草视频久久| 色悠久| 极品粉嫩一区二区| 国产成人无码啪| 青娱乐手机日韩在线视频| 国产精品盗摄 偷窥盗摄| 黑人天8A∨高清网站| 国产精品久久久久久久电影渣男| 丝袜美腿校园春色| 啪啪免费| 亚洲熟女人妻中文字幕一区二区| 青青草日韩无码| 国产在线播放成人免费| 亚洲精品 超碰| 亚洲精品人妻在线| 素人伊尹大香蕉免费下载视频| 97色碰| 人人爱人人乐人人操| 天天享受天天看| 乱伦av麻豆| 婷婷丁香人妻 | nuu12国产麻豆精品| 九九热精品| 100啪啪视频大全| 99最新日韩偷拍视频| 在线 制服丝袜中出 人妻| 极品国产内射| 综合性视频99| 午夜激情床戏激情| 国产欧美精选激情视频| 亚洲黄色电影| 亚洲一区二区专区-国产丝袜精品丝袜-成人AV| 26uuu国产成人综合| 超碰诱惑| 亚洲诱惑| 热久久这里只有精品| 熟妇xxxxx性春色| 伊人宅男大香蕉| 午夜欧美神马久久久久| 岛国精品视频在线观看 | 97频视在线| 久久99热这里只频精品6学生| 欧美人人操人人插| 日本免费二区三区| 麻豆精品A片免费观看| 日本片日本片祼观看网站在线看中文版网页在线看 | 亚洲综合伊人无码久久| 中文字幕乱碼在线| 亚洲综合成人网| 日本欧美一区二区三区视频麻豆| 97在线观看视频| 色色99| 欧美黑人猛交春色影视大全| 操逼操网| 99视频这有这里有精品| 男人的天堂va在线| 久热大香蕉网站| 美女裸体麻豆天美蜜桃91| www.狠狠| 日日碰狠狠添天天爽超| 日韩中文字幕视频| 91国模| 91日韩网站| 2019亚洲男人天堂| 丰满精品人妻少妇久久字幕| 曰韩欧美国产传媒麻豆第一区| www黄片免费看com| 亚洲国产一区二区日韩专区| 嗯嗯啊好爽| 久区视频| 超碰4A| 亚洲系列欧美| 亚洲精品国产av天美传媒| 国产黄a三级三级三级av在线看| 欧美日韩操逼嗦吊| 韩日无码在线观看| 精品亚洲国产成人精品| 免费αV在线视频| 粉嫩av在线| 亚州综合在线| 欧美精品黑人猛交高潮| 殴美色网| 久久亚洲一区女同性恋中文字幕| 国产精品一级二级在线| 亚洲精品 欧美精品| 久久久久久久久久黄色网| 亚洲高清内射| 久久超碰免费的| 超碰碰97| 热久久国产精品视频大陆精品| 日欧美色| 欧美在线55555| 91天天爱| 青青三级视频| 在线情色电影 91大 | 蜜臀人妻少妇久久在线观看| 天天干天天日天天射黄色| 六六久久日韩不卡| 天美传媒av 在线| 亚洲色欲一区二区三区| 久久嫩草国产成人一区| 亚洲狼狼干综合1| A啊啊在线观看| 亚洲熟女乱综合一区二区三区| 国产乱码精品久久久久久| 小草av不卡亚洲二区 | 亚洲高清无码免费观看视频| 六月丁香啪啪| 人妻啊啊人妻啊| 日日干日日操五月天伦理视频| 欧美性,色九九| 欧美伦乱爱| 941超碰| 九九热精品视频六| 国产91精品在线免费| 婷婷av在线中文字幕| 欧亚性爱在线视频| 精品一区二区成人动漫| 久久精品国产精品亚洲艾通辽熟妇| 艳美熟妇先锋一二三区| 亚洲男人的天堂AV| 超碰 国产熟女精品一区| 91丝袜人妻| 青娱乐淫乱1314| 成人八戒网站| 色综合天天| 91精品丝袜久久久久久无码人妻| 涩涩久久精品| 日韩三级av片| 国产综合在线视频网站| 偷拍自拍在线视频观看| 日韩熟妇二区| 欧美亚洲美少妇一区二区| 成人情色综合网| 岛国在线国产| 丁香九月激情啪| 毛片17S| 蜜臀在线看片| 神马久久久久久久| 91在线精品| 久久精品免费| 日韩丨制服丨中文|在线| 我想要 啊 啊 啊| 超97在线精品视频| av天天在线观看| 欧美激情久| 久操97| 91强热人妻| 很黄很污的免费网站| 人妻激情在线视频| 欧美中出| 爱做久久久久久| 熟女自慰久久久| 91九色丨风韵犹存| 一线黄色免费性爱片| 欧美|91色综合| 精品人妻伦一区二区三区久久| 99色网| 欧美日韩操逼嗦吊| 久久水蜜臀亚洲AV无码精品| 国产精品一区在线播放| 中文精品一区二去| 91丝袜美腿网站| 78精品| 国产亚州精品美女久久久免费| 美女高潮视频91| 国产精品国产精品国产| 国产视频一区二区免费| 色香在线| 亚洲国产成人精品久久久国产成人一区二区 | 欧洲综合视频| 97国产|免费| 欧美东京热精品A∨| 久久国99999| 欧亚无码视频| 91女网站| 91w欧美| 五月天婷婷久久| 久久久无码精品人妻二区| 色嗨嗨在线| 91老熟女老女人国产老太| 精品人妻一区二区三区四区石在线| 天天干天天做| 亚洲激情在线| 狠狠五月天| 青青青青青手机视频| 青青草天天亲夜夜操网| 在线 欧美 亚洲| 国产日本久久免费精品| 久久精品成人一区二区三区蜜臀 | 天堂综合| 中文字幕aⅴ在线视频| 97在线资源| 91c色| 91激情国产| 欧美性爱精品一区二区| 深爱伊人影院| 99热99色| 久久久久久加勒比| 久久思思热| 婷婷超| 天天看人人操屄犊摸阴| 国产精品久久aV| 色偷偷色偷偷欧美日韩| 国产啊v在线免费播放| 色九九综合AV| 日本理论在线| 大香蕉中文网| 毛片视频白嫩| 74成人在线| 风骚少妇视频中文字幕| 一区三区啪啪| 国产精品网址| 蜜臀人妻少妇久久在线观看| 久久无码一区二区二三区性色| 青春草A| 图片区小说区| 97干在线视频| AV一二区| 国产亚州高清国产拍精| 精品免费囯产一区二区三区| oumeisetu综合| 日韩精品一区二区高清| 2020中文字幕在线| 亚洲男人bt天堂| 亚洲成人精品在线一区| 操逼999| 嗯嗯啊啊视频在线看| 乱抡国产91| 国产熟女自拍| 亚洲日本韩国极品一区二区| 欧美偷拍区| 日1区2区3区2020| 1024亚洲中文字幕久在线看片你懂的 | 亚洲熟女乱色一区二区三区| 熟妇高潮精品一区二区三区下载| 午夜免费福利视频一区| 午夜小电影在线插入淫高潮| 神马久久啊啊| 久99| 操逼国产免费| 97视频免费播放| 欧美日韩青操| 亚洲色图久久成人| 高清无码 国产精品| 日韩在线电影| 青青伊人久久| 91在线综合网| 欧亚在线视频| 日韩成人在线性爱视频| 91欧美色| 欧美超碰人妻97| 国产精品白虎| 日本欧美国内在线| 再深点灬舒服灬太大了添视频| 992大香蕉| 性交一区二区在线播放| 久久色一区| 97在线精品| 国产不卡免费在线视频| 国产午夜在线观看| 91色欧美| 久久高清无码夜夜操| 97香蕉人人乳| 国产天美欧美| 亚洲九区| 手机在线视频国内精品| 成人av性爱电影在线观看| 精品人妻一区二区三区视频在线| 蜜臀亚洲综合一二三四区| 九九玖玖精品| 色蜜AV| 日本久久精品| 日韩av在线免费网站| 久久中文字幕一区不卡| 91亚洲综合| 97伊人网| 麻豆av一区二区| 九九九九精品在线| 国产热av| 青青草久久| 粉嫩久久久久| 神马久久久久久久久久| 天天干天天日天天射黄色大片 | 亚洲在线A| 果冻传媒一区二区三区| 亚洲精品1区| 国产精品密臀网在线观看| 91新在线欧美| 欧美少妇第一页| 成人色女网| 亚洲狼狼干综合1| 亚洲aw毛茸茸在线| 亚洲丝袜B诱惑| 91欧美成人色站| 大香蕉天天看妹子| 91国产大片| 亚洲永久永久永久永久一级一级一级精品| 在线观看 99热| 久久永久无码人妻视频| 99re在线| A 天堂| 日产操逼| 最新国内自拍av免费| 亚洲国产成人精品久久久国产成人一区二区 | 女沟厕偷窥piss小便| 亚洲色狠| 黄色免费网| 欧美极品性爱天天射| 久久成人午夜精品影院 | 91日韩网站|