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

ARTICLE DETAIL

資訊詳情

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

Hive函數(shù)從入門到實戰(zhàn):內(nèi)置函數(shù)、窗口函數(shù)與UDF自定義函數(shù)完整解析

Hive函數(shù)從入門到實戰(zhàn):內(nèi)置函數(shù)、窗口函數(shù)與UDF自定義函數(shù)完整解析 1. 先搞清楚 Hive 函數(shù)到底是怎么回事做了這么多年數(shù)倉開發(fā)我發(fā)現(xiàn)很多人在接觸 Hive 函數(shù)時習(xí)慣性地把它當(dāng)成 SQL 函數(shù)的一個“方言版本”。這種理解不能說錯但會埋下不少坑。Hive 函數(shù)真正特殊的地方在于它運行在分布式計算引擎上處理的是“一批數(shù)據(jù)”而不是“一行數(shù)據(jù)”這就讓它的執(zhí)行邏輯、使用邊界和優(yōu)化手段都和傳統(tǒng)關(guān)系型數(shù)據(jù)庫里的函數(shù)有很大區(qū)別。Hive 函數(shù)解決的核心問題說白了就是在海量數(shù)據(jù)上完成清洗、轉(zhuǎn)換、聚合、分析這些動作而不用你去寫 MapReduce 程序。而且 Hive 函數(shù)體系本身也足夠龐大從最簡單的字符串截取到復(fù)雜的自定義聚合基本覆蓋了離線數(shù)倉開發(fā)里九成以上的數(shù)據(jù)處理訴求。這篇文章會從我實際項目的角度出發(fā)把 Hive 函數(shù)從內(nèi)置到自定義從常用姿勢到避坑經(jīng)驗完整拆一遍希望能給正在做數(shù)倉開發(fā)、數(shù)據(jù)分析和 ETL 的同學(xué)一些實在的參考。有一點得先說透只記住某個函數(shù)的語法是沒用的如果你不清楚它的觸發(fā)時機、NULL 值處理邏輯、以及它在分布式環(huán)境下的執(zhí)行特性那上線之后出問題的概率會非常大。所以這篇文章里我不會只列函數(shù)清單更重要的是把“為什么這樣用”“在什么場景下踩過坑”講清楚。適合看這篇內(nèi)容的人我大致分了三類剛?cè)腴T的數(shù)據(jù)分析同學(xué)需要掌握核心函數(shù)來寫日常取數(shù)邏輯做數(shù)倉 ETL 的開發(fā)需要理解自定義函數(shù)和窗口函數(shù)的底層行為以及所有被數(shù)據(jù)傾斜、NULL 值異常、UDF 性能問題折磨過的同學(xué)。1.1 Hive 函數(shù)的本質(zhì)與核心使用場景Hive 函數(shù)的本質(zhì)可以理解為把復(fù)雜的數(shù)據(jù)處理邏輯封裝成一個可復(fù)用的操作單元并交給底層的計算引擎去分布式執(zhí)行。比如你要對一億條用戶行為日志做正則匹配提取 URL 中的關(guān)鍵參數(shù)如果自己寫 MapReduce要處理輸入分片、map 階段的逐行處理、輸出序列化等等工作量不小而用regexp_extract這個 Hive 函數(shù)一行 SQL 就搞定了。所以 Hive 函數(shù)的核心價值就是把通用的數(shù)據(jù)處理邏輯做成標(biāo)準(zhǔn)化操作讓你把精力集中在業(yè)務(wù)問題上。在實際的項目里Hive 函數(shù)主要覆蓋這么幾類場景數(shù)據(jù)清洗場景字段拼接、字符串分割、正則替換、JSON 解析、空值兜底這些是數(shù)據(jù)入倉后最常做的事。統(tǒng)計分析場景按照維度分組后做求和、均值、去重計數(shù)以及更復(fù)雜的百分位估算。行轉(zhuǎn)列與列轉(zhuǎn)行場景把一條記錄展開成多行或者把多行數(shù)據(jù)合并成一個數(shù)組支撐寬表開發(fā)和特征加工。窗口分析場景排行、累計、同比環(huán)比、相鄰行對比這是數(shù)倉需求中占比很大的部分。我一直主張一個觀點看一個 Hive 開發(fā)者水平怎么樣不要看他會不會寫復(fù)雜的 join而是看他能不能把函數(shù)用得恰到好處。因為 join 的邏輯是固定的套路而函數(shù)的選擇往往決定了一個任務(wù)的性能上限和代碼的可維護性。1.2 Hive 函數(shù)的家族譜系從內(nèi)置函數(shù)到自定義函數(shù)Hive 函數(shù)大體上可以分成兩條主線內(nèi)置函數(shù)和自定義函數(shù)。內(nèi)置函數(shù)是 Hive 開箱即用的能力自定義函數(shù)則是當(dāng)內(nèi)置函數(shù)滿足不了業(yè)務(wù)需求時你用 Java 或者其他語言自己擴展的實現(xiàn)。內(nèi)置函數(shù)按用途又可以細分成幾類我通常這樣歸類函數(shù)類別典型函數(shù)主要用途數(shù)值函數(shù)round, floor, ceil, abs, rand數(shù)值計算、取整、隨機抽樣字符串函數(shù)concat, substring, split, regexp_replace字符串加工、正則處理、字段拆分日期函數(shù)from_unixtime, unix_timestamp, datediff, date_add時間戳轉(zhuǎn)換、日期偏移、間隔計算條件函數(shù)if, case when, nvl, coalesce, nullif邏輯分支、空值兜底聚合函數(shù)count, sum, avg, collect_list, collect_set分組統(tǒng)計、列轉(zhuǎn)行窗口函數(shù)row_number, rank, lag, lead, sum over排行、同比環(huán)比、累計計算特殊函數(shù)explode, posexplode, lateral view行轉(zhuǎn)列、JSON 展開而自定義函數(shù)這邊按輸入輸出的關(guān)系分成三類。UDF 是一進一出比如給你一個字符串返回處理后的字符串UDAF 是多進一出做自定義聚合UDTF 是一進多出把一行展開成多行。這三類我在后面的第 4 節(jié)會詳細拆。2. 最常用的內(nèi)置函數(shù)數(shù)值、字符串與日期實操內(nèi)置函數(shù)雖然多但說句實話日常開發(fā)中真正高頻使用的也就那三四十個。我在多個項目里統(tǒng)計過開發(fā)人員寫的 Hive SQL 中超過八成的函數(shù)調(diào)用集中在字符串處理、日期轉(zhuǎn)換和條件判斷這三類。所以先把這批函數(shù)玩熟比死記硬背完整的函數(shù)列表有用得多。2.1 數(shù)值處理與字符串函數(shù)的使用細節(jié)數(shù)值函數(shù)里常用的無非就是round做四舍五入、floor向下取整、ceil向上取整、abs求絕對值以及rand做隨機抽樣。這里要說一個細節(jié)round在 Hive 里的行為是“四舍五入”但它的實現(xiàn)方式和很多編程語言里的有點差異。Hive 的round是基于Math.round實現(xiàn)的對于負數(shù)它遵循的是“四舍五入到最接近的整數(shù)”的規(guī)則。比如round(-2.5)的結(jié)果是 -3而不是 -2。這在做金額分攤或者比率計算的時候如果沒留意就會產(chǎn)生 1 分錢的誤差。別小看這個誤差對過賬系統(tǒng)來說1 分錢的對不上都會被當(dāng)成數(shù)據(jù)事故。字符串函數(shù)這塊concat和concat_ws是出場率最高的兩個。很多人習(xí)慣用concat拼字段但一旦要拼的某個字段是 NULL結(jié)果就會變成 NULL整個字段就廢了。concat_ws就好用在這它會跳過 NULL 值而且支持指定分隔符。我寫過一句很典型的 SQLconcat_ws(-, year, month, day)用來拼分區(qū)字段這樣即使某一天的數(shù)據(jù)缺失也不會把整個分區(qū)路徑弄壞。split用來做字符串切分返回結(jié)果是數(shù)組。這里要注意的是Hive 的split第二個參數(shù)是正則表達式不是普通字符串。如果你要按點號切分 IP 地址直接寫split(ip, .)是切不動的因為點號在正則里是通配符必須寫成split(ip, \\.)。類似的還有按豎線切分要寫成split(str, \\|)。這個坑我見過不少同學(xué)踩過排查半天發(fā)現(xiàn)是正則的問題。regexp_replace和regexp_extract是正則處理里的黃金搭檔。前者是做替換后者是提取子串。regexp_extract提取的時候第二個參數(shù)里用括號圈出你要的部分第三個參數(shù)指定取第幾個括號里的內(nèi)容。比如從 URL 里提取 user_idregexp_extract(url, user_id(\\d), 1)。這里第三個參數(shù)寫 1 就表示取第一個括號匹配到的內(nèi)容。另外要留意正則的貪婪匹配問題有時候你會提取到超出預(yù)期的內(nèi)容。如果遇到這種情況可以在正則后面加問號改成非貪婪模式。JSON 解析函數(shù)在日志分析場景里是剛需。get_json_object可以從 JSON 字符串里取指定字段比如get_json_object(json_str, $.username)。但get_json_object的效率并不好尤其是對一個大 JSON 反復(fù)取多個字段時會執(zhí)行多次解析。這里更推薦的做法是用一次json_tuple配合lateral view把多個字段一次性拆出來解析只做一遍性能會好很多。2.2 日期函數(shù)與類型轉(zhuǎn)換的實戰(zhàn)要點日期函數(shù)這塊核心就圍繞三類操作時間戳與字符串互轉(zhuǎn)、日期加減、日期差計算。時間戳轉(zhuǎn)字符串用from_unixtime(unix_timestamp, pattern)比如from_unixtime(ts, yyyy-MM-dd HH:mm:ss)。反過來字符串轉(zhuǎn)時間戳用unix_timestamp(2024-06-01 12:00:00, yyyy-MM-dd HH:mm:ss)。這里的重點是格式模式里的字母區(qū)分大小寫yyyy表示四位的年份YYYY在 Hive 里有時候代表的是“周所在的年份”在跨年的時候可能和yyyy結(jié)果不一致。我建議統(tǒng)一用yyyy避免年底年初這種邊界時段出現(xiàn)意料之外的數(shù)據(jù)。日期加減是date_add和date_sub支持傳入負數(shù)實現(xiàn)相反方向的操作。比如想拿到 30 天前的日期可以寫date_sub(current_date(), 30)也可以寫date_add(current_date(), -30)。我個人更推薦用date_sub表達往前推的語義代碼讀起來直觀。求日期差用datediff(end_date, start_date)返回值是前者減后者的天數(shù)。這里有一個容易搞錯的地方datediff是按天計算的會被取整如果兩邊帶時分秒差值會被截斷不會四舍五入。所以你如果想要精確到小時的間隔不要用datediff直接用兩個時間戳相減再除以 3600 秒。類型轉(zhuǎn)換函數(shù)里cast是通用的轉(zhuǎn)換入口cast(x as int)、cast(x as decimal(10,2))。但cast有個非??拥男袨檗D(zhuǎn)換失敗時不會報錯而是返回 NULL。比如cast(abc as int)的結(jié)果是 NULL如果你的下游邏輯沒有針對 NULL 做處理數(shù)據(jù)就悄悄丟了。所以我在寫類型轉(zhuǎn)換時幾乎都會配合case when先做合法性校驗。額外提一個函數(shù)try_cast這個不是 Hive 原生的是某些引擎擴展的功能是轉(zhuǎn)換失敗返回 NULL 而不是拋異常。如果你所在的環(huán)境支持可以放心用不支持就老實寫校驗邏輯。3. 聚合函數(shù)與窗口函數(shù)數(shù)倉開發(fā)的重頭戲聚合函數(shù)和窗口函數(shù)是 Hive 函數(shù)體系里最有分析深度的一塊。很多取數(shù)需求表面上看起來復(fù)雜拆解到最后基本都是聚合加窗口的組合拳。把這兩類函數(shù)吃透復(fù)雜報表開發(fā)起來會順手很多。3.1 聚合函數(shù)的行為細節(jié)與常見用法聚合函數(shù)的輸入是多行數(shù)據(jù)輸出是一行結(jié)果。count、sum、avg、max、min這五個是最基礎(chǔ)的。先說count的細節(jié)count(*)統(tǒng)計的是行數(shù)包括某列為 NULL 的行count(column)統(tǒng)計的則是該列非 NULL 的值的個數(shù)。很多新手在這里栽過跟頭統(tǒng)計用戶量的時候用count(user_id)如果 user_id 存在 NULL結(jié)果就會偏少。而count(distinct column)是去重計數(shù)這個好用但在數(shù)據(jù)量很大的時候要特別小心因為count(distinct)的底層實現(xiàn)容易引發(fā)數(shù)據(jù)傾斜。聚合函數(shù)里有兩個在數(shù)倉開發(fā)中出場率很高但很多人用不好的函數(shù)collect_list和collect_set。它們的作用是把分組內(nèi)的多行數(shù)據(jù)合并成一個數(shù)組前者保留重復(fù)元素后者自動去重。典型場景是行轉(zhuǎn)列比如把某個用戶的所有訂單號聚合成一個數(shù)組再配合concat_ws拼成字符串。但要注意collect_list得到的數(shù)組元素順序是不保證的如果你想控制順序先在子查詢里排好序再在外面聚合。雖然官方?jīng)]有嚴格保證這種方式必然生效但實際操作中大部分版本是可行的也算是一種廣為流傳的土辦法。avg在 Hive 里的返回值是 double 類型如果你需要精確的小數(shù)位控制建議先轉(zhuǎn)成 decimal 再求平均比如avg(cast(amount as decimal(10, 4)))。另外聚合函數(shù)處理 NULL 的規(guī)則是“忽略 NULL”比如sum遇到一組全是 NULL 的數(shù)據(jù)返回的是 NULL 而不是 0。這個和很多人的直覺相反所以在做指標(biāo)計算時我習(xí)慣用coalesce(sum(x), 0)把 NULL 兜底成 0避免下游報表出現(xiàn)空值。百分位估算函數(shù)percentile和percentile_approx也值得單獨說。前者要求輸入是整數(shù)列后者可以接受浮點數(shù)列并且可以傳入一個精度參數(shù)控制估算質(zhì)量。在計算 UV 分布、耗時中位數(shù)這類指標(biāo)時非常有用而且底層做了近似算法不會像count(distinct)那樣產(chǎn)生嚴重的傾斜問題。3.2 窗口函數(shù)排序、偏移與累計計算的完整拆解窗口函數(shù)的計算方式和普通聚合函數(shù)最大的區(qū)別在于聚合函數(shù)把多行結(jié)果壓縮成一行窗口函數(shù)保留每一行同時附加一個聚合結(jié)果在旁邊。這個特性讓窗口函數(shù)成了分析場景里的主力工具。排序相關(guān)的窗口函數(shù)有三個row_number、rank、dense_rank。它們的區(qū)別我在項目里驗證過很多次row_number不管并列情況給一個連續(xù)且唯一的編號rank遇到并列時會跳號dense_rank不跳號。舉個實際場景取每個用戶最近一次訂單直接用row_number() over(partition by user_id order by order_time desc)就能定位而做榜單排名希望并列名次占用相同位次就用rank。偏移函數(shù)lag和lead是做環(huán)比、同比分析的神器。lag(column, offset, default)取當(dāng)前行往前數(shù)第 offset 行的值lead則往后取。比如計算日活環(huán)比增長可以先按日期排序再用lag(dau, 1)取前一行的日活值然后直接算增長率。需要注意lag在最前面幾行是沒有值可取的如果不傳第三個默認值參數(shù)返回的是 NULL下游要做過濾或兜底。累計計算是另一種高頻用法。sum(amount) over(partition by user_id order by order_time rows between unbounded preceding and current row)就是非常典型的累計求和的寫法。這里的關(guān)鍵是窗口子句rows between ... and ...它定義了累加的范圍。還有rows between 1 preceding and current row表示統(tǒng)計當(dāng)前行和上一行兩行的合計常用于滑動計算。如果你不加窗口子句默認窗口是從分區(qū)起點到當(dāng)前行也就是自然形成累計效果。這里要提醒一個很多人忽略的坑在使用排序相關(guān)的窗口函數(shù)時如果order by的字段存在大量重復(fù)值不同函數(shù)的執(zhí)行行為會產(chǎn)生差異。例如sum() over(order by x)在 x 重復(fù)時累計值會把所有相同 x 的行一起算進去而不是逐行累加。這個行為在不同引擎里可能不一致遇到需求明確要逐行累計的場景建議在 order by 后面加上唯一字段做次級排序。3.3 窗口函數(shù)與表生成函數(shù)的協(xié)同實戰(zhàn)窗口函數(shù)偶爾需要配合表生成函數(shù)使用典型場景是展開 JSON 數(shù)組后再對展開后的行做編號或排名。表生成函數(shù)的核心是explode它可以把一個數(shù)組或者 map 展開成多行。比如埋點日志里某個字段存的是商品 id 列表用explode就能把一條日志展開成多條商品記錄。但在 Hive 舊版本里explode不能直接在 select 語句里和其他字段一起查詢必須配合lateral view。lateral view的字面意思就是“側(cè)視圖”它把 explode 產(chǎn)生的虛擬表和原始行關(guān)聯(lián)起來。一個典型寫法是select user_id, order_id from orders lateral view explode(split(product_list, ,)) t as order_id;這種寫法把product_list字符串切成數(shù)組再展開成多行每一行都保留原來的user_id。posexplode是explode的增強版它會額外帶一個下標(biāo)列可以用于記錄展開后元素的原始下標(biāo)這在還原數(shù)組順序時很有用比如拼接的商品順序不能亂。在做用戶標(biāo)簽場景時我經(jīng)常把lateral view explode和窗口函數(shù)放在一起用。先把每個用戶的標(biāo)簽數(shù)組展開再用row_number給每個標(biāo)簽做排序之后根據(jù)標(biāo)簽優(yōu)先級取第一條整個處理鏈路非常流暢。4. 自定義函數(shù)系統(tǒng)函數(shù)不夠用時的突圍方案內(nèi)置函數(shù)再豐富也總有覆蓋不到的業(yè)務(wù)邏輯。比如解析一套內(nèi)部自定義的加密協(xié)議字段、計算兩個地理位置的距離、實現(xiàn)一套特殊的分組邏輯這些時候就需要自己寫函數(shù)擴展 Hive 的能力。4.1 UDF、UDAF、UDTF 的選型與核心原理自定義函數(shù)按輸入輸出關(guān)系分成三類UDF輸入一行輸出一行。這是最常用、最容易上手的一類。典型場景是字符串加工、字段解析、格式標(biāo)準(zhǔn)化。UDAF輸入多行輸出一行本質(zhì)是自定義聚合函數(shù)。典型場景是實現(xiàn)自定義統(tǒng)計指標(biāo)比如加權(quán)平均、分組去重拼接。UDTF輸入一行輸出多行。典型場景是把一行數(shù)據(jù)展開成多行類似內(nèi)置的explode。選型的原則其實很簡單你在 SQL 里要替換的是一個普通字段轉(zhuǎn)換就用 UDF要替換的是group by里的聚合邏輯就考慮 UDAF要替換的是explode這種行轉(zhuǎn)列操作就寫 UDTF。UDF 的實現(xiàn)底層依賴 Hive 的反射機制。你在 SQL 里寫my_func(x)Hive 會去找到對應(yīng)的 Java 類實例化后把每一行的數(shù)據(jù)傳進去調(diào)用你實現(xiàn)的evaluate方法。這里的核心是同一個 UDF 實例會被多個計算節(jié)點并發(fā)使用所以你的實現(xiàn)里不能有可變的狀態(tài)變量。我見過有人把計數(shù)器寫在 UDF 的成員變量里以為能統(tǒng)計處理行數(shù)結(jié)果數(shù)據(jù)完全對不上原因就是每個節(jié)點各自維護了獨立的實例。4.2 一個 UDF 從開發(fā)到上線的完整流程下面用一個實際案例走一遍全流程。假設(shè)業(yè)務(wù)方要求從訂單號中解析出訂單來源渠道訂單號的規(guī)則是“渠道編碼 日期 序列號”拼接而成比如A01_20240601_000123A01 就是渠道編碼。內(nèi)置函數(shù)當(dāng)然也能用split來解析但這類邏輯如果散落在幾十個 SQL 里維護成本會很高封裝成 UDF 更合理。第一步創(chuàng)建 Maven 工程引入 Hive 依賴。dependency groupIdorg.apache.hive/groupId artifactIdhive-exec/artifactId version3.1.2/version scopeprovided/scope /dependency第二步寫 UDF 實現(xiàn)類。繼承org.apache.hadoop.hive.ql.exec.UDF實現(xiàn)evaluate方法。import org.apache.hadoop.hive.ql.exec.UDF; public class OrderChannelParser extends UDF { public String evaluate(String orderId) { if (orderId null || orderId.isEmpty()) { return null; } String[] parts orderId.split(_); return parts.length 0 ? parts[0] : null; } }evaluate方法可以重載多個版本Hive 會根據(jù)調(diào)用時傳入的參數(shù)類型自動選擇。所以同一個 UDF 類可以實現(xiàn)支持多種輸入類型比如既有String evaluate(String)又有String evaluate(String, String)調(diào)用時的不同參數(shù)會路由到不同方法。第三步將項目打成 jar 包上傳到 Hive 能訪問到的目錄然后注冊函數(shù)。add jar hdfs://your-path/order-parser.jar; create temporary function parse_order_channel as com.example.OrderChannelParser;這里temporary關(guān)鍵字表示只在當(dāng)前會話生效適合開發(fā)和測試。如果你要把函數(shù)做成永久能力可以執(zhí)行create function parse_order_channel as com.example.OrderChannelParser using jar hdfs://your-path/order-parser.jar;第四步在 SQL 里調(diào)用驗證結(jié)果。select parse_order_channel(order_id) as channel, count(*) as cnt from orders group by parse_order_channel(order_id);整個流程跑通之后業(yè)務(wù)方后續(xù)所有解析渠道的需求都只需要調(diào)用這一個函數(shù)代碼復(fù)用性大幅提升而且排查問題時只需要看一個類不用翻十幾個 SQL。4.3 UDAF 與 UDTF 的實現(xiàn)要點與注意事項UDAF 的實現(xiàn)會比 UDF 復(fù)雜一個量級。在 Hive 2.0 以上的版本里推薦使用org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver配合GenericUDAFEvaluator的實現(xiàn)方式。核心邏輯是定義一個內(nèi)部狀態(tài)AggregationBuffer在iterate方法里接收每一行數(shù)據(jù)更新狀態(tài)在terminatePartial里輸出部分聚合結(jié)果最后在terminate里輸出最終結(jié)果。這里的關(guān)鍵是要理解 Hive 的聚合計算模型數(shù)據(jù)分散在多個節(jié)點上先做局部聚合再做全局聚合。所以你的聚合狀態(tài)必須支持合并這對應(yīng)merge方法。我見過不少 UDAF 實現(xiàn)錯誤把全局聚合和局部聚合搞混導(dǎo)致結(jié)果翻倍或者丟失。UDTF 的實現(xiàn)則是繼承GenericUDTF實現(xiàn)initialize、process和close三個方法。initialize里定義輸出列名和類型process里接收一行數(shù)據(jù)可以多次調(diào)用forward輸出多行。寫 UDTF 時有一個限制需要留意Hive 不允許 UDTF 的輸入?yún)?shù)和輸出列在同一張表里出現(xiàn)重名否則會報錯如果需要保留原字段必須配合lateral view使用。自定義函數(shù)上線前務(wù)必做三個層面的驗證單測驗證結(jié)果是必要條件造幾組邊界數(shù)據(jù)NULL、空串、超長字符串、特殊字符確認不會拋異常其次用一個小分區(qū)跑真實數(shù)據(jù)對比你預(yù)期的結(jié)果分布最后壓測確認執(zhí)行耗時不會拖垮整個任務(wù)。尤其是 UDF 里做了重量級操作比如在每一行都新建一個正則 Pattern 對象那在大表上就是災(zāi)難Pattern 對象應(yīng)該在構(gòu)造時初始化一次。5. 函數(shù)使用中的常見坑與排查實戰(zhàn)不管內(nèi)置函數(shù)還是自定義函數(shù)實際跑數(shù)時總會遇到各種問題。這一節(jié)我把自己在多個項目里踩過的坑集中整理一下。5.1 性能問題數(shù)據(jù)傾斜與函數(shù)副作用Hive 任務(wù)里最典型的性能問題就是數(shù)據(jù)傾斜。表現(xiàn)的樣貌是整個任務(wù)卡在某個 reduce 上其他都跑完了就它一個在那慢慢磨。函數(shù)觸發(fā)的傾斜有幾個常見原因。第一個是count(distinct)在超大基數(shù)場景下的歸并問題。比如統(tǒng)計上億用戶的去重設(shè)備數(shù)count(distinct device_id)會把所有設(shè)備的去重壓力打到同一個 reduce 上。解決思路一般是改成先group by device_id去重再外層count(1)。這個優(yōu)化的本質(zhì)是把壓力分散到多個 reduce 上內(nèi)核是兩階段聚合。第二個是 UDF 里做了耗時操作比如正則回溯、解析超大 JSON、循環(huán)里做字符串拼接。這類問題在數(shù)據(jù)量小的時候完全無感一旦遷移到百億級大表執(zhí)行時間就會被無限放大。我在項目里優(yōu)化過一個案例問題根源就是 UDF 的evaluate方法里調(diào)用了Pattern.compile做正則預(yù)處理后來改成在類初始化時把Pattern編譯緩存好任務(wù)耗時直接從 3 小時降到 20 分鐘。第三個是collect_list在大分組下的 OOM 風(fēng)險。如果一個分組內(nèi)的數(shù)據(jù)量巨大collect 出來的數(shù)組會占用大量內(nèi)存。一個比較務(wù)實的策略是先對數(shù)據(jù)做抽樣評估如果某個 key 的數(shù)據(jù)量確實異常大就需要考慮是否真的需要全量 collect還是可以先做一層預(yù)過濾。5.2 數(shù)據(jù)正確性問題NULL、精度、時區(qū)與隱式轉(zhuǎn)換這類問題隱蔽性很強往往數(shù)據(jù)跑完了才發(fā)現(xiàn)不對重跑成本極高。NULL 值問題在前面反復(fù)出現(xiàn)這里再匯總一下。concat遇 NULL 返回 NULL、count(column)不統(tǒng)計 NULL、sum全 NULL 返回 NULL、concat_ws跳過 NULL、coalesce返回第一個非 NULL 值。我的習(xí)慣是數(shù)據(jù)清洗階段盡量把 NULL 處理掉統(tǒng)一轉(zhuǎn)成確定的默認值或者空串后續(xù)的分析查詢就省心很多。精度問題是金額類指標(biāo)的重災(zāi)區(qū)。Hive 的 double 類型在sum計算時會產(chǎn)生精度丟失尤其是對金額做累加結(jié)果可能出現(xiàn) 0.1 的誤差。我在處理財務(wù)指標(biāo)時一律要求上游把金額字段轉(zhuǎn)成decimal(18, 2)或者精度更高的類型再參與后續(xù)聚合。round的負數(shù)舍入問題前面已經(jīng)提過同樣值得注意。時區(qū)問題在日期處理函數(shù)里很常見表現(xiàn)形式是取數(shù)結(jié)果和預(yù)期相差 8 個小時。原因在于from_unixtime默認使用服務(wù)器的本地時區(qū)來格式化時間戳如果你的集群時區(qū)配置和業(yè)務(wù)方預(yù)期不一致就會出現(xiàn)偏移。排查這類問題時先確認集群的hive.execution.timezone配置再確認時間戳字段本身是否是 UTC 時間。最穩(wěn)妥的做法是統(tǒng)一約定所有時間戳存儲都用 UTC展示時顯式指定時區(qū)轉(zhuǎn)換。隱式轉(zhuǎn)換是另一個容易靜默出錯的點。比如一個字段被定義成字符串類型但你拿它和整數(shù)比較Hive 會做隱式轉(zhuǎn)換如果那個字段的內(nèi)容不是純數(shù)字比較結(jié)果就會偏離預(yù)期。我建議在表結(jié)構(gòu)定義階段就嚴格要求字段類型不要在 SQL 里依賴隱式轉(zhuǎn)換。舉一個典型的錯誤把分區(qū)字段dt存成 string然后用dt 20240601 and dt 20240630這種不帶引號的寫法去查看起來能跑通但如果有一天分區(qū)字段里出現(xiàn)非數(shù)字內(nèi)容這種行為就變得不可預(yù)測了。5.3 函數(shù)相關(guān)常見問題速查表我整理了一張日常排查速查表出現(xiàn)問題可以先對照排查?,F(xiàn)象可能原因解決方向split按點切分無效點號是正則通配符寫成split(ip, \\.)concat結(jié)果為 NULL某字段為 NULL改用concat_ws或nvl兜底count(distinct)任務(wù)卡死去重基數(shù)過大導(dǎo)致傾斜改成 group by count 兩階段日期結(jié)果差 8 小時時區(qū)配置不一致檢查集群時區(qū)統(tǒng)一 UTC 存儲cast(abc as int)無報錯Hive 轉(zhuǎn)換失敗返回 NULL配合 case when 做校驗金額求和結(jié)果有誤差double 精度丟失字段轉(zhuǎn) decimal 再聚合collect_list內(nèi)存溢出單分組數(shù)據(jù)過大預(yù)過濾、增大容器內(nèi)存或改方案UDF 任務(wù)整體很慢evaluate 里有重操作初始化時緩存 Pattern避免重復(fù)編譯row_number排名的結(jié)果和預(yù)期不同order by 字段重復(fù)增加唯一字段做次級排序datediff結(jié)果被取整按天計算截斷時分秒用時間戳相減精確計算這個表是我在幾個項目迭代中不斷沉淀下來的后續(xù)遇到新的問題還在持續(xù)補充。排查思路的本質(zhì)就一條先確認函數(shù)本身的行為再確認數(shù)據(jù)本身的特征。兩者分開排查問題定位就快很多。6. 從實際項目里沉淀的 Hive 函數(shù)使用經(jīng)驗寫到最后這部分分享一下我在實際項目中總結(jié)的一些使用經(jīng)驗。這里面沒有特別高深的技術(shù)都是實打?qū)嵦嵘_發(fā)和維護效率的做法。6.1 函數(shù)使用的基本原則第一條原則是能用內(nèi)置函數(shù)解決的就不要寫自定義函數(shù)。內(nèi)置函數(shù)經(jīng)過大量場景驗證穩(wěn)定性、性能都有保障。自定義函數(shù)的維護成本是隱性的后面換人接手要花時間理解函數(shù)邏輯一旦函數(shù)里有隱蔽的邊界 bug排查代價很大。第二條原則是邏輯盡量后置到 SQL 層而不是前置在 UDF 里。比如字符串標(biāo)準(zhǔn)化、金額單位轉(zhuǎn)換這類邏輯如果寫到 UDF 里后續(xù)調(diào)整要改代碼重新打包但如果寫在 SQL 里一個字段改一下重跑就行。我見過一個項目把匯率轉(zhuǎn)換寫在 UDF 里結(jié)果匯率基準(zhǔn)更新時整個 UDF 要重新上線非常折騰。第三條原則是函數(shù)調(diào)用的可讀性要優(yōu)先。寫 SQL 不要炫技能用簡單的case when說清楚就不要寫一個嵌套三層的regexp_extract或者復(fù)雜的窗口函數(shù)表達式。數(shù)據(jù)開發(fā)最大的成本是別人讀你代碼的成本代碼寫得直白后面維護的人會感謝你。6.2 高價值函數(shù)組合與數(shù)據(jù)加工套路項目里有一種高頻套路清洗階段用case when加regexp_extract做字段規(guī)范化標(biāo)準(zhǔn)化階段用from_unixtime和date_format做時間規(guī)整加工階段用窗口函數(shù)做指標(biāo)加工。這套組合打下來覆蓋了從明細數(shù)據(jù)到指標(biāo)寬表的絕大多數(shù)需求。有一個典型的寬表加工例子統(tǒng)計每個用戶最近 7 天的下單金額和下單次數(shù)同時要算出和上一個自然周的同環(huán)比。實現(xiàn)思路是先用date_format(order_time, yyyy-ww)提取周維度再用datediff計算日期差值然后配合條件聚合把最近 7 天的數(shù)據(jù)框出來。這些函數(shù)單看都很簡單但組合起來就能解決很復(fù)雜的業(yè)務(wù)訴求。還有一個經(jīng)驗值得分享在寫窗口函數(shù)做指標(biāo)加工時盡量把partition by的粒度控制在最小業(yè)務(wù)粒度。比如統(tǒng)計用戶的每日指標(biāo)時partition by user_id, order_date一定比partition by user_id然后靠order by來限定更可控因為前者能清晰地表達“每組只算一天的數(shù)據(jù)”排查時思路更明確。6.3 最后再分享一個我一直在用的小技巧在寫任何一個帶聚合或窗口的 SQL 之前先在腦子里過一遍數(shù)據(jù)特征這個字段有沒有 NULL、這個維度有沒有可能產(chǎn)生大量的重復(fù)值、這個時間字段的時區(qū)是什么。這些問題過完之后再動手寫 SQL踩坑概率會下降一大半。很多看起來莫名其妙的數(shù)據(jù)異常本質(zhì)都是寫 SQL 之前沒有想清楚數(shù)據(jù)的分布特征。函數(shù)本身沒有錯錯的是你假設(shè)數(shù)據(jù)是干凈有序的。另外一個習(xí)慣是在函數(shù)選型時主動考慮表的數(shù)據(jù)量和文件格式。在 Parquet 這類列式存儲上某些函數(shù)在過濾條件下可以做到延遲物化整體執(zhí)行效率比在 Text 格式上高很多。因此做方案設(shè)計時函數(shù)選型和存儲格式需要通盤考慮不能只盯著一句 SQL 看。做 Hive 開發(fā)這么多年我的體會一直是函數(shù)只是工具真正拉開差距的是你對自己數(shù)據(jù)的理解程度。函數(shù)學(xué)得快慢不重要重要的是每一次使用函數(shù)時都能清楚知道它在這個數(shù)據(jù)集上會發(fā)生什么。這個意識建立起來之后你寫的每一段 SQL 都會比之前穩(wěn)得多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
97一本大道亚洲一区| 欧美顶级黄片AAAAA在线免费看| 97人肏| 老熟女乱伦一区| 加勒比东京热五月天天堂网| 九九视品黄色| 日韩一区二区熟女| 色婷婷影院| 天天日天天干天天整| 色香av| 中文字幕一区二区三四五区日日骚| 五月婷婷啪啪| 404操逼福利视频| 亚洲欧美首页| 亚洲丝袜诱惑| 超碰免费人妻在线| 色九久| 日韩丨制服丨中文|在线| 欧美专利1区2区3区4区5区免费| 操逼1区| 波多野结衣一级视频| 全国男人天堂网| 亚洲性图91| 久久久久久夜夜夜夜夜| 97色五月天完| 激情一区二区三区在线观看| 久久久9品一区二区三区| www.av在线观看| 午夜福利av电影在线| 天天射天天操天天干天天吃2018| 加勒比综合网| 97在线免费观看| 嗯嗯不要 视频| 欧美草草| 成人国产精品三级A片| 无码 黑人一区二区三区| 中文字幕一区二区三区四区在线视频| 高清国产无码av| 欧美激情久操网| 91精品无码久久久久久久| 国产成人五月天丁香花| 久久久久久久久久久久色网| 国产久久天堂资源| 天天肏天天干| 韩美日操逼| 精品国产乱码| 综合久久久久久久综合网| 超碰色男人操熟女| 九九在线精品| 狠狠狠一区二区三区| 色色五月天婷婷| 91黑丝在线播放| 欧美亚洲日韩人妻在线观看| 久久天天摸| 久久久久久91香蕉国产| 亚洲精品一区二区免费在线观看| 久草成人影片| 九热中文字幕| 一级二级三级黑人无码| 亚洲欧美精品91| 国产超碰国产97| 亚洲精品天天影视综合网| 我中文字幕6区| 亚洲性少妇| 一区二区不卡免费| 78久久| 亚洲AV秘无码一区..| 天天日天天搞天天干| 综合操逼| 久久免费老司机精品| 国产农村妇女精品一二区| 欧美国产视频| 2017大香蕉| 性爱免费视频成人| 亚洲色图大香| 操91| 日本久久女同性恋视频| 一起草日韩| 99热91| 78久久久| 91丝袜在线观看| 搞中出久久| 色5月婷婷| 久草在| 亚洲精品 欧美97色色| 亚洲欧美另类图片| 九月丁香综合网| 日本免费中文一区二区三区四区| 日韩精品电影| 探花视频免费观看国产专区| 在线视频日韩欧美国产| 99re在线精品78| 尤物av网站免费在线播放| AV网站高清无码在线观看| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 一区三区啪啪| 色 亚洲 91| 欧美丝袜中文字幕07在线| 日韩成人精品| 久久久穴999| 久久久性爱| 日本在线不卡v二区| 麻豆AV一区二区| 美女黄页网站| 99久久精品国产高潮| 九九九九九九成人| 亚洲国产美女久久久久| 男人天堂.AB| 国产精品一区在线播放| 日韩亚洲中文有码视频| 亚洲一本色码中文字幕| 嫩草美女久久| 97超级欧美| 最新无码国产| 操死我干死我| 无码免费在线观看黄色片| 大香蕉碰碰| 色爱三区| 丰满欧美放荡少妇在线| 大香网站| 九九热午夜欧亚国产视频| 激情小说图片亚洲首页| 绑缚麻绳人妻寝取完整版| 日本亚洲嫩草影院啪啪| 婷婷六月色开| 超碰色97| 97干色天堂| 少妇久久久久久久| 黄总AV色图| 立川理惠被中出无码| 97超碰69| 操逼网站网站| yy少妇精品久久| 欧美性爱日韩高清| 99热精品国产| 成人三级片无码| 嗯嗯啊啊的视频| 思思热er精品视频| 欧亚日韩中文在线| 97一区二区蜜臀| 亚洲成人在线高清| 97欧美综合网| 天天看片天天爽| 国产精品一区二区手机看片| 2019天天操天天爽天天拍| 午夜乱轮操逼视频免费看| 日本999精品| 久久九九视频九九视频| 欧美色性情| 精品女人999| 国产亚洲欧美每日在线| 97chaopenrihan| www.丁香五月| 乱伦一区二区三区‘| 韩国毛片一区二区三区| 91黑丝少妇| 亚洲第一狼人丝袜美女另类 | 懂色中文一区二区三区| 日韩精品国模| 亚洲色图超碰在线| 欧美一区二区三区蜜桃| 久久久久99精品成人片蜜臀| 吉川爱美98堂在线| 五月丁香六月激情综合| 成在线人在线观看视频| 欧美瑟综合| 在线人妻熟女一区二区三区四区五区| 熟妇的味道HD中文字幕| 麻豆av一区二区| 黄色小说亚洲| 天天影视网综合少妇| 为用户提供免费看黄网址在线观看| 国产精品3| 青青11操操操操操操操操| 亚洲自拍天堂| 男女一进一出视频久久| 人妻激情视频| 97在线无精品| 久96热在线观看视频| 2026国产精品视频| 国产精品经典一卡久久久| 久操凹凸视频| 欧美一区二区三区四区综合| 91成人无码| 亚洲色图伊人网| 97午夜剧场日韩| 国产麻豆一级精品视频| 欧美一级美片在线观看免费| 欧美AB在线| 骚熟女AV网| 91在线/欧洲| 国产日韩精品一区二区三区| 亚洲不卡不卡中文字幕不卡| 亚洲免费看片| 色爱国产| 国内毛片无码一级毛片| 99热只有| 成年男人的天堂| 五月婷婷色色| 狠狠色婷婷7777久| 亚洲图片偷拍视频区| 国产精品麻豆成人av| 久久 精品| 大香蕉淫人| 久9爱精品| 啊啊啊轻点在线观看| 日韩美女高潮喷水视频| 在线97在线| 日本A级视频| 爱干爱射网啊啊啊| 亚洲网自拍| 精品v1区| 国产乱弄免费在线视频。 | 久久国模av| 国产精品网站免费 | 日韩电影在线观看网址| 亚洲欧美色图| 中文字幕久热视频在线| 午夜大香蕉| 国产激情久久久| 亚洲精品视频在线| 亚洲精品一区中文字幕乱码| 黑操B| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 亚洲精品819| 9/A片 | 97超碰色色| 啊啊啊好想要| 国产一区二区啪啪视频| 激情九月婷婷| 91在线美女| 粘花网06av视频| 日日橹狠狠爱欧美超碰| 亚洲自拍欧美色综合| 亚洲极品| 伊人热综合| 国产麻豆福利av在线播放| 人人操人人大香蕉| 日本三级韩三级99久久| 成人综合网 欧美| 蜜臀AV成人精品蜜臀| 中文字幕女同在线| 日韩大香蕉| 女同女同恋久久级三级| 桃花色涩综合影院| 老熟女熟妇| 色网亚洲人| 亚洲 无码 偷拍| 日本Xx性爱| 国产精品色色| 综合大香蕉美。| 超碰99re| 日韩激情啪啪| 操美女人妻| 精品无码产区一区二| 久9九综合在线| 国产91精品福利在线| 爱射综合| 九九九热精品| 国产探花日韩援交| 国产av尤物| 粉嫩av一区二区三区四季| 国产精品人妻一区二区| 久久婷婷一区二| 在线五区| 日日夜夜精品| 亚洲欧洲美腿丝袜| 精品无码少妇| 欧亚免费视频| 亚洲Av噜噜一区二区三区妖精| 天天综合~91| 99热这里只有精| 熟妇激情| 国产一区二区三区影片| 亚洲女人毛茸茸91| 国产成人亚洲精品无码古代早漏男 | 九九九九九九九精品视频| 激情终合网| 999久久久免费精品国产牛牛| 欧美亚洲日本激情在线| 欧美日韩亚洲电影| 婷婷久久网| 本道在线| 无码av永久免费专区网站| 人妻日日夜夜精品| 成人五月天丁香激情综合| 久久久五月天| 600国产精品视频| 九九热超碰| yazhououmeizongya| 为用户提供免费看黄网址在线观看| 日韩另类色图| 欧美亚洲高清不卡| 亚洲91综合| 色偷偷综合91久久噜噜| 亚洲精品天堂久久A∨51成人漫 | 婷婷激情丁香| 日本99热| 91天堂| 国产高清成人传媒影视| 九九九久| 色五月婷婷五月天| 女性91网站| 日韩99999色| 国产无码精品成人| 亚洲 另类 丝袜 自拍 动漫| 在线国产福利网址导航| 日日97| julia高潮后不停追击中出| 亚州男人天堂| 69视频福利导航| 91香蕉视频在线观看免费| 啊啊啊啊在线观看网址| 色999;丁香五月| 日夜精品| 啊啊啊啊啊啊好湿好爽视频| 日本免费中文字幕在线| 欧美在线亚洲| 人人超碰在线观看黄| 精品九九国产无码| 亚洲欧美洲综合| 污到发麻的视频 国产| 一级黄色性爱裸体视频| 一区二区国产视频在线观看| 九九在线视频| 天天操夜夜操狠很操| 啊啊啊啊啊舒服| 91狠狠色丁香婷婷综合久久精品| 视频不卡中文字幕| 亚洲熟女乱色一区二区三区久久久| 在线人人人人人人精品超| 日本一卡二区在线| 91女人的网站| 国产福利av精彩对白| sewuyueav| 91在线丝袜视频| 亚洲欧美日韩夜夜| 精品高清一区二区三区三州| 欧美三四五区| 欧美91网站| 五月婷婷激情网| 国产一区二区在线播放量| 欧美后入式| 美女97超碰| 91麻豆va国产精品| av在线观看不卡网站| 欧美色97| 欧美亚洲厕所精品偷拍91| 九九综合色| 国产精品无套内谢| 国产1024在线播放| 亚洲精品91| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 综合一区中亚洲国产成人综合精品| 国产三级片在线观看| 久久久男人的天堂| 啊啊啊不要啊啊受不了了视频在线| 无码国产精品午夜不卡( | 后入式在线免费观看60秒| 亚洲少妇色| 日本三级韩三级99久久| 亚洲 一区二区 自拍| 日本熟女不卡视频| 三久久久四久久久久| 天天操熟妇| 99热 按摩 日韩| 日韩在线女优天天干| 大香蕉五月天| 夜夜草网站| 黄色AAAAAAAAAAA大片| 伊人国产成人av网站| 91精品导航| 麻豆一区二区AV天美| 日本熟妇精品九九| 亚洲综合色在线| 东北老女人的激情视频| 日韩在线人妻网站| 老熟妇综合| 精品久久久中文字幕不| 国产久久一区二区午夜| 黑丝内射一区二区三区| 激情综合网激情五月天| 久操热| 99热欧美| 五月丁香影视| 国产人妻精品久久久一区二区三区 | 欧州一区二区三区四区| 亚洲无992tv| 免费国产视频| 国产白丝精品在线观看| 欧美欧美啪啪视频| 成人26uuu| 九月丁香婷婷色| 最新岛国大片| 一本一道vs波多野结衣| 色情婷婷| 午夜福利久久久噜久噜久久综合| 亚洲妇色| 超碰久久综合| 91黄站| 女人天堂av在线播放| 啪啪视频免费在线观看| 国产美女在线精品免费看| 久久草草亚洲蜜桃臀| 国产精品国产亚洲区艳妇糸列| 尤物av网站免费在线播放| 试看日韩黄片| www.91逼逼.com| 天堂8在线新版官网| 日韩女模中文造逼| 九九九九九九九九九九九免费国产| 后入内射蜜桃臀| 91网站视频在线观看| 日韩高清一二三| 九久久九九久视频| 久久riav中文精品| 久热色情精品| 欧美论理片| sewuyueav| 日本性爱视频一级| 曰韩无码777| 丝袜内射| 天天欧美| 超97在线精品视频| 丝袜六区| 伊人四虎综合| 69XX一中文字幕人妻91| 色狠狠综合| 在线天堂999| 99热线麻豆 | 亚洲欧美激情在线视频| 成人色女网| 四虎影视国产精品| 国产成人精品必看 | 欧美人人天天网| 欧美97爱| 操一区| 素人无码中文字幕| 岛国黄片网站| 爱射综合| 亚洲欧美洲综合| 中文字幕亚洲热播人妻| 国产一区二区三区不卡手机在线| 少妇熟女视频一二三区| 黑人白女精品一区| 美女露胸露尿口| 清纯唯美综合亚洲| 强奸乱伦αv片| 97在线青| 丁香六月激情| 日韩99神马视频播放| 麻豆熟妇乱妇熟色A片在线看| 日本狂喷奶水在线播放212| 日韩AV电影网站| 天天色综合影视网| 欧美精品自慰系列寂寞少妇| 欧美日韩人妻婷婷一区| 7777奇米影视久久| 99re9这里只有精品| 91精品老女人| 蜜色网色哟哟| 免费AV中文网在线观看| 韩日精品四区| 色臀AV| 337p大胆噜噜噜噜噜91Av| 黑人干亚洲| 久久国产热视频97电影| 欧美在线色| 视频黄色国产一级| 热热色AV| 99热最新| 热99这里有精品综合久久 | 国产一区自拍欧美日韩| 91新在线欧美| 亚洲伊人a线观看视频| 玖玖综合色| 人妻啪| 中文字幕78| 91精品国产日韩欧美综合| 久久久久久久久久久999| 色色色色日本| 久久久78| 久久久999日本大片| 欧美精品三级黄片| 撸撸成人在线视频| 日本熟妇人妻中出视频| 欧美色97| 日本一片一区| 亚洲欧美日韩精品久| 熟女熟妇一区二区三区视频| 婷婷在线播放| 思思热在线视频免费| 天天操人人操骚逼网站| 中文字幕黄色片| 亚洲av噜噜噜噜噜噜| 亚洲吊色| 色婷婷电影| 热思思免费视频| 加勒比AV天堂| 免费观看欧美日韩操逼视频| 伊人五月天婷婷| 亚洲天堂日本| 猛交交| 欧美激情性久久久久久| 台湾佬中文娱乐网久久久久久久久久com | 亚欧视频在线| 亚洲资源站| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 天天操天天射青青草| 亚洲无码国产精品久久| 91美| 欧美天堂超碰97| 岛国精品视频在线观看| 色视频蜜乳| 亚洲中文字幕av| 亚洲精品欧洲精品| 中文字幕 码 自拍 视频 区| 三级特黄60分钟播放| 亚洲欧美洲综合| 91天天c| 亚洲精品一区中文字幕乱码| 国产h片在线观看视频| 五月情色天| 亚洲偷拍欧美激情| 区一二区日韩亚洲乱码av电影| 亚洲超碰AV| 国产精品人妻一区二区| 亚洲成人ab| 青操影院| 精品国产国产AV| 久久国产99精品72福利| 色婷婷九月| 免费观看国产不卡av| 丰满人妻区一区二区三| 风间由美日韩欧美久久| 91丨精品丨国产丨丝袜| 亚洲AV乱码专区国产噜噜亚洲| 天天躁日日躁AAAXX| 影音先锋视频在线| ,成人免费啪啪视频| 五十路三区在线| 婷婷8月天青娱乐| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 欧美成人一级免费电影| 国产美女销魂在线观看不卡| 日本东京热久久久电影| 精品人妻一区二区免费蜜桃视频| 一本大道青青| 日日日日做夜夜夜夜做无码97| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | av线电影| 狠狠爱AV| 国产熟女自拍| 另类老少妇| 熟妇激情| 九九九不卡| 情色五月天就去干| 欧美亚洲韩国视频十五区| 亚洲的天堂网| 啊啊啊在线看| 国产黑白丝在线| 亚洲国产福利视频| 亚洲骚逼少妇| 78久久| 成年无码动漫av片无尽在线| 日韩肏逼视频| heyZO天然素人无码AⅤ专区| 强奸国产精品视频| 欧美日韩一区二区三区四区蜜桃| 久久久久久久国产a∨| 乱欲一区二区| 99热综合| 黑丝91视频| 超碰综合色| 操死我了啊啊啊| 日本黄色精品| 超碰午夜| 18禁网站在线播放| 九九黄色网| 亚洲有薄码区日本系列中文字幕| 在线天堂999| 男人的天堂2000| 超碰在线1234区| 亚洲资源一区| 国产91亚洲精品一区二区三区| 欧美一区二区福利在线| 爽 好舒服 无码刺激久久| 人人摸人人干| 亚洲一本色码中文字幕| 日韩在线观看AV| 日本道不卡| 亚洲性爱免费电影| 国产成人网| 天天综合网91入口| 91久久久久| 99久久久无码国产精品性啊聊| 成人一级性爱| 丁香激情五月| 久久一本大香蕉| 日韩99999| 亚洲天堂一区二区久久| 9色在线| 男女激情中文字幕| 91色欧美| 国产精品欧美日韩久久| 天美传媒国产原创中文字幕亚洲欧美另类 | 亚洲中文字幕熟女| 国产女人成人精品视频| 综合 青草 伊久久 影院 综合| 天堂网 主播 亚洲| 国产捆绑一区| 亚洲天堂热| 99热 按摩 日韩| 97视频在线免费观看| 伊人影院综合是一个与深夜成人在线| 嗯啊免费视频| julia国产在线 | 亚洲第一男人天堂| 免费一级精品啪啪视频| 北条麻妃99精品青青久久| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 欧美日韩999| 亚洲drav色图| 午夜无遮挡男女啪啪视频| 在线观看一卡二卡| 久九九九九九九九热| 免费伦费视频在线观看| 中文97国产| 狠狠操狠狠操操| 激情99| 黑人性暴力毛片| 国产高清MV操逼视频| 国产性感在线观看| 国产毛片片精品天天看视频| 男人兔费天堂| 久操国产在线| 大香蕉九九| 啊啊啊啊,啊啊好多水| 青青操综合网| 久久一本大香蕉 | 蜜臀久久99精品久久久电影| 开心五月激情网| 日曰骚久久精品| 曰韩av中文字幕专区| 免费99精品国产自在在线| 国产毛片久久久久久久| 久久国99999| 欧美91视频| 一区,二区,三区视频| 另类TS人妖一区二区三区| 78p欧美| 正在播放国产精品一区| 久久一二三四不卡| 自拍偷拍亚洲熟女妇人精品| 97色涩| 亚洲色色探花| 欧美日韩亚洲国产中文永久天天看| 亚洲欧洲精品视频发布| 超碰碰小说97| 五月天成人综合| 中文字幕99999| 黄色小说亚洲| jk白丝没脱就开始啪啪| 亚洲熟女少妇免费视频| 五月丁香婷婷综合网| 男人的天堂免费| 啊好大好舒服| 日韩中文字幕精品一区在线| 蜜桃视频啊啊啊啊| 亚洲成人网站在线观看| 热99这里有精品综合久久| 欧美少妇第一页| 日韩A优精品在线观看| 夜夜国自区| 九九毛片这里只有精品| 日本十八禁免费看污网站| 老司机午夜精品福利视频一区二区| 亚洲免费人妻在| 超碰九区| 欧美日韩婷婷中文| www…国产操逼| 精品国产Av无码久久久伦古装| 啊啊啊啊啊啊啊好爽不要| 少妇高潮对白在线观看| 四虎免费在线观看| 欧洲自拍色图gif在线| **一级毛片国产| 欧美18老人禁| 伊人9| 毛片视频白嫩| 亚洲一区二区精品福利| 91精品国产91久久青草| 欧美日韩人妻少妇 一区二区三区| 日本99热| 欧美一级久久久久久久大片动画| 78m成人视线| 亚洲欧洲日产国产综合网| 丁香婷婷啪啪| 久久国产性爱| 日本精品五区| 五月天九九日国产精品一区二区三区| 色噜噜人妻av 中文字幕| 欧美东京热精品A∨| 立川理惠被中出无码| 99日视频在线免费| 欧美性爱一区| 69精品少妇一区二区三区蜜桃| 国产精品极品美女视频| 大象AV在线| 另类小说欧美激情校园春色| 国产精品久久久久久久久久久久久久久| 婷婷99狠狠躁天天躁| 超碰成人公开| 国产美女口爆吞精视频| 久久久久久久唑| 蜜桃网熟妇| 亚洲揄拍网| 99精品丰满人妻无| 屌逼传媒| 超碰在线成人| 操我无码| 老司机老司机午夜影院| 精品日韩人妻精品一二三区| 人人操人人肉久久精品| 精品人妻一区二区三区蜜桃视频| 欧天美中出| 日日干夜夜操视频h| 91色艳| 噜噜在线| www.久久| 一区二区日韩欧美久久| 91Chinese在线| 亚洲无线码一区国产欧美国| 日韩Va亚洲va欧美Ⅴa久久| 亚洲精品国产无码高清| 国产美女自拍AV| 蜜乳中文字幕a在线| 亚洲精品国产精品成人| 国内外内射高清视频| 国产精品久久久久久久久久久久久久吹 | 91碰碰| 水野优香在线观看| 欧美亚洲丝袜人妻制服99| 依人大香蕉| 看日韩美女二区三区免费操逼视频 | 人妻丝袜肏逼| 超碰到97情色| 一区e区三| 成人开心网在线视频| 精品人妻一区二区蜜桃视频| 婷婷五月天色网| 极品人妻少妇综合| 天天综合中文字幕 91| 综合网欧美| 午夜性生活av免费在线看| 亚洲国产欧美一区二区潘金莲| 亚洲精品一二区| 人妻一区视频| 精品国产无码中文| 岛国在线一区二区三区| 日韩av不卡在线观看| 国产无码一二三区| 国产这里只有精品| 国产精品久久久视频| 自拍丝袜美腿人妻| 亚州男人的天堂| av日韩中文字幕| 超碰九7| 人人干黄色| 乱论91| 91丝袜美女国产| 超碰97资源大奶| 亚洲色图欧美色图制服诱惑| 视频在线97| 国产成人久久精品蜜臀| 久久91视频| 色婷婷成人| 五月天伊人| 免费看国产大AB| 日本一二区不卡| 91深夜夜| 97久久精品亚洲| 亚洲 另类 丝袜 自拍 动漫| 91蜜臀人妻中文字幕在线| 26UUU欧美日本| 国产乱人伦AVA麻豆软件.| 人妻久久久久久久久久久久久久久| 嗯嗯啊啊亚欧精品| 91蜜桃传媒精品久久久一区二区| 亚洲色图亚洲| 欧美亚洲| 91网亚洲| 农村妇女精品一二区| 国产最新小视频在线播放下载 | 白 大 人妻 区 在线| 欧亚 另类 久| 午夜视频好爽啊| 人妻加勒比东京热| 97久久国产亚洲精品超碰热| 日本不卡一区| 五月天色图| 精品九九九九九九九九九| 蜜桃久久一区二区| 爱av免费| 天堂伊人久久| 婷婷在线视频| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 青娱乐黄色录像| 岛国色情视频在线观看| 中文字幕二区日韩天堂| 色噜噜人妻av中文字幕| 国产日逼视频| 91色噜噜狠狠| 亚洲婷婷丁香在线| 夂久色| 久久久久女教师免费一区| 岛国黄色短视频| 四虎884a| 家庭乱伦国产精品| 97视频观看| 亚洲影视综合| 婷婷六月色| 日韩在线观看AV| JIZZJIZZ国产精品喷水| 60秒免费小视频| 国产第12页| 红桃视频高潮| 精品一级毛片在线观看| 亚洲图片 91| 欧美色图综合网| www.色五月| 色图综合| 校园春色综合| 国产精品久久久| 人妻天堂综合网| 性色综合网| 亚欧精品久久久久久久久久久| 欧美色97| 久久人妻视频网| 青草一区二区| 久久久人体| 五月丁香激情四射| 日韩丝袜人妻AV| 国产女大学生AV| 亚洲国产精品久久久久婷婷青年| 91色拍| 亚洲AO在线| 7777奇米影视久久| 亚洲九九爱| 极品极品色影院| 不卡视频一区蜜桃视频 | 精品一区二区三区四区女| av网站在线观看了| 九九超碰综合网| 五月丁香| 日韩无限资源| 久久视网78| 国产三级多多影院2022国产AA一级毛片无码 | 91精品成人www| 免费αV在线视频| 极品色电影院| 婷婷色五月激情| 99久久99久久免费精品蜜臀| AV天堂男人的天堂| 国产综合网站在线播放 | 国产成年精品高清在线观看91| 99re热| 婷婷六月天| 国产精品一二三区18| 国产精品视频在线播放| 亚洲图片偷拍视频区| 日少妇视频| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 婷婷97| 免费中文综合精品| 久久精品99| 国产av白丝| 欧美A√综合网 | 国产激情综合| 无码不卡八戒| 亚洲好色人妻| 北京专精特新企业招聘信息| 久久国产热视频97电影| 久久啊啊| 偷拍色图| 欧美熟爽综合| 无色无码| 日韩精品中文字幕人妻| 91天天综合在线观看| 欧美性色综合网| 丁香五月天堂| 久久国产免费激情视频| 青青草好吊色| 欧美极品色| 综精品久久久aaaa| 国产99 中文字幕日韩小视频| 日本黄大片在线观看视频| 97ai亚洲| 亚洲色情在线影视| 亚洲人在线成线成人| 日韩中文字幕二区| 上海一级黄片| 翔田千里爆乳巨臀无码| 久久久青青草| 91女优在线观看 | 人妻三级在线中文字幕| 激情文学小说一区二区| 欧美97日韩| 亚洲AV无码天美传媒一区| 粉嫩av在线一区二区| 亚洲av无码国产精品字幕| juliaann欧美丝袜办公室| 国产久久久久影院老熟女| 欧美色图片91| 欧美色三级片91| 婷婷五月影院| AAA久久| 日本性爱少妇| 很黄很色的视频在线观看| 26uuu久久| 嗯嗯啊啊操我| 人妻少妇精品视频一区二区三区| 天天性射网| 91熟女.com| 黑人与人妻| 国产精品suv一区| 日韩熟女精品无码专区一区二区| 超碰av人人人| 人人爱操| 97人人草| 天天综合精品| 丁香五月AV| 婷婷五月天激情小说| 亚洲操人| 天堂岛av| 91亚·色| 九一亚洲国产免费| 不卡人妻少妇精品毛片一区23区视频| 翘臀vidoes| 日韩内射视频| 操人妻逼91| 伊蕉97蜜桃97狠狠综合干| 丝袜视频一区二区在线播放国产中文| 黄色二级片网站| 五月天久久婷婷亚洲| 日韩超碰精品综合| 97超碰巨乳| 精品乱码在线观看| 日韩青久久| 人人操人人摸超碰| 亚洲97超碰| 日韩福利电影网| 国产精品嫩草影院午夜两性| gogogo免费高清看中国国语| 美女极品一区二区三区| 黄色片大香蕉| 性爱久久| 一区二区三区四区姦女| 少妇精品久久久| 天天日骚逼熟女| 九九九九AV| 欧美大波激情xxxx| 久久成人国产| 久热免费视频| 色老汉色| 久久中文字幕女同性恋一区| 性欧美999| 日本一区二区亚洲综合| 天天干天天燥| 99热自拍| 色盈盈影院| 蜜桃午夜视频一区二区| 久久久久久久久999| 欧美日韩另类在线播放| 俺去俺来也在线www| 人妻少妇蜜桃视频欧美一区| 丰满搜索结果 -第18页- 久久高清无码| 亚洲性猛| 九九九色| 一区二区视频在线播放| 艹我哪美一区无码| 综合天天网| 欧美综合1性辶| 黄色片A级一区二区三区| 国人欧美精品一区二区| 久久久久精| 天堂精品| 中文AV制服乱伦| 自慰白浆在线观看| 免费看污网站| 亚洲色婷婷综合久久一区二区三区| 精品无码一区二区三区色欲| 99久久久无码国产精品性男| 嗯嗯啊啊啊好舒服| 天天性射网| 天天操人人操狠狠插| 99热网站| 欧美在线色| 看全色黄大色大片免费视频| 日韩精品在线观看网站| 日韩精品人妻中文字幕有码午| 亚洲少妇自拍中文字幕懂色| 午夜福利一区二区影院| 日韩熟妇二区| WWW美腿丝袜香蕉中文| 亚洲A曰本VA欧美VA视频| 五月丁香六月激情综合| 国产后入清纯| 综合国产影视三级| 女色视频社区| 亚洲同性aV综合| 温婉少妇玩3p| 亚洲少妇色图自慰直播| 欧美亚洲天堂| 精品国产一区二区三区av在线资源| 97超碰精品成| 国产美女裸体秘 永久无遮挡| 国产精品青青草| 78操B| 婷婷丁香五月综合| 欧美爱国产综合、| 亚洲二区精品在线观看| 午夜欧美神马久久久久| 久久91| 蜜臀av在线播放一区二区三区| 舔人妻中文免费视频| 欧美日本国产日韩激情视频| 神马久久久久久久久久| 日韩欧美大片免费高清啪啪| 青青11操操操操操操操操| 超碰美女97| 韩日精品四区| 成人怡红院| 9九九九九视频在线观看| 在线视频资源| 99成人| 屁股久久久久久| 国产一区96在线| 啊啊啊免费视频| 亚洲18禁| 亚洲巨爆乳一区二区三区四季网| 国产乱码久久| 国产精品久久久| 熟妇最新先锋一二三区| 日韩成年人性爱视频| 日韩天堂av电影在线观看| 亚洲国产美女久久久久| 二区熟妇韩日| 不卡av在线中文字幕| 大乔未久88一区| 国产92麻豆天美精品色欲5| 久久久久96| 中文字幕永久在线| 超清中文乱码字幕| 亚洲影院小综合| 在线欧美69V免费观看视频| 久久一区二区加油站| 亚洲AV永久无码一区仙野| 深喉吞精| 刺激性视频黄页| 97资源视频| 九九超碰综合网| 天天欧美欧美亚洲网| 美女天天干| 蜜乳av一区二区三区四区不卡| 天天天天天干夜夜夜夜夜操| 美女91| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚 | 国产精选三级在线观看| 易易A毛视频| 九九英色视频| 亚洲色图亚洲无码强奸乱伦| 精品无码少妇| 国内黄色精品| 日本性爱网址| 亚洲丝袜诱惑| 欧洲与亚洲欧美精品中文字幕| 黄色av片三级三级三级免费看| 天天综合网~91| 伊人991| 可以免费观看的av| 成人av在线播放| 色97欧美| 日韩激情视频| 久久丁香五月天| 亚洲影院365| 国产久9| 美女淫穴| 色综合99| 久久国产性爱| 91天美| 蜜桃精品一区二区三区久在线| 综合色图亚洲欧美| 美女操逼福利视频| 日本韩高清无砖码22o| 久久机热| 久久久婷婷| 精品一区二区啪啪啪| 亚洲色图欧美色图日韩色图| 亚洲欧洲激情卡通另类文学四射小说网站| 97国产天堂岛| 天天综合亚在线| 日本理论在线| 欧美1区二区三区公司| 久久二| avav青青草久久夜| 伊人伊人LD| 嗯嗯嗯,草死我| 婷色五月天| 人人摸人人干人人拍97| 日韩av在线精品观看| 婷婷国产精品一区二区| 亚洲精品蜜桃久久久久久久| 小草精彩毛片| 9+1视频网址| 丝袜熟女一区二区三区| 色就色综合| 日本性感人妻91| 亚洲人妻久久| 蜜臀Av一区二区三区| 久久久久久久久久久久欧美日| 欧美色图私拍91| 高清不卡国产| 色蜜AV| 丁香久久| 色五月婷婷中文字幕| 久久久久国产精品片区无码直播| 超碰人人操97碰| 一级人妻性爱视频| 日本淫乱女一区二区三区视频| 花花AV导航| 国产日韩怡红院| 欧美九九九| 91青青在线| 我爱操| 超碰97久| 欧美的精品的视频| 超碰97伊人| 欧美熟妇精品黑人巨大91| 综合欧美色图| 色综合大香蕉| 春色综合网| 97国产超碰| 高潮精品| 婷婷伊人五月| 亚洲另类欧美精品| 日韩字幕一区| 亚洲精品一区二区精品| 偷拍三区| 欧美人与性动交a美精品| 中日韩久久久| 人、人、摸,人、人、草| 国产美女高潮叫床视频| 欧亚在线视频| 99热官网| 亚洲精品蜜桃久久久一区二区三区| 亚洲精品一区二区三区新线路| 国产无遮挡| 是还免费视频1727我| 91视频女生|