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

ARTICLE DETAIL

資訊詳情

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

Spark DataFrame列轉(zhuǎn)行:stack與explode實(shí)戰(zhàn)詳解

Spark DataFrame列轉(zhuǎn)行:stack與explode實(shí)戰(zhàn)詳解 做數(shù)據(jù)的人大概都遇到過(guò)這種場(chǎng)景業(yè)務(wù)方丟過(guò)來(lái)一張表字段是按月份展開(kāi)的什么202401_sales、202402_sales、202403_sales一路排下去又或者是一行記錄里同時(shí)塞了十幾個(gè)指標(biāo)列。你要做統(tǒng)計(jì)分析、要出報(bào)表第一步就是把這些“橫著”的列變成“豎著”的行。這個(gè)動(dòng)作在行業(yè)里叫列轉(zhuǎn)行也叫寬表轉(zhuǎn)長(zhǎng)表、unpivot。在 Spark DataFrame 里實(shí)現(xiàn)列轉(zhuǎn)行常規(guī)的做法有stack函數(shù)、explode函數(shù)還有一堆人繞遠(yuǎn)路的union方案。這篇文章我就結(jié)合自己在某項(xiàng)目里的真實(shí)處理過(guò)程把 Spark DataFrame 列轉(zhuǎn)行的幾種寫法、選型邏輯、參數(shù)坑、性能調(diào)優(yōu)一次說(shuō)清楚。先說(shuō)結(jié)論如果只是普通的多列轉(zhuǎn)多行stack是首選如果你處理的是 Array 或 Map 類型的嵌套數(shù)據(jù)explode才派得上用場(chǎng)其他場(chǎng)景下用union硬懟基本都是自找麻煩。為什么這么說(shuō)下面拆開(kāi)講。1. 項(xiàng)目場(chǎng)景與需求拆解1.1 接到一個(gè)什么需求事情是這樣的。某個(gè)數(shù)據(jù)平臺(tái)項(xiàng)目里上游給我們同步了一張渠道推廣效果表表結(jié)構(gòu)大致是這樣每一行是一個(gè)渠道渠道名和渠道 ID 是固定的維度字段然后后面跟著jan_amount、feb_amount、mar_amount這種十二個(gè)月份的轉(zhuǎn)化金額列再加若干分組字段。表本身不算大幾千萬(wàn)行的規(guī)模但如果直接拿這張寬表去做同比環(huán)比、趨勢(shì)分析、前端圖表渲染會(huì)非常別扭——因?yàn)榘丛路治霰举|(zhì)上需要一個(gè)“月份”維度而寬表里月份是散在列名里的。當(dāng)時(shí)數(shù)據(jù)組拿到的需求原文很明確把這張寬表里每個(gè)月的數(shù)據(jù)拆成獨(dú)立一行輸出channel_id、channel_name、month、amount四個(gè)核心字段方便下游直接掛 BI 出趨勢(shì)圖。這種“列名即值”的表結(jié)構(gòu)就是列轉(zhuǎn)行最典型的適用場(chǎng)景。1.2 列轉(zhuǎn)行的本質(zhì)是什么列轉(zhuǎn)行聽(tīng)起來(lái)是個(gè)高大上的數(shù)據(jù)操作其實(shí)底層邏輯一句話就能講透把多個(gè)列的值連同它們對(duì)應(yīng)的列名重新組織成“行記錄”中的字段。你可以理解成把一張 A4 紙橫著折一下原本橫向排列的信息變成縱向羅列。在 Spark 的 DataFrame / SQL 模型里列轉(zhuǎn)行本質(zhì)上是對(duì)“列名到值”這一組映射關(guān)系做展開(kāi)。最常見(jiàn)的實(shí)現(xiàn)手段有兩個(gè)方向使用stack系列函數(shù)直接展開(kāi)多列成多行使用explode系列函數(shù)拆解行內(nèi)的集合類型字段前者解決的是“結(jié)構(gòu)規(guī)整的寬表”后者解決的是“字段本身是數(shù)組或字典”的復(fù)雜結(jié)構(gòu)。兩者適用場(chǎng)景不同但很多人一搜列轉(zhuǎn)行就看見(jiàn)explode順手就用了結(jié)果發(fā)現(xiàn)根本不靈——因?yàn)槠胀懈緵](méi)法直接 explode。這也是我在實(shí)際項(xiàng)目中反復(fù)跟同事強(qiáng)調(diào)的一點(diǎn)先看數(shù)據(jù)類型再選工具。1.3 技術(shù)選型前的幾個(gè)判斷維度在動(dòng)手寫代碼之前我一般會(huì)先問(wèn)自己三個(gè)問(wèn)題。這看起來(lái)有點(diǎn)多余但實(shí)踐證明想清楚再寫比瞎寫半天再返工高效得多。第一列的數(shù)量多不多、是否固定。如果列是動(dòng)態(tài)生成的比如這個(gè)月新增了一個(gè)字段那代碼里就不能硬編碼列名得考慮動(dòng)態(tài)拼接。第二每個(gè)要轉(zhuǎn)置的列的數(shù)據(jù)類型是否一致。有的是 String有的是 Long有的是 Double如果不統(tǒng)一stack會(huì)直接報(bào)類型不匹配或者運(yùn)行時(shí)拋異常。第三有沒(méi)有需要保留的維度列。列轉(zhuǎn)行之后原來(lái)一行里的維度字段比如渠道 ID需要復(fù)制到每一行里這個(gè)行為stack天然支持但很多人寫的時(shí)候容易漏。這三個(gè)問(wèn)題想清楚之后代碼其實(shí)就是一個(gè)模板的事。但是模板背后的參數(shù)和坑才是真正值得寫下來(lái)的部分。2. 核心方案解析為什么 stack 是第一選擇2.1 stack 函數(shù)的工作原理stack是 Hive / Spark SQL 里的一個(gè) UDTF用戶定義表生成函數(shù)作用是把 N 列數(shù)據(jù)展開(kāi)成 M 行其中 N 是參與展開(kāi)的列數(shù)M 由你指定的行數(shù)決定。它的標(biāo)準(zhǔn)語(yǔ)法長(zhǎng)這樣stack(n, col1, col2, ..., colk)這里的n表示一共要拆成多少行拆完之后每一行有幾列取決于你后續(xù)AS子句里定義的字段數(shù)量。舉個(gè)最直白的例子如果你寫stack(2, col_a, col_b, col_c, col_d)意思就是把這四個(gè)列的值拆成 2 行每行包含 2 列值。第 1 行的兩列取自col_a和col_b第 2 行的兩列取自col_c和col_d。初次接觸的人很容易繞暈的點(diǎn)就在這里stack的第一個(gè)參數(shù)是“輸出行數(shù)”而不是“輸入列數(shù)”。輸入的列數(shù)必須是n的整數(shù)倍多出來(lái)的列會(huì)被按順序分到下一行。如果列數(shù)對(duì)不上加載階段報(bào)錯(cuò)如果類型對(duì)不上運(yùn)行階段報(bào)錯(cuò)。在 DataFrame 里使用stack通常不會(huì)直接寫.select(col1, ...)這種普通選擇而是要用selectExpr或者把整個(gè)表達(dá)式當(dāng)作一個(gè)字符串丟進(jìn)去df.selectExpr( channel_id, channel_name, stack(12, jan_amount, feb_amount, mar_amount, apr_amount, may_amount, jun_amount, jul_amount, aug_amount, sep_amount, oct_amount, nov_amount, dec_amount) as (month_name, amount) )執(zhí)行完這個(gè)之后原來(lái)的 12 個(gè)金額列就會(huì)變成兩列輸出一列是月份名字段名month_name一列是金額字段名amount。整張 DataFrame 的行數(shù)會(huì)從原來(lái)的 1 行變成 12 行如果原來(lái)有 N 行就是 12N 行。2.2 參數(shù)細(xì)節(jié)和列名映射規(guī)則寫 stack 的時(shí)候有四個(gè)細(xì)節(jié)值得單獨(dú)提出來(lái)說(shuō)全是踩過(guò)的坑換來(lái)的經(jīng)驗(yàn)。第一個(gè)細(xì)節(jié)stack里列的順序決定了行的順序。上例中(month_name, amount)是兩列一組所以偶數(shù)位列名會(huì)落在month_name奇數(shù)位值會(huì)落在amount。如果你把列順序?qū)懛戳溯敵龅?value 和 key 就全錯(cuò)位了。當(dāng)時(shí)我們項(xiàng)目里就出現(xiàn)過(guò)一版數(shù)據(jù)月份和金額完全對(duì)不上排查了半天才發(fā)現(xiàn)是列順序?qū)懛?。第二個(gè)細(xì)節(jié)AS子句里的字段數(shù)量必須和stack展開(kāi)后每一行的字段數(shù)量一致。如果你寫stack(6, col1, col2)每個(gè)輸出行只有 1 個(gè)字段那么AS (value)里就只能寫一個(gè)字段名寫兩個(gè)就報(bào)錯(cuò)。這是一個(gè)非常容易犯的低級(jí)錯(cuò)誤。第三個(gè)細(xì)節(jié)stack展開(kāi)過(guò)程中如果某個(gè)原始值為null它不會(huì)自動(dòng)幫你過(guò)濾掉而是會(huì)把 null 值照常輸出到目標(biāo)字段。如果你的業(yè)務(wù)需要“只有有效數(shù)據(jù)的行”那你得在 stack 之后手動(dòng)加過(guò)濾條件。這個(gè)坑當(dāng)初讓我們多跑了一遍全量任務(wù)。第四個(gè)細(xì)節(jié)參與 stack 的列必須顯式寫出完整列表。不能寫stack(12, *)這種語(yǔ)法也不支持直接放一個(gè)列集合變量進(jìn)去。對(duì)于幾十上百個(gè)字段的寬表手寫不太現(xiàn)實(shí)通常用代碼動(dòng)態(tài)生成表達(dá)式字符串這個(gè)在下面第 3 部分會(huì)給出完整例子。2.3 為什么不用 union 方案我見(jiàn)過(guò)不少同事在沒(méi)接觸過(guò) stack 的時(shí)候會(huì)用union加多次select去拼。思路大概是先 select 維度列 第一個(gè)月字段union 上 select 維度列 第二個(gè)月字段再 union 第三個(gè)月……這個(gè)方案不是不能跑但是它在代碼層面有非常明顯的毛病第一代碼量爆炸12 個(gè)月就要寫 12 段 select如果字段有幾十個(gè)腳本能寫到上千行第二每寫一個(gè) union 子句Spark 都會(huì)多一層邏輯計(jì)劃節(jié)點(diǎn)解析、優(yōu)化、執(zhí)行的開(kāi)銷都會(huì)增加第三可維護(hù)性極差哪天業(yè)務(wù)加了一個(gè)新字段你要從第 1 段改到最后一段漏改一個(gè)就很難發(fā)現(xiàn)。相比之下stack 用一個(gè)表達(dá)式的線性復(fù)雜度就搞定了邏輯清晰、代碼量小、性能也更好。除非你是在做某些極端復(fù)雜的轉(zhuǎn)換或者你的目標(biāo)是把不同來(lái)源的數(shù)據(jù)按行拼接這種應(yīng)該用 union 而不是 stack否則在“寬表轉(zhuǎn)長(zhǎng)表”這個(gè)場(chǎng)景下stack 的優(yōu)先級(jí)是最高的。3. 實(shí)操過(guò)程從數(shù)據(jù)模擬到完整實(shí)現(xiàn)3.1 構(gòu)造模擬數(shù)據(jù)為了把整個(gè)過(guò)程講透我模擬一份脫敏后的數(shù)據(jù)。假設(shè)我們有 3 個(gè)渠道每個(gè)渠道對(duì)應(yīng) 3 個(gè)月的銷售額為了演示方便只取 3 個(gè)月而不是 12 個(gè)月邏輯完全一樣from pyspark.sql import SparkSession spark SparkSession.builder.master(local).appName(column_to_row).getOrCreate() data [ (C001, 渠道A, 100, 150, 200), (C002, 渠道B, 300, 250, 280), (C003, 渠道C, 400, 420, 380), ] df spark.createDataFrame(data, [channel_id, channel_name, jan_amount, feb_amount, mar_amount]) df.show()輸出結(jié)果---------------------------------------------------- |channel_id|channel_name|jan_amount|feb_amount|mar_amount| ---------------------------------------------------- | C001| 渠道A| 100| 150| 200| | C002| 渠道B| 300| 250| 280| | C003| 渠道C| 400| 420| 380| ----------------------------------------------------這就是一個(gè)標(biāo)準(zhǔn)的待轉(zhuǎn)置寬表維度列是channel_id和channel_name需要展開(kāi)的列是jan_amount、feb_amount、mar_amount。3.2 靜態(tài)寫法固定三列轉(zhuǎn)行最直接的方法是寫死三個(gè)列名用selectExpr完成轉(zhuǎn)換result_df df.selectExpr( channel_id, channel_name, stack(3, jan_amount, feb_amount, mar_amount) as (month, amount) ) result_df.show()執(zhí)行結(jié)果--------------------------------- |channel_id|channel_name|month|amount| --------------------------------- | C001| 渠道A| 100| ? ---------------------------------等一下這里就有個(gè)問(wèn)題。stack(3, jan_amount, feb_amount, mar_amount)是把 3 個(gè)列拆成 3 行每行只有 1 列。所以AS (month, amount)的寫法是錯(cuò)的——month拿到的其實(shí)是第一個(gè)輸入列的值也就是 100amount根本沒(méi)有對(duì)應(yīng)的分配系統(tǒng)會(huì)報(bào)錯(cuò)。正確的寫法是讓每個(gè)輸出行有 2 個(gè)字段所以需要傳入 6 個(gè)值result_df df.selectExpr( channel_id, channel_name, stack(3, jan, jan_amount, feb, feb_amount, mar, mar_amount) as (month, amount) ) result_df.show()這次的結(jié)果才是對(duì)的--------------------------------- |channel_id|channel_name|month|amount| --------------------------------- | C001| 渠道A| jan| 100| | C001| 渠道A| feb| 150| | C001| 渠道A| mar| 200| | C002| 渠道B| jan| 300| | C002| 渠道B| feb| 250| | C002| 渠道B| mar| 280| | C003| 渠道C| jan| 400| | C003| 渠道C| feb| 420| | C003| 渠道C| mar| 380| ---------------------------------注意我在傳入序列里加了字符串常量jan、feb、mar。這是 stack 列轉(zhuǎn)行的核心套路你要輸出的“行標(biāo)識(shí)字段”這里就是月份名其實(shí)就是列名本身但列名是靜態(tài)的文本不會(huì)跟著值走。所以你需要手動(dòng)把這些常量對(duì)應(yīng)地放進(jìn)參數(shù)序列里讓它們和真實(shí)列值一一配對(duì)。如果你希望輸出的月份是數(shù)字1、2、3就寫成result_df df.selectExpr( channel_id, channel_name, stack(3, 1, jan_amount, 2, feb_amount, 3, mar_amount) as (month, amount) )原理完全一樣只是常量從字符串變成了整數(shù)。3.3 動(dòng)態(tài)寫法字段特別多怎么辦如果表里有幾十甚至上百個(gè)要轉(zhuǎn)置的列手動(dòng)寫col1, col1, col2, col2, ...當(dāng)然是不現(xiàn)實(shí)的。這時(shí)候就需要 Python / Scala 代碼來(lái)拼接表達(dá)式。以 Python PySpark 為例假設(shè)你的寬表字段名遵循xxx_amount這樣的規(guī)則可以先篩選出所有目標(biāo)列名然后動(dòng)態(tài)構(gòu)造 stack 表達(dá)式的參數(shù)列表amount_cols [c for c in df.columns if c.endswith(_amount)] # 按列名字典序排序保證結(jié)果穩(wěn)定 amount_cols.sort() # 構(gòu)造 stack 參數(shù)序列每個(gè)列前面加上它自己的名字文本 stack_params [] for c in amount_cols: month_name c.replace(_amount, ) stack_params.append(f{month_name}) # 輸出行的月份字段 stack_params.append(c) # 輸出行的金額字段 stack_expr fstack({len(amount_cols)}, {, .join(stack_params)}) as (month, amount) result_df df.selectExpr( channel_id, channel_name, stack_expr )這樣寫完之后即使下個(gè)月上游多了一個(gè)apr_amount字段你只要重新從df.columns里篩選代碼一行都不用改。動(dòng)態(tài)拼接表達(dá)式算是這類需求里比較推薦的進(jìn)階寫法。但這里有個(gè)前提你的列名必須有規(guī)律。如果列名亂得毫無(wú)章法比如a1、b2、c3那就得老老實(shí)實(shí)維護(hù)一個(gè)字段映射表手工指定哪些列要展開(kāi)、對(duì)應(yīng)的輸出標(biāo)識(shí)文本是什么。映射表的方式雖然要維護(hù)但勝在可控、不容易出錯(cuò)。3.4 explode 的適用場(chǎng)景處理 Array 和 Map上面說(shuō)了 stack 是列轉(zhuǎn)行的主力但還有一個(gè)高頻場(chǎng)景是會(huì)用到 explode 的當(dāng)數(shù)據(jù)本身以 Array 或 Map 存儲(chǔ)時(shí)。比如上游給了你一行數(shù)據(jù)里面一個(gè)字段是score_list存的是這個(gè)渠道每一天的分?jǐn)?shù)是一個(gè) Array[Double]你要把它拆成一行行記錄。這種場(chǎng)景用 stack 就得先把 Array 展開(kāi)到多個(gè)列如果 Array 長(zhǎng)度不定根本沒(méi)法展開(kāi)而 explode 就是專門干這個(gè)的from pyspark.sql.functions import explode data [ (C001, 渠道A, [100, 150, 200]), (C002, 渠道B, [300, 250, 280]), ] df spark.createDataFrame(data, [channel_id, channel_name, score_list]) result_df df.select( channel_id, channel_name, explode(score_list).alias(score) ) result_df.show()輸出--------------------------- |channel_id|channel_name|score| --------------------------- | C001| 渠道A| 100| | C001| 渠道A| 150| | C001| 渠道A| 200| | C002| 渠道B| 300| | C002| 渠道B| 250| | C002| 渠道B| 280| ---------------------------如果還需要知道當(dāng)前拆出來(lái)的是這個(gè)數(shù)組里的第幾個(gè)元素用posexplode它會(huì)在輸出里額外帶一個(gè)索引列from pyspark.sql.functions import posexplode result_df df.select( channel_id, channel_name, posexplode(score_list).alias(pos, score) )posexplode在同時(shí)需要“序號(hào)”和“值”的場(chǎng)景里很實(shí)用比如你要把數(shù)組里的第一個(gè)值當(dāng)作基準(zhǔn)值那pos就派上用場(chǎng)了。至于是不是應(yīng)該先把多列合并成struct再用explode拆這種事情純粹看個(gè)人習(xí)慣。如果有人喜歡把 3 個(gè)月的金額先構(gòu)造成一個(gè)array再explode那也能達(dá)到列轉(zhuǎn)行的效果但多了一步構(gòu)造數(shù)組的開(kāi)銷性能上不如直接用 stack 來(lái)得干脆。我的建議是普通的多列轉(zhuǎn)多行別繞路stack 直接上數(shù)組/字典里的嵌套數(shù)據(jù)才輪到 explode 發(fā)揮。3.5 類型不一致時(shí)的處理辦法stack 特別容易踩的坑之一是參與展開(kāi)的列類型不統(tǒng)一。比如某個(gè)月的金額字段是 Double另外某個(gè)月由于上游數(shù)據(jù)問(wèn)題被定義成了 String此時(shí) Spark 在生成邏輯計(jì)劃時(shí)會(huì)發(fā)現(xiàn) stack 的輸入類型不一致直接拋 AnalysisException。解決辦法是在傳入 stack 之前先對(duì)所有列做一次類型統(tǒng)一from pyspark.sql.functions import col # 假設(shè) df 里有多個(gè)列需要轉(zhuǎn)置先統(tǒng)一轉(zhuǎn)成 Double for c in amount_cols: df df.withColumn(c, col(c).cast(double))這種操作在數(shù)據(jù)治理不嚴(yán)格的業(yè)務(wù)場(chǎng)景里非常常見(jiàn)。同一個(gè)業(yè)務(wù)字段因?yàn)樯嫌螆?bào)表口徑調(diào)整從 Decimal 變成 String再到 Double你根本不知道哪一天會(huì)變。所以在 stack 前統(tǒng)一 cast 是一個(gè)成本很低但收益很大的好習(xí)慣。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄4.1 報(bào)錯(cuò)“The number of columns doesnt match”這個(gè)錯(cuò)誤信息通常長(zhǎng)這樣org.apache.spark.sql.AnalysisException: The number of columns produced by STACK should not be greater than number of columns in the query問(wèn)題根源基本是stack里傳的列數(shù)和AS子句定義的字段數(shù)量對(duì)不上。舉個(gè)例子你寫了stack(3, jan, jan_amount, feb, feb_amount, mar, mar_amount)這 6 個(gè)值會(huì)被分成 3 行、每行 2 個(gè)字段所以AS 子句必須寫 2 個(gè)字段名。如果你寫成了as (month)就會(huì)報(bào)錯(cuò)。排查思路很簡(jiǎn)單數(shù)一下 stack 參數(shù)列表里一共有幾個(gè)值除以n得到的結(jié)果必須和 AS 里的字段數(shù)一致。4.2 類型不匹配的坑另一個(gè)高頻報(bào)錯(cuò)是cannot resolve ... due to data type mismatch。參與 stack 的列類型五花八門有 String、有 Double、有 IntegerSpark 為了讓這些類型能放進(jìn)同一個(gè)輸出字段需要找到一個(gè)公共類型找不到就直接報(bào)錯(cuò)。解決方法前面已經(jīng)提過(guò)在 stack 前統(tǒng)一 cast。如果因?yàn)槟銘胁幌雽?cast也可以用coalesce或者字符串拼接把它們統(tǒng)一成 String但這樣后續(xù)用起來(lái)還得再轉(zhuǎn)一次不太劃算。我個(gè)人建議是統(tǒng)一成業(yè)務(wù)最終使用的類型比如金額就統(tǒng)一成 Decimal(18, 2) 或 Double。4.3 合并 null 值的影響stack 不會(huì)主動(dòng)過(guò)濾 null。如果你有 12 個(gè)月的金額列但某些月份確實(shí)沒(méi)有數(shù)據(jù)轉(zhuǎn)出來(lái)的 12 行里那些月份對(duì)應(yīng)的amount字段就是 null。下游聚合的時(shí)候 null 會(huì)被 sum 忽略但如果業(yè)務(wù)要的是“只保留有實(shí)際值的月份”你必須在 stack 之后加一個(gè)過(guò)濾條件result_df.filter(col(amount).isNotNull())這里有個(gè)容易忽略的細(xì)節(jié)如果你用coalesce把 null 替換成 0再去過(guò)濾就徹底失效了因?yàn)槿兂?0 之后你根本分辨不出哪些是真實(shí) 0、哪些是缺失值。所以除非業(yè)務(wù)明確要求缺失按 0 計(jì)否則別輕易把 null 填成 0寧可多留一步讓下游自己決定怎么處理。4.4 執(zhí)行慢重點(diǎn)看這兩處列轉(zhuǎn)行本身不會(huì)引起數(shù)據(jù)膨脹因?yàn)樵疽恍欣锏臄?shù)據(jù)拆成多行后值還是那些值只是形態(tài)變了。所以正常情況下這個(gè)操作不會(huì)比普通 select 慢很多。如果你發(fā)現(xiàn)任務(wù)運(yùn)行特別慢排查重點(diǎn)應(yīng)該放在以下兩處第一檢查是不是有大字段或者數(shù)量巨大的列全部參與 stack。比如一張表有 200 個(gè)字段、100 個(gè)都要轉(zhuǎn)那么單條記錄的寬度極大序列化和網(wǎng)絡(luò)傳輸?shù)某杀径紩?huì)上一個(gè)臺(tái)階。建議先只 select 需要的字段再轉(zhuǎn)不要一上來(lái)就select *。第二檢查是不是在轉(zhuǎn)完之后立刻做了高代價(jià)的 join 或 groupBy。列轉(zhuǎn)行之后數(shù)據(jù)量不變但如果你轉(zhuǎn)完之后又和一張大表做 join那慢的根源其實(shí)是 join而不是列轉(zhuǎn)行本身。把執(zhí)行計(jì)劃拿過(guò)來(lái)看一下哪個(gè) stage 耗時(shí)最長(zhǎng)通常問(wèn)題一目了然。4.5 一個(gè)實(shí)用小技巧動(dòng)態(tài)生成 stack 時(shí)給字段加序號(hào)批量生成的字段比如多個(gè)月份列它們的順序在動(dòng)態(tài)篩選后不一定可控。你可以主動(dòng)給參數(shù)序列排序而不是依賴 DataFrame 的列順序。具體做法是把篩選出來(lái)的列名先排序再拼接表達(dá)式。這樣不管上游表字段怎么亂排你的輸出順序始終穩(wěn)定下游做對(duì)比測(cè)試也方便。另外一個(gè)容易被忽略的地方stack表達(dá)式里的字符串常量比如jan如果是變量拼 SQL 的時(shí)候記得轉(zhuǎn)義和加引號(hào)防止空格、特殊字符把表達(dá)式搞壞。我見(jiàn)過(guò)有人動(dòng)態(tài)拼出的表達(dá)式里字符串寫成了month_2024-01結(jié)果日期里的連字符導(dǎo)致表達(dá)式被截?cái)嗯挪榇_實(shí)費(fèi)了些時(shí)間。穩(wěn)妥的做法是構(gòu)造表達(dá)式后用spark.sql跑一個(gè)select快速驗(yàn)證或者打印出來(lái)看一遍再執(zhí)行。5. 項(xiàng)目落地中的一點(diǎn)個(gè)人經(jīng)驗(yàn)列轉(zhuǎn)行這個(gè)操作看著簡(jiǎn)單但在真實(shí)項(xiàng)目里它往往不是一次性跑完就結(jié)束的。數(shù)據(jù)入倉(cāng)、數(shù)據(jù)清洗、ETL 調(diào)度、下游 BI 報(bào)表每一步都可能對(duì)輸出的字段命名、類型、null 值策略有不同要求。我在這個(gè)項(xiàng)目里做了一版標(biāo)準(zhǔn)化方案之后基本把它固化成了一個(gè)公共函數(shù)團(tuán)隊(duì)里其他人遇到“寬表轉(zhuǎn)長(zhǎng)表”就直接復(fù)用不再重復(fù)踩坑。公共函數(shù)的核心邏輯不復(fù)雜輸入 DataFrame 和一組“列名 → 輸出標(biāo)識(shí)”的映射自動(dòng)統(tǒng)一類型、動(dòng)態(tài)拼 stack 表達(dá)式、輸出標(biāo)準(zhǔn)化字段。如果你們團(tuán)隊(duì)經(jīng)常處理類似的報(bào)表數(shù)據(jù)我強(qiáng)烈建議一步到位做成通用工具省得每次手工改腳本。還有一點(diǎn)列轉(zhuǎn)行的結(jié)果最好直接落成 Parquet 格式的中間表字段命名要跟下游約定清楚。因?yàn)檗D(zhuǎn)完之后原先藏在列名里的月份信息現(xiàn)在變成了一個(gè)字段的值這個(gè)值的數(shù)據(jù)質(zhì)量直接決定了下游過(guò)濾條件怎么寫。如果month字段有時(shí)間類型、字符串類型混著來(lái)下游查詢腳本就得寫兩套邏輯維護(hù)成本翻倍。最后說(shuō)一個(gè)從實(shí)際操作里沉淀出來(lái)的心得column-to-row 的思路在很多 SQL 引擎里是通用的不只是 Spark。你如果熟悉了 Spark 的 stack后面接觸其他引擎里類似的 unpivot 函數(shù)會(huì)發(fā)現(xiàn)核心思想都是一樣的——把“元數(shù)據(jù)”從列名里解放出來(lái)變成真正的數(shù)據(jù)。這個(gè)理念在數(shù)據(jù)建模里也值得留意凡是長(zhǎng)期要沿用的寬表多花一點(diǎn)時(shí)間把它轉(zhuǎn)成規(guī)整的長(zhǎng)表后面的分析工作會(huì)輕松非常多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
伊人五月天婷婷| 91色香| 襙一襙| 精品蜜乳AV免费观看| 日欧毛片久久| 天天操天天插| 热99这里有精品综合久久| 国产 v乱码一区二| 嗯啊不要在线| 日本岛国黄色网址| 婷婷激情丁香| 成人熟女视频一区二区三区| 国产麻豆一级精品视频| 九九五月天| 精品国产乱码久久久久A| 欧美se综合| 日韩在线76| 日日碰狠狠添天天爽超| 每日更新AV| 亚洲天堂2020| 91亚州欧美| 天堂中文资源在线bt| 九九九九热只有精品| 激情终合网| 亚洲成人免费中文字幕| 欧美日韩中文字幕不卡| 国产SV一线| 久久久精品成人国产| 熟女精品日韩一区二区三区| 天天激色| 熟妇熟女一区二三区| 天堂种子在线www网资源| 97干97色| 久久久精品视频欧州站| 九九天堂| 亚洲成a人在线观看久| 性猛交| 亚洲一区二区av| 手机不卡视频不卡在线一二三区| 中文字幕免费观看| 久久国产视频性吧| 1024人妻熟女一区二区三区| 国产精品蜜乳AV| 国产高清MV操逼视频| 97综合国产| 人妻欧美| 人妻天天爽天天爽三区| 九九热午夜欧亚国产视频| 中文字幕精品一区二区精品| 9/A片 | 综合免费无码中文| 久久伊人最新网址视频| 26uuu最新| 性天堂| 78精品| 最新制服中文第一页| 中文字幕伊人| 超碰综合色| 啊啊啊啊啊啊在线看| 亚洲精品亚洲人成在线麻豆| 亚洲 欧美 小说| 久久久久斤小| 国产激情在线| 俺去啦俺来也久久综合| 天天射天天| 岛国黄色短视频| 午夜精品视频777| 亚洲麻豆精品二区三区| 亚洲、日韩、综合、另类| 亚洲精品不卡一二三区| 国语精品av| 国产 日韩,欧美 自拍| 天天插夜夜操| HEYZO高无码国产精品227| 日韩av乱伦| 97玖玖超碰| 少妇熟女视频一区二区三区| 天天操熟妇| 久久九操在线观看| 成人五月天丁香激情综合| 天天日天天干少妇日| 成人麻豆av电影网站| 香伊人在线| 色爱综合网| 97在线观看免费视频l| 国产av热热色| 国产熟妇 码视频户外直播 | 97自拍一区| 东方亚洲在线操逼天堂| 秋霞一级鲁丝片A片| 91成人在线免费视频| 亚欧精品久久久久久久久久久| 亚洲少妇在线影音| 2020久久免费视频| 日本久久网| 春色校园综合网| 欧美久久婷婷| 亚洲精品久久久久毛片A片拉屎 | 久久曰曰| 久久欧美1卡2卡3| 久久亚州大香蕉| 巨爆乳一区二区爆乳区| 亚洲成人综合在线| 天天操天天日青青草超碰av| 熟妇人妻丰满久久久久久久无码| 亚洲操逼无码| 亚洲国产蜜臀系列在线观看| 久久精品高清AV| 白 大 人妻 区 在线| 少妇久久久| 99热啪啪| 欧美性爱网97| 中文字幕美女91| 91蜜臀熟女| 综合91网| 国产精品香蕉热久久新品| 999日韩中文精品观看视频。| 首页亚洲国产高跟丝袜诱惑视频| 久久超碰av在线| 国产极品精品美女视频| 久久999久| 热思思免费视频| 国产精品网站www| 日本免费一级AAA大片器 | 久久久不卡区一区二区三区久久久| 欧美成人性活片| 五月天啪啪| 色噜噜人妻av中文字幕| 日本免费人成视频播放120秒| 久九九九九九九热| av天堂电影网| 四虎在线播放| 久久伊人大香蕉| 人妻丝袜一区二区三区在线| 欧美激情综合| 97视频新免费| 亚洲一区中文字幕一区| 大学生美女口爆| 九色 人妻 大香蕉| 国产精品一区二区手机看片| 午夜精品一区二区三区三上悠亚| 一级婬片120分钟试看| 久久久18禁| 欧美不卡二区| 夜夜草我| 99这里都是精品| 九久9精品| 99精品久久久久久久婷婷蜜桃| 久久精品人人做人人看| 爱干爱射网啊啊啊| 中文人妻av高清一区| 青青草日韩无码| 亚洲无码精品AV久久久| 亚洲色图欧美色图综合| 天天综合97| 国产精品久久久久无码A√| 亚洲AV不卡在线观看尤物| 丁香五月综合| 亚洲国产综合图区中文字幕| 日韩欧美中文字亚洲慕| 亚洲十八禁止| 亚洲不卡AV在线| 免费黄色片。| 国产精品美女视频诱惑| 欧洲亚洲人妻无码高清久久三区四区| 久久精品欧美一区二区三区不卡| 夜夜嗨一区二区三区三州加勒比| 亚洲18禁| 国产成人无码高清| 国产精品午夜福利亚洲综合网| 欧美激情色婷婷花野真衣一区二区| 大香蕉免费乱伦视频| 亚洲精品日日夜夜52| 乱伦熟妇一区二区| 九九碰九九爱97超| 熟妇人妻精品一区二区| 中文一区二区| 亚洲综合性感在线| 激情综合97| 国产偷拍自拍在线视频| 日韩综合成人免费视频| 91亚洲色人| 蜜臀一区二区三区在线 | 精品人妻一区二区三区夜夜| 最新欧美色网| 综合网色| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 欧美不卡五十路| 精品二区三四区五电影 | 五月婷丁香| 91足交| ,成人免费啪啪视频| 爱干爱射网啊啊啊| 欧美日韩丝袜| 亚洲一区中文字幕一区| 国产精品自拍欧美在线| 国模精品一区二区三区苹果色戒| 操高情无码| 欧美性生活免费网| 人妻一二三区| 青青操轻轻| 国产成人亚洲精品无码古代早漏男| 欧美极品色| 黑人与人妻| 欧美午夜色妇色鬼| 久草在| 日韩精品高清资源在线| 亚洲男人天堂2016| 无码二级三级| 九九热精品| 国产精品另类| 91欧美情色| 日韩久射综合| 久久久夜夜夜| 欧美一区二区三区不卡高清视频| 天天综合网日韩| 在线视频免费观看午夜| 久9re热视频这里只有精品| 国产精品久久| 国产美女裸体秘 永久无遮挡| 天天夜躁日日躁狠狠2002| 97香蕉网| 中文字幕AV乱伦| 久久透逼视频| 精品偷拍13p欧美dodk视频| 日韩一级特黄av毛片| 欧美成人四级在线播放| 情色AV电影| 在线视频五十市| 97亚洲欧美日韩| 蜜臀av网址| 涩亚洲欧洲| 精品国产乱码久久久久久久| 91天天看| 亚州免费啪啪视频| 久久99视频| 丁香五月AV| 成人日本精品九区| 大香蕉日韩欧美| 91制服丝袜| 国产精品久久久吖| 强奸乱伦大香蕉网| 成人天天看站长推荐| av久日| 国产乱码久久久| 97久久网| 逼逼逼逼操操操操操操操操操午夜剧场| 熟女六十路| 亚洲欧洲小说图片视频 | 精品人妻少妇| 欧美日韩免费性爱| 亚洲无套久久嗯嗯| 亚洲人码13| 国产综合久久久麻桃个| 强奸乱伦亚洲第一页| 免费黄色片子| 亚洲老司机123专区| 91四海无码日韩欧美| 天堂v无码免费视频| 四虎影视永久在线免费| 欧美日韩婷婷中文| 97免费在线视频| 蜜臀AV网站| 久久av色| 亚洲男人久久综合天堂| 久久天堂婷婷网| 97视频900| 清纯唯美亚洲| 六月婷婷激情| 东京热,男人的天堂| 99久久久久久亚洲精品不卡| WWW4虎| 日本一二三免费久久| 激情小说日韩无码| 久久这里都是精品| 夜夜骑夜夜操| 大香樵伊人网| 亚洲色婷婷久久91| 日韩少妇丰满亚洲| 国产 日韩,欧美 自拍| 日本色色色| 密臀成人视频久久久| 精品人妻1区| 久久熟妇五十路一区| 国产久久久久久| 大香蕉伊人色偷偷在线| 果冻传媒A片麻豆熟妇人妻| 欧美成人午夜免费福利785| 青青草乱入乱欲视频在线观看| 96精品久久久久久久久| 中文字幕丝袜人妻| 午夜男女爽爽爽影院视频| 99热综合在线| 国产乱伦视频污| 熟妇人妻一区二区三区| 人妻偷拍一区二区三区| 日韩精品9区| ..日韩av毛片精品久久久| 吉川爱美亚洲二区在线| 亚洲图片欧洲图片aⅴ| 精品无码久久久久| 乱伦日本色图AⅤ| 亚洲国产亚洲天堂| 亚洲中文一区二区三区视频| 国产精品伦理| 艾草av| 丁香九月 婷婷| 青青青艹在线视频| 亚洲国产麻豆一区二区三区| 99精品无码| 99热超碰在线| 91福利网在线观看| 全球成人中文在线| 深田咏美亚洲精品福利社| 国产精品久久久九九九| 欧美性生活综合| 色综合91好| 天天干少妇| 亚洲精品国语在线播放| 99黄页网站| 久久久国产成人一区二区三区在线| 狠狠97| 操操碰| 欧美激情久操网| 色九九九综合| 大香蕉乱伦视频网| 亚洲春色一区二区三区| 欧美在线 亚洲| 久色网| PMv在线观看| 极品色电影院| 色婷婷aV一区二区三区麻豆综合| 91插B网站| 亚洲色图大香| 亚洲一本色道中文无码aV天美| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 久久中出在线| 国产激情视频在线观看| 秋霞一集毛片观看| 美女天天干| 成人无码专区精品视频| 欧美精品久久久久久久久88| 久久精品人人做人人看| 98久久超碰| 清清草影| 中文字幕国产精品1区| 嗯啊不要在线观看嗯啊| 成人麻豆av电影网站| 东京热天堂网| 久久国产精品一区二区| 欧美亚洲天天| 九九九九九九九九九九九九九九九女| 99热精品在线观看| 国产高清午夜成人在线观看| 久久欲| 夫妻AV网站| 亚洲国产91精品一区二区久久| 超碰性爱97| 97免费在线视频在线观看| 青青在线视频日韩欧美| 亚洲偷91色| 国产极品999| 777奇米影视777四色| 人人弄人人摸| 精品国产乱码久久久久久蜜臀| 是还免费视频1727我| 日韩pv中文| 久操热线| 六月激情婷婷| 国内精品久久久久影院亚洲| 黄色AAAAA欧美| 无遮挡男女激烈动态图| 少妇久久久久| 国产精品片| 久久高潮妇女视频| 99久久久| 97鸡把在线视频| 国产视频小说| 四虎在线观看网站| 国产一区二区精品在线视频| 欧美一区二区男人天堂| 激情婷婷综合久久| 日本高清视频xxxx| 99re免费视频精品全部| Av手机版天堂网| 亚洲码在线中文在线观看| 久草午夜| 色色色日本| 91啦人妻| 欧美日韩性爱无码| 亚洲福利中文字幕在线| 91GD.COM| 日韩有码免费视频| 青青草在线成人视频| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 亚洲精品中文字幕一区在线视频| 蜜桃无码AV一区二区| 欧美日韩岛国大片在线观看| 亚州色图第三区| 久久婷婷一区二| 自拍盗摄一区| 91劲爆| 97欧美色| 亚洲欧美日韩偷拍色图| 国产精品爱欲| 欧美 亚洲 偷拍自拍| 香蕉久久国产AV一区二区| 亚洲 日本 一 二 三| 久久国99999| 啊操爽品善一区二区三区| 97看操| 97超碰中文字幕| 天天影视综合色| 久久久96| 国产色综合亚洲色综合吹潮| 内射中国少妇高清视频免费视频| yazhouzaixian| 美女91| 亚洲九九夜夜| 很黄很污的免费网站| 亚洲精品国产AV天美传媒| 蜜臀久久久国产| 国产白丝网站| 强奸乱伦大香蕉| 久久婷婷五月天| 四虎免费看黄| 色欲久久99国产精品久久久久久| 家庭乱伦国产| 男人夜色天堂ss| 999 久久久| 日本506070| 无码精品人妻一区二区三区妖精| 中日无幕一二三四区| 91精品免费| 国产91精品在线免费| 亚洲色 国产 欧美 日韩| 一本一道人妻久久一区二区三区| 免费99精品国产自在在线| 亚洲欧美情色| 亚洲国产无码精品首页久久久| 夜夜操夜夜爽夜夜高潮| 91在线观看,天天综合| 樱花蜜乳av| 桑老女人九区| 九九九九精| 亚洲中文日韩精品| SS久久| 不卡日本一区二区| 国产视频一区二区免费| 久久骚| 看免费的黄片| 99久久com免费视频′| 天天情欲宗合网| 影音先锋少妇| 欧美亚洲日韩16色| 岛国在线免费视频| 国产男女无套97| 国产精品高潮久久久无码| 久久婷综合| 人妻人久久精品中文字幕| 91人妻精华帖| 黄日韩| 国产黄色小视频网站| 日韩欧美麻豆大片| 狠狠色伊人亚洲综合网站色| 亚州色图欧美| 久久男人精品| 一二三四视频在线社区中文字幕| 亚洲精品一区二区精品| 亚洲男人天堂2016| 婷婷影院入口| 91女色| 国产成人网址| 美女极品一区二区三区| 青青草九九九九九| 乱伦图一区| 桃色六月天| 人人操人人色网| 超碰亚洲欧美日韩无| 啊啊啊好想要| 91美女在线看| 黑人精品成人一区二区三区| 啊啊啊啊好疼| 欧美色图亚州激情| 亚洲成a人片在线观看中文!!!| 天天插天天操天天摸天天射天天看| 欧美日日操| 欧美高潮| 激情自拍 校园春色| 精品人妻一二三| 色情亚洲日本成人| 久久久久国产精品喷潮免费观看臀| 久久久内射良家| 亚洲欧美日韩综合在线尤物 | 日韩人人精品| 麻豆天美国美国产| 探花一区二区三| 亚洲在钱| 67194无码不卡| 亚欧视频在线| 友优传媒精品在线一区二区| 日韩天堂av电影在线观看| 国产亚洲精品无码三区| yazhououmeizongya| 丝袜美腿诱惑亚洲欧美视频在线观看| 91看黄片| 日产精品久久久一区二区| 夜色五月天| 三级特黄60分钟播放| www.人人摸在线视频| 亚洲免费精品一区| 黄色性爱网网| 在线观看一级α片刺激高潮视频| 97欧美色| 国产中文福利| 丁香六月综合激情| 中文字幕91页| 欧美精品成人一区二区在线观看| 国产女人9999| 国产白嫩精品久久| 色色色网站| 日韩亚洲中文字幕在线| 亚洲人成在线放东京热| 欧美综合自拍亚洲综合图| 色老汉色| 深爱五月天| 国产精品激情久久久久久久| 国产女同在线观看视频| 我爱操| 97频视在线| 老女人爆菊| JULIA一区二区三区在线播放| 亚洲中文字母在线播放| 国产最火爆久久国产网站网站| 国产伊人精品在线| 人妻少妇久久| 亚洲涩图欧美| 欧美国产有色电影| 少妇69中文| 久久国产三区| 中文字幕第页| 欧美激情超碰777| 自拍偷拍国产欧美日韩韩| 大色综合| 留下AⅤ黄色片| 84YTCOM性无码| 国产精品另类| 亚洲蜜臀精品视频久久| 一级黄色视频网| 欧美色图综合网| 日韩欧美~中文字| 亚洲九九视频在线观看| 麻豆黄站| 啊啊啊啊啊啊啊在线| 日韩精品第3页| 久草视频制服诱惑| 天美一二三在线观看Av| 日韩人妻网站| 国产乱弄免费在线视频。| www老逼91| 99久久com免费视频′| 人妻激情另类| 国产夜夜艹| 欧美精品丝袜久久久中文字幕| 亚洲天堂女优在线| 少妇一区二区三区在线观看| 欧美色图私拍91| 884t在线| 亚洲情色综合网| 久久久久久免费电影| 啊啊啊啊,啊啊好多水| 天天综合网亚洲综合网| 就去色综合| 中欧人妻丝袜中文字幕 | 日韩精品免费高清视频在线| 上海一级黄片| 亚洲中文字母在线播放| 四虎AV在线观看| 成人AV素股で擦久久| 欧美黄色图片| 91综合色噜噜| 肏逼视频日本| 色情乱伦AV| 午夜免费福利视频一区| 91亚洲人电影| 亚拍在线| 大香蕉99999| 日本淫乱女一区二区三区视频| 日韩 国产 欧美自拍| 小日子操bb在线看| 九九伊人网| 欧美一区二区传媒| 老鸭窝在线视频播放| 日韩熟女精一区二区三区不卡| 丁香婷婷五月| 国产精品无码AV网站| 国产亚洲人妻综合日韩 久久| 天堂国产AV| 亚洲h片在线免费观看| 国产美女口爆吞精视频| 在线国产一区二区av| 青青草在线成人视频| 伊人亚洲综合| 狠狠操狠狠操操| 人人操,操人人| 免费啪啪av| 国产欧美一级在线观看| 欧美色婷婷| 欧美A√综合网 | 色播综合| 91N综合在线| 亚州性色| 一区二区三区视频在线观看免费| 歐美一級亂黃99在綫精品| 啊啊啊啊啊舒服| 国产乱伦视频污| 国产精品秘 福利姬在线观看| 青青草五月天| 麻豆成人影音在线| 九九综合久久| 涩涩久久精品| 日本一区二区三区免费观看| 99精品在线| 人人弄人人摸| 婷婷中文字幕| 91在线一起| 欧美 日韩 亚洲 春色| 中文字幕 一区二区 亚洲无码| 久久精品六区| 国产偷拍自拍在线视频| 1000午夜黄色| 亚洲精品国产熟女| 91中文精品日韩欧美在线| 91久久久久久久久18| 色播丁香| 极品色综合| 九色婷婷| 亚洲日精品| 日韩一级片在线看| 超碰激情808| 人澡逼| 91在线超高颜值国产| www.色操逼| 久久九九精品一区二区| 日本加勒比无码专区| 亚洲无码一二三区| 91精品人妻啪啪间| 大香蕉一线视频| 操死我了啊啊啊| 亚欧Av| 欧美色道啊| 久久高清欧美国产| 人妻人久久精品中文字幕| 日本一区二区成人在线| 青青草原成人| 99热精品在线| 伊人国产成人av网站| 91青视频| 26uuu欧美日韩| 最新av在线| 熟女色综合久久| 综合亚洲网| 猛交交| 偷拍偷窥与盗摄视频专区| 99国产天美| 丁香九月 婷婷| 免费成人在线熟妇网| JIZZJIZZ国产精品喷水| 色欲久久99国产精品久久久久久| 久草精品热视| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 色精品极品| 国产传媒午夜理伦精品| 日本精品九九九| 91丨九色丨大屁股| 牛牛AV人人夜夜澡人人爽| 性性久久| 超碰91在线| 日韩兔费看黄片| 少妇色综合| 久热这里| 免费日韩黄片| 精品十八在线观看| 青青青国产| 精品亚洲国产成人av网站| 97久久超碰亚洲| 嗯阿好爽好紧| 日本肏逼视频在线观看| 国产色图乱伦| asc国产精品| 成年男人的天堂| 日本性爱少妇| 囯产精品久久久久久久久久梁医生| 欧美男人亚洲天堂| 亚洲色图超碰在线| 日韩午夜精品一区二区三区电影| 亚洲精品99999| 狠狠躁日日躁夜夜躁A| 日韩人妻少妇 一区二区三区| 日韩精品一区二区高清| 99少妇| 欧美A√综合网| 欧美日不卡| 日本日皮视频逼| 国产亚洲精品久久久久小| 欧美 色 亚洲| 熟女露脸激情自拍视频| 欧美曰韩国产精品| 超碰亚洲97| 日韩精品中文字幕二区| 2017人人操,人人摸| 97综合国产| 欧美性第1页| 98福利在线视频| 欧美激情 日韩精品| 天天爱天天操| 人妻22p| 欧美视频一区二区在线| 女欧美一区二三区| 久久久999| 欧在线一二区| 精品97久久| 亚洲日韩黑丝| 夜色97| 亚洲999综合| 久久久性爱视频| 久久这里精品国产99丫e6| 先锋精品av色鲁| 1024日韩| 成人婷婷丁香| 天天天天干| 亚洲激情在线| 色综合色色| 色色婷婷五月天| 欧美一级A片在线看视频性色| 淫荡少妇免费| 日韩欧美aⅴ综合网站发布| 国产强奸91| 中国一级特黄大片护士| 岛国激情视频在线观看| 一级毛片久久久久久久女人18| 亚洲电影中字一区二区| 100啪啪视频大全| 亚洲av综合伊人久久| 青青操网| wwwxxx日本爽| 强奸乱伦AV网站| 永久免费发布性爱网| 国产三级多多影院2022国产AA一级毛片无码 | 十八禁视频一区二区| 高清在线不卡一区二区 视频| 粉嫩av平台| 伊人丁香五月婷婷| 亚洲va有码在线天堂| 久久久麻豆精品| 国模精品一区二区三区苹果色戒| 五月婷婷六月丁香| 亚殴在线| 夜夜福利| 999久久芭蕾| 91欧美经典| 色综合一本| 激情网色| 五月天色综合| 东京热一区二区三区四区五区六区| 操人妻逼91| 嗯嗯啊啊的视频| 992视频一区| 9国产超碰| 欧美疯狂做爰xxxx| 久九九九九九九热| 欧美日韩97在线| 成年人黄色| 亚洲精美粉嫩嫩泬在线观看| 99热久| 久久精品视频28| 骚妻少妇精品性色无码四色A V| 91熟女网| 在线色导航| 激情综合五月婷婷| 国产熟妇一区二区| 欧洲亚洲人妻无码高清久久三区四区| 日韩一级欧美一级国产一级台湾| 国产一区二区精品久久99| 国产一级片| 久久伊人青青草| juliaann欧美丝袜办公室| 成人无码在线视频网站| 大香蕉婷婷| 色综合久久夜色精品国产天堂| 日本一线产区和二线产区伦理片| 白丝被操91| 色婷婷丁香五月| 精品美女少妇一区二区三区| 九九九九九精品视频| 成人性爱av.com| 欧洲综合视频| 欧美高清91| 盗摄女人妻在线| 歐美一級亂黃99在綫精品| 97操碰| 性色av蜜臀av色欲aV| 禁止观看美女黄| 99这里只有精品| 国产东北女人在线视频| 久操高青| 精品人妻一区二区三区免费视频| 日本狂喷奶水在线播放212| 青青国产精品在线| 清纯唯美综合| 国产精品香蕉热久久新品| 二对二中文字幕。| 日韩福利电影网| 色爱综合网| 东京热91| 色婷亚洲五月在线观看| 天天舔天天日天天射| 韩国免费播放一级毛片| 日韩草久视频| 日韩在线电影| 99这里都是精品| 91情色在线| 中文字幕一区日韩精| 我爱搞逼综合网| 无码少妇精品一区二区60岁老人| 人妻少妇一区二区| 亚洲第一男人天堂| aaaa黄片| 大鸡巴久久| 91精品国产一区三一| 丰满人妻一区二区三区大胸懂色| 久久久性爱视频| 日韩一区二区精彩视频| 日本女厕偷拍| 国产兽交视频在线播放| 久久发布国产伦子伦精品| 老熟女网站| 亚洲欧美一区二区三区在钱蜜桃| 国产97色在线| 久久精品欧美一区蜜桃| 91人妻少妇| 国产日本熟女顶级一区二区三区视频| 亚州综合色| 有码免费观看| 一个国产在线综合网站| 婷婷精品国产一区二区三区日韩| 蜜乳AV.COM| 九九九九九九视频| 免费看A片毛毛片在线播| 97精品97久久| 精品一二三区久久AAA片| 青青青草原| 色婷婷av在线观看| 国产农村妇女精品| 精品十三区| 丝袜剧情| 天躁夜夜躁2021| 欧美精品成人亚洲| 日本黄色精品专区网站| 欧美亚洲日韩16色| 韩国一级做A片免费的| 9久热这里只有精品| 国产高清1234区| 国产探花日韩援交| 人澡逼| 这里有精品| 国产多人在线观看视频| 欧美日本不卡| 久久精品人体AV| 中文字幕,人妻,日韩| 综合色久欲| 色妹子A V| 波多野结衣先锋影音| 久草精品在线| 欧美九九爱| 欧美日韩亚洲一区二区在线观看| 欧美色图97| 欧美色偷拍 | 久久黄色性爱视频| 久操免费电影| 久久综合女优| 色色色网站| 一级做a爰片久久毛片图片| 激情另类激情| 极品粉嫩少妇视频| 97电影院超碰| 91成人久久 | 超碰人人干| 可以免费看黄片的视频| 色九九久九九| 蜜臀99999| 九九av| 91人妻做a观看视频| 91综合天天| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 精品四五区| 欧美网站免费| 俄罗斯一区二区视频在线观看| 青青五月天| 精品中文日韩字幕视频| 久久久9品一区二区三区| 日本精品一区二区中文字幕| 操逼逼一区视频| 五十路一区无码| 欧美激情黑人| 91久久堂| 少妇天堂网络| 丰满人妻一区二区三区四| 一区二区三区精品视频| 国产精品 久久久精品一牛| 久久久人妻| 丝袜美腿丝袜| 亚洲男人天堂2| 91 综合 色| 精品国产99| 亚洲精品色| 久久久草成人网站久久久草成人久久久草久久久 | 国产精品成人蜜臀AV在线| 人人操 欧美| 视频一区二区免费在线| 欧美劲爆第一页| 97超碰伊人| 亚洲高清自拍| 久久青青草在线视频| 极品人妻少妇综合| 日本不卡免费二区| 人乳av| 97精品97久久| 男人的天堂在线| 麻豆国产成人精品| 青青欧洲黑| 亚洲综合骚逼| 国产久久久久影院老熟女| 97超碰久| 精品一区二区三区蜜桃臀www| 狠狠亚洲| 啊啊啊啊好疼视频| 午夜无码熟妇丰满人妻| 性九九九九九九| 性色高清..……| 天堂亚洲精品| 亚洲色电影在线| 人妻铁牛TV| 成年无码动漫av片无尽在线| 91少妇| 亚洲码在线中文在线观看| 69XX一中文字幕人妻91| 国产成人99久久亚洲综合| 午夜.DJ高清在线观看免费7| 密乳AV免费观看| 国产精品婬乱一级毛片彝族| 人妻aa| 久99久视频| 亚洲一区二区麻豆影院| 熟妇人妻精品一区二区视频色欲| 丰满欧美少妇| 18岁禁 茉莉成人久久| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 91香蕉视频在线观看免费| 精品高清一区二区三区三州| 最近2019中文字幕国语免费版| 日韩欧美经典在线观看| 伊人久久88国产女| AV高清一区| 国产精品一级二级在线| 久久9精品| 欧美日韩*字幕一区| 美国一区二区三区视频| 欧美日韩操逼嗦吊| 天天综合精品| 亚洲有码第一页| 99久久99九九99九九九| 国产在线能看的你懂的| 日韩精品中文字幕一| 97自拍视频在线| 久久久穴999| 中文字幕免费在线观看| 日本孕妇一区二区视频操逼免费看 | 亚洲国产欧美另类自拍| 久久婷婷伊人| 天美欧美国产| 97中文字幕九区| 亚洲啪AⅤ永久无码| 久久九九网| 啊啊啊啊啊啊啊好爽不要| 天天综合,91入口| 尹人免费观看视频在线| 久久99精品视频| juliaann丝袜大战黑鬼| 超碰色97| 91爆操视频| 91超碰人人| 久超碰这里只有精品| 韩日色费| 91精品91久久久中77777| 欧美白嫩在线放| 777超碰| 日韩一区二区三区四区五区| 亚洲另类春色| 干干干天天| 亚洲熟妇丝袜在线观看| 欧美小说区视频区| 午夜亚洲国产理论秋霞| 精品少妇后入一区二区三区四区人妻巨乳| 热热热热日日漂亮永久永久国产日| 欧美日韩亚洲天堂| 5278欧美一区二区三区| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | ..日韩av毛片精品久久久| 黄色污污污污污污网站| 日日日日做夜夜夜夜做无码97| 熟女激情综合网| 国产少妇肉丝在线观看| 人人澡人人澡人人| 国产精品呦一区二区三区| 少妇蜜汁| 伊人网高清| 久久久精品视频免费观看| 亚洲限制级| 色婷婷六月丁香七月婷婷| 国产精品一区人妻精品阁在线| 色网亚洲人| 色综合久| 亚洲欧美91√| 一本一道vs波多野结衣| 嗯嗯啊啊视频一区二区三区| 日本操逼无码| 亚洲 中文 女同| 东北女人操逼| 天天影视网综合少妇| 少妇蹲下露出大唇5| 亚洲另类电影| 色九九久九九| 国产 码在线成人网站| 久久久免费高清中文视频| 男男H黄动漫啪啪无遮挡网站| 91男同| 99久久久er直播网址| 91国精产品| 天天干夜夜一操| 久久久久极品| 自慰白浆在线观看| 欧美激情亚洲| 色综合天天| 清纯唯美亚洲综合| 人妻日日夜夜精品| 亚洲欧美国产中文视频| 欧美无圣光在线| 国内毛片国产欧美拍| 国产又大又粗又长视频在线| 国产三级在线现体验区| 91欧美美女日韩国产婷婷| 国产日韩在线播放av| 偷拍五区| 2020国产精品| 久一区久久蜜桃| 不卡九肏| 精品视频免费在线一区| 少妇特黄一区二区三区| 久操热线| 91老女人| 狠狠图片青青草| 一区二区三区四区免费视频| 亚春色色| sss视频华人在线| 三级激情网站| 久久婷婷苹果| 九九精品美女高溯喷水| 超碰色男人操熟女| 日韩射图| 国产精品久久9| 日韩亚洲国产视频| 96一区二区三区| 青青操97| 国内毛片国产专区二| 亚洲色人阁| 欧美日本天堂| 色色色五月婷婷| 国产精品懂色tv影视免费观看| 99蜜桃臀久久久欧美精品网站| 免费一级欧美片片线观看| 老熟女91| 狠狠操狠狠燥| 国产自产91区13区| 日韩欧美俄罗斯A片| 最近二区三区视频大全| 性生活无遮挡纯毛片在线看| 大香蕉五月天| 免费一级性爱久久| 欧美成97爱| 婷婷丁香一区二区三区| 亚洲色综合| 琪琪精品免费一区二区三区| 青青青在线高清视频在线一二三四区| 欧美大香蕉97| 五月婷视频| 操逼操逼逼操操逼91| 91在线视频国产网站| 欧洲一区二区三区四区在线观看| 116美女午夜| 99人人干| 在线欧美69V免费观看视频| 亚洲天堂资源网| 无码人妻毛片丰满熟妇精品区| 性色乱AV一区二区| 综合婷婷| 在线人人人人人人精品超| 乱伦日本中文自拍| 夜夜欧美| 国模久久在线| 久久綜合很很很| 超碰超碰95| 深爱五月婷婷| 亚欧国产无码精品在线| 超碰无码加勒比| 欧美一区二区三区不卡高清视频| 欧美日本不卡在线| 色婷婷一区二区三区久久午夜成人不| 色诱avtt| 手机不卡视频不卡在线一二三区| 日本色婷婷| 日本精品成人无码| 亚洲欧美在线观看免费| 日本黄大片在线观看视频| 日本精品999| 校园春色亚洲色图| 国产精品禁久久久精品| 激情情色五月天| 国产精品天干天干综合网麻豆| 人人操天天爽| 亚洲天堂女优在线| 熟女啪啪视频| 色精品极品| 九九九午夜| 冬京热男人的天堂| 美女露胸露奶头| 尻女朋友一夜| 热天堂一区二区| 久热久一区二区三区| 色噜噜国产在线| 欧美综合97www| 桃色六月天| 躁躁日曰躁2020| 丰满精品人妻少妇久久字幕| 欧洲精品在线播放| av麻豆啪啪| 久久同城AV| 欧美激情亚洲情色| 九九九九九九免费视频| 91九色丰满高潮| 色网亚洲人| 九九九九九九九九九国产精品| 久久免费9| 成人线上超碰| 国产9 9在线 | 亚洲| 精品国产一区二区三区在线播出| 国内精品a| 成人乱码一区二区三少妇| 亚洲精品美女久久久久久久久| 五月天综合在线|