国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成AV人片在线观看网址_日本激情视频高清综合久久_亚洲午夜视频福利_国内大量揄拍人妻精品視_久久国产精品福利二区三区

ARTICLE DETAIL

資訊詳情

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

Hive導(dǎo)入導(dǎo)出CSV全攻略:從建表到踩坑實(shí)戰(zhàn)

Hive導(dǎo)入導(dǎo)出CSV全攻略:從建表到踩坑實(shí)戰(zhàn) 1. 項(xiàng)目背景與核心訴求解析做數(shù)據(jù)開發(fā)的同學(xué)十有八九都跟CSV打過(guò)交道。CSV這玩意兒說(shuō)簡(jiǎn)單也簡(jiǎn)單就是個(gè)逗號(hào)分隔的純文本文件說(shuō)麻煩也麻煩——編碼問(wèn)題、引號(hào)轉(zhuǎn)義、換行符不一致每一樣都能折騰人半天。我自己在實(shí)際項(xiàng)目中接過(guò)不少這樣的需求業(yè)務(wù)方丟過(guò)來(lái)一個(gè)幾GB的CSV文件讓我塞進(jìn)Hive表里做分析或者反過(guò)來(lái)讓我把Hive里跑完的結(jié)果導(dǎo)出成CSV發(fā)給下游系統(tǒng)或者交給產(chǎn)品同學(xué)做報(bào)表??此苾蓚€(gè)方向的操作背后的細(xì)節(jié)其實(shí)多得超出大多數(shù)人的預(yù)期。這篇內(nèi)容我圍繞“Hive導(dǎo)入導(dǎo)出CSV全”這個(gè)主題把從建表、加載、導(dǎo)出到踩坑排查的完整鏈路都梳理一遍。無(wú)論你是剛接觸Hive的新手還是已經(jīng)寫了幾年HQL的老手只要跟CSV打過(guò)交道里面總有幾條經(jīng)驗(yàn)?zāi)軒湍闶∠掳胩炫挪闀r(shí)間。我會(huì)把每一步為什么要這么做、參數(shù)背后的原理講清楚而不是丟給你一堆命令讓你盲目復(fù)制。先說(shuō)清楚這篇的核心覆蓋范圍包括Hive內(nèi)部表與外部表的選擇邏輯、CSV文件與Hive表字段的對(duì)應(yīng)關(guān)系、LOAD DATA和INSERT OVERWRITE兩條主路徑、各種分隔符和轉(zhuǎn)義符的處理方式、以及導(dǎo)出時(shí)常見的文件合并、壓縮格式、編碼轉(zhuǎn)換等實(shí)操問(wèn)題。每一條都是我在真實(shí)業(yè)務(wù)環(huán)境中驗(yàn)證過(guò)的方案。2. 環(huán)境準(zhǔn)備與基礎(chǔ)概念2.1 Hive表類型選擇內(nèi)部表還是外部表很多人一上來(lái)就建表導(dǎo)數(shù)據(jù)結(jié)果后面刪表的時(shí)候把原始CSV也連帶刪掉了哭都來(lái)不及。這里核心差別在于內(nèi)部表managed table的數(shù)據(jù)文件完全由Hive管理你DROP表的時(shí)候HDFS上的數(shù)據(jù)文件會(huì)一并刪除外部表external table則只是讓Hive“掛載”到某個(gè)HDFS目錄上DROP表只刪元數(shù)據(jù)原始文件還留在原處。我自己的習(xí)慣是凡是從CSV導(dǎo)入的數(shù)據(jù)一律建外部表。理由是CSV文件往往是業(yè)務(wù)方提供的原始資產(chǎn)可能還需要反復(fù)清洗、回溯一旦被內(nèi)部表連帶刪掉重新找業(yè)務(wù)方要文件的過(guò)程極其痛苦。建外部表只是多了一個(gè)關(guān)鍵字的事CREATE EXTERNAL TABLE IF NOT EXISTS ods_user_info ( user_id STRING, user_name STRING, age INT, city STRING, created_at STRING ) COMMENT 用戶信息原始表 ROW FORMAT SERDE org.apache.hadoop.hive.serde2.OpenCSVSerde WITH SERDEPROPERTIES ( separatorChar ,, quoteChar \, escapeChar \\ ) STORED AS TEXTFILE LOCATION /data/ods/user_info TBLPROPERTIES (skip.header.line.count 1);2.2 為什么優(yōu)先用OpenCSVSerde而不是默認(rèn)的LazySimpleSerDe這是很多教程沒(méi)講透的地方。Hive對(duì)TEXTFILE格式的默認(rèn)SerDe是LazySimpleSerDe它對(duì)CSV的解析能力其實(shí)很弱。默認(rèn)情況下它只認(rèn)分隔符不認(rèn)引號(hào)——也就是說(shuō)如果CSV里某個(gè)字段值本身包含了逗號(hào)比如北京,朝陽(yáng)區(qū)默認(rèn)SerDe會(huì)把這個(gè)字段從逗號(hào)處劈開導(dǎo)致列錯(cuò)位、數(shù)據(jù)錯(cuò)亂。而OpenCSVSerde是專門為CSV設(shè)計(jì)的SerDe它原生支持引號(hào)包圍的字段、字段內(nèi)部的逗號(hào)、引號(hào)轉(zhuǎn)義等標(biāo)準(zhǔn)CSV規(guī)則。換句話說(shuō)你拿到的CSV只要是符合RFC 4180規(guī)范或者Excel導(dǎo)出的常見格式OpenCSVSerde都能正確解析。實(shí)測(cè)對(duì)比過(guò)同一個(gè)文件用兩種SerDe加載的結(jié)果默認(rèn)SerDe解析出來(lái)的錯(cuò)誤率在包含逗號(hào)字段的場(chǎng)景下能達(dá)到30%以上而OpenCSVSerde基本能做到零錯(cuò)位。不用糾結(jié)直接選OpenCSVSerde。2.3 表字段類型映射CSV沒(méi)有類型Hive有CSV文件本身是沒(méi)有類型概念的所有字段本質(zhì)上都是字符串。到了Hive里你要給它聲明Int、Double、Date這些類型這里就埋著導(dǎo)入失敗最常見的雷——某一行某個(gè)字段是一個(gè)空字符串而它對(duì)應(yīng)的Hive字段類型是INTLOAD的時(shí)候會(huì)直接返回NULL。我的建議是導(dǎo)入階段先用全STRING類型的“裸表”把數(shù)據(jù)原樣加載進(jìn)來(lái)做完清洗和校驗(yàn)之后再通過(guò)INSERT SELECT的方式轉(zhuǎn)成正式的分析表該CAST的CAST該過(guò)濾的過(guò)濾。這樣做的好處是導(dǎo)入流程本身不會(huì)因?yàn)轭愋娃D(zhuǎn)換報(bào)錯(cuò)而中斷你始終能在原表里看到原始數(shù)據(jù)。比如這樣建一張裸表CREATE EXTERNAL TABLE IF NOT EXISTS tmp_user_info_raw ( user_id STRING, user_name STRING, age STRING, city STRING, created_at STRING ) ROW FORMAT SERDE org.apache.hadoop.hive.serde2.OpenCSVSerde WITH SERDEPROPERTIES ( separatorChar ,, quoteChar \, escapeChar \\ ) STORED AS TEXTFILE LOCATION /data/tmp/user_info_raw TBLPROPERTIES (skip.header.line.count 1);3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)3.1 分隔符、引號(hào)符、轉(zhuǎn)義符的搭配規(guī)則CSV的解析核心在于三個(gè)字符的配合分隔符separator、引號(hào)符quote、轉(zhuǎn)義符escape。很多導(dǎo)入異常都源于這三個(gè)字符配置不一致。先看標(biāo)準(zhǔn)CSV里最經(jīng)典的情況user_id,user_name,age,city,created_at 1001,張三,男,28,北京,朝陽(yáng)區(qū),2024-06-01 12:00:00這里張三,男被雙引號(hào)包住了它內(nèi)部有逗號(hào)但整體是一個(gè)字段。OpenCSVSerde解析時(shí)只要看到quoteChar包裹的內(nèi)容就會(huì)把內(nèi)部的逗號(hào)當(dāng)普通字符處理。而escapeChar的作用是處理字段內(nèi)部出現(xiàn)的引號(hào)本身比如某個(gè)字段值是他說(shuō)你好CSV里會(huì)寫成他說(shuō)\你好\解析器靠escapeChar識(shí)別出這里的引號(hào)是內(nèi)容而不是語(yǔ)法符號(hào)。實(shí)操心得如果你導(dǎo)出CSV是給Excel用的分隔符用逗號(hào)、引號(hào)符用雙引號(hào)、轉(zhuǎn)義符用反斜杠就是最穩(wěn)的組合。如果字段里既有逗號(hào)又有引號(hào)轉(zhuǎn)義符一定要配好否則導(dǎo)出再導(dǎo)入會(huì)出現(xiàn)列錯(cuò)亂甚至數(shù)據(jù)丟失。3.2 跳過(guò)表頭行TBLPROPERTIES的妙用業(yè)務(wù)方給的CSV十有八九帶著表頭Hive默認(rèn)不會(huì)自動(dòng)跳過(guò)它會(huì)把表頭當(dāng)成一條數(shù)據(jù)加載進(jìn)去。你可以在建表的時(shí)候通過(guò)TBLPROPERTIES聲明跳過(guò)第一行TBLPROPERTIES (skip.header.line.count 1);這個(gè)屬性從Hive 2.3版本開始支持實(shí)測(cè)在3.x版本上完全穩(wěn)定。如果你的Hive版本比較老2.1及以下不支持這個(gè)屬性那就只能靠清洗腳本去掉表頭再上傳或者加載后再跑一條DELETE——Hive對(duì)DELETE的支持很弱所以最好的辦法是加載前用sed -i 1d file.csv這類命令處理一下。3.3 多分隔符場(chǎng)景怎么處理有些“偽CSV”其實(shí)不是逗號(hào)分隔的可能是豎線|、制表符\t、分號(hào);。這種情況下不需要改代碼只需在建表時(shí)改掉separatorCharWITH SERDEPROPERTIES ( separatorChar |, quoteChar \, escapeChar \\ )給一個(gè)實(shí)際場(chǎng)景的對(duì)照參考數(shù)據(jù)來(lái)源常見分隔符注意事項(xiàng)標(biāo)準(zhǔn)CSV逗號(hào) ,注意字段內(nèi)逗號(hào)需要引號(hào)包裹Excel另存為CSV逗號(hào) ,注意中文編碼建議UTF-8日志系統(tǒng)導(dǎo)出豎線 |檢查字段內(nèi)是否包含豎線本身MySQL導(dǎo)出制表符 \t注意\t在HQL里的轉(zhuǎn)義寫法金融報(bào)文分號(hào) ;字段內(nèi)分號(hào)的處理要提前確認(rèn)注意改分隔符之前先確認(rèn)你的數(shù)據(jù)源在生成文件時(shí)是怎么轉(zhuǎn)義的。如果源端沒(méi)做任何轉(zhuǎn)義那你加載的時(shí)候無(wú)論怎么配都是會(huì)錯(cuò)位的。4. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)4.1 導(dǎo)入路徑一LOAD DATA導(dǎo)入本地或HDFS文件這是Hive導(dǎo)入CSV最直接的方式。核心命令是LOAD DATA它分兩種來(lái)源LOCAL表示從本地磁盤上傳不帶LOCAL表示文件已經(jīng)在HDFS上。-- 從本地文件系統(tǒng)導(dǎo)入文件會(huì)被復(fù)制到Hive表的HDFS目錄 LOAD DATA LOCAL INPATH /home/user/data/user_info.csv INTO TABLE tmp_user_info_raw; -- 從HDFS目錄導(dǎo)入注意HDFS上的文件會(huì)被移動(dòng)到表目錄原路徑不再有文件 LOAD DATA INPATH /input/user_info.csv INTO TABLE tmp_user_info_raw;這里有一個(gè)新手必踩的坑從HDFS導(dǎo)入時(shí)LOAD DATA不是復(fù)制而是移動(dòng)mv。如果你的原始文件在HDFS的/input目錄下LOAD完之后原文件就沒(méi)了。如果不想動(dòng)原始文件有兩個(gè)替代方案先把文件cp到另一個(gè)目錄再LOAD那個(gè)目錄不走LOAD直接把文件放到外部表指定的LOCATION目錄下因?yàn)橥獠勘淼腖OCATION就等同于表的存儲(chǔ)目錄放進(jìn)去之后立刻就能查詢到第二種方法我用得更多因?yàn)槭〉袅艘淮蜨DFS操作而且不依賴HiveServer2的執(zhí)行任務(wù)。4.2 導(dǎo)入路徑二INSERT OVERWRITE寫SELECT查詢結(jié)果有時(shí)候“導(dǎo)入”不是從文件直接加載而是需要從另一張表加工后寫入。這種情況用INSERT OVERWRITE或者INSERT INTOINSERT OVERWRITE TABLE dws_user_info SELECT user_id, user_name, CAST(age AS INT) AS age, city, created_at FROM tmp_user_info_raw WHERE user_id IS NOT NULL AND user_id ! ;INSERT OVERWRITE是全量覆蓋——每次執(zhí)行都會(huì)清空目標(biāo)表目錄下的所有文件然后寫入新數(shù)據(jù)。如果只想追加用INSERT INTO。但注意Hive的表文件可能會(huì)因此變得很碎如果頻繁INSERT INTO建議定期做ALTER TABLE ... CONCATENATE只適用于ORC格式或者重建表做一次合并。4.3 導(dǎo)出路徑一INSERT OVERWRITE DIRECTORY導(dǎo)出結(jié)果到HDFS把Hive查詢結(jié)果寫出去最基礎(chǔ)的方式是INSERT OVERWRITE DIRECTORY /tmp/user_export ROW FORMAT DELIMITED FIELDS TERMINATED BY , SELECT * FROM dws_user_info;這樣導(dǎo)出的文件是純逗號(hào)分隔的文本文件沒(méi)有表頭。很多下游同學(xué)拿到后發(fā)現(xiàn)列名對(duì)不上所以實(shí)際項(xiàng)目中我通常會(huì)自己拼一行表頭讓整個(gè)輸出變成帶表頭的完整CSVINSERT OVERWRITE DIRECTORY /tmp/user_export ROW FORMAT DELIMITED FIELDS TERMINATED BY , SELECT user_id,user_name,age,city,created_at UNION ALL SELECT user_id, user_name, CAST(age AS STRING), city, created_at FROM dws_user_info;UNION ALL的方式在Hive里需要注意類型一致性所有SELECT分支的列類型要對(duì)得上。第一條分支里所有字段都是STRING第二條分支把數(shù)字類型CAST成STRING這樣整個(gè)結(jié)果集的數(shù)據(jù)類型是統(tǒng)一的。4.4 導(dǎo)出路徑二用Hive CLI輸出重定向到本地文件如果你查詢的結(jié)果量不大幾千條到幾萬(wàn)條可以直接用Hive CLI或Beeline執(zhí)行SQL把標(biāo)準(zhǔn)輸出重定向到本地文件beeline -u jdbc:hive2://your-host:10000/default \ --silenttrue \ --outputformatcsv2 \ -e SELECT user_id, user_name, age, city FROM dws_user_info WHERE dt2024-06-01 \ /home/user/export/user_info_20240601.csv--outputformatcsv2是Beeline自帶的一種CSV輸出格式它會(huì)把查詢結(jié)果顯示成帶引號(hào)的CSV對(duì)字段內(nèi)含逗號(hào)、換行符的場(chǎng)景處理得比csv格式更好。如果追求極致的標(biāo)準(zhǔn)化可以用tsv2輸出制表符分隔的結(jié)果。注意--silenttrue不加上這個(gè)參數(shù)的話Beeline會(huì)把一大堆Hive的運(yùn)行日志、箭頭符號(hào)混進(jìn)輸出文件里文件直接變臟。我自己第一次導(dǎo)出就踩了這個(gè)坑輸出文件前幾行全是INFO級(jí)別的日志還得用腳本清理非常麻煩。4.5 導(dǎo)出路徑三通過(guò)HDFS下載合并文件這個(gè)方法是生產(chǎn)環(huán)境最常用的。Hive跑完INSERT OVERWRITE DIRECTORY之后HDFS上往往會(huì)生成多個(gè)part文件數(shù)量取決于運(yùn)行時(shí)的Reducer數(shù)量。如果需要給業(yè)務(wù)方一個(gè)單文件CSV需要把這些part文件合并。步驟是這樣的# 查看生成的文件 hdfs dfs -ls /tmp/user_export # 合并所有part文件到本地 hdfs dfs -getmerge /tmp/user_export /home/user/export/user_info_all.csv-getmerge是HDFS命令里非常好用的一個(gè)工具它會(huì)把目錄下的所有文件按順序拼接成一個(gè)本地文件。默認(rèn)情況下它不做任何格式處理直接把內(nèi)容首尾相接。如果每個(gè)part文件末尾都有換行符合并后的文件行不會(huì)串。但如果你不確定可以在-getmerge后面加一個(gè)-nl參數(shù)讓它在每個(gè)文件之間自動(dòng)追加換行hdfs dfs -getmerge -nl /tmp/user_export /home/user/export/user_info_all.csv這里有個(gè)經(jīng)驗(yàn)點(diǎn)在寫導(dǎo)出SQL之前就可以提前控制Reducer數(shù)量。如果數(shù)據(jù)量不大通過(guò)SET mapred.reduce.tasks 1;強(qiáng)制只有一個(gè)Reducer生成的就是一個(gè)part文件連合并這一步都省了。但這個(gè)方法只適合幾GB以內(nèi)的數(shù)據(jù)量數(shù)據(jù)量大了單Reducer會(huì)成為性能瓶頸。5. 復(fù)雜場(chǎng)景與性能調(diào)優(yōu)5.1 大文件導(dǎo)入如何避免OOM和解析失敗曾經(jīng)接手過(guò)一個(gè)業(yè)務(wù)需求一份CSV文件接近20GB單行的字段長(zhǎng)度最長(zhǎng)超過(guò)2MB用戶畫像標(biāo)簽串在一起導(dǎo)致。直接用LOAD DATA導(dǎo)入Hive任務(wù)跑十來(lái)分鐘后就開始報(bào)Java heap space或者OutOfMemory。排查下來(lái)問(wèn)題出在兩點(diǎn)第一OpenCSVSerde在處理超長(zhǎng)字段時(shí)會(huì)把整行數(shù)據(jù)讀入內(nèi)存進(jìn)行解析如果單行數(shù)據(jù)太大Mapper所在的Container很容易OOM。解決思路是先看業(yè)務(wù)上能不能拆開這些超長(zhǎng)字段如果不能就得在Container參數(shù)上加內(nèi)存SET mapreduce.map.memory.mb 4096; SET mapreduce.map.java.opts -Xmx3072m;第二CSV文件如果有壞行比如某一行少了一個(gè)逗號(hào)導(dǎo)致列數(shù)不匹配OpenCSVSerde默認(rèn)是把缺失的列置為NULL不會(huì)報(bào)錯(cuò)但如果某一行列數(shù)多出幾個(gè)則有可能觸發(fā)解析異常。我建議在導(dǎo)入前先用一個(gè)快速巡檢任務(wù)跑一遍文件統(tǒng)計(jì)行數(shù)和最大列數(shù)# 統(tǒng)計(jì)文件總行數(shù) wc -l user_info.csv # 統(tǒng)計(jì)最大列數(shù)用awk按逗號(hào)拆分 awk -F, {print NF} user_info.csv | sort -nr | head -1如果某個(gè)文件的列數(shù)比表字段多這批數(shù)據(jù)肯定有問(wèn)題先別急著導(dǎo)入。5.2 分區(qū)表怎么導(dǎo)入和導(dǎo)出CSV實(shí)際業(yè)務(wù)中我們很少把CSV直接導(dǎo)入非分區(qū)表因?yàn)楹罄m(xù)查詢、清理、生命周期管理都離不開分區(qū)。帶分區(qū)的建表語(yǔ)句CREATE EXTERNAL TABLE IF NOT EXISTS dws_user_info ( user_id STRING, user_name STRING, age INT, city STRING ) PARTITIONED BY (dt STRING) ROW FORMAT SERDE org.apache.hadoop.hive.serde2.OpenCSVSerde WITH SERDEPROPERTIES ( separatorChar ,, quoteChar \, escapeChar \\ ) STORED AS TEXTFILE LOCATION /data/dws/user_info TBLPROPERTIES (skip.header.line.count 1);靜態(tài)分區(qū)導(dǎo)入LOAD DATA LOCAL INPATH /home/user/data/user_info_20240601.csv INTO TABLE dws_user_info PARTITION (dt2024-06-01);動(dòng)態(tài)分區(qū)導(dǎo)入從不帶分區(qū)的臨時(shí)表刷到分區(qū)表SET hive.exec.dynamic.partition.mode nonstrict; INSERT OVERWRITE TABLE dws_user_info PARTITION (dt) SELECT user_id, user_name, age, city, dt FROM tmp_user_info_raw;導(dǎo)出場(chǎng)景反過(guò)來(lái)查某個(gè)分區(qū)的數(shù)據(jù)寫成CSVINSERT OVERWRITE DIRECTORY /tmp/user_export_20240601 ROW FORMAT DELIMITED FIELDS TERMINATED BY , SELECT user_id, user_name, age, city FROM dws_user_info WHERE dt 2024-06-01;5.3 壓縮格式的選擇導(dǎo)出gzip還是純文本導(dǎo)出CSV時(shí)要不要順便壓縮取決于下游怎么用。如果是給數(shù)據(jù)倉(cāng)庫(kù)或者分析平臺(tái)做后續(xù)處理gzip壓縮是很好的選擇——體積能縮小到原來(lái)的五分之一左右而且大多數(shù)系統(tǒng)支持直接讀取gzip格式的CSV。實(shí)現(xiàn)方式非常簡(jiǎn)單在導(dǎo)出SQL里加一句存儲(chǔ)壓縮配置SET mapreduce.output.fileoutputformat.compress true; SET mapreduce.output.fileoutputformat.compress.codec org.apache.hadoop.io.compress.GzipCodec; INSERT OVERWRITE DIRECTORY /tmp/user_export ROW FORMAT DELIMITED FIELDS TERMINATED BY , SELECT * FROM dws_user_info WHERE dt2024-06-01;如果你要拿這個(gè)CSV給非技術(shù)的業(yè)務(wù)人員就別壓縮了。他們拿到一個(gè).gz文件大概率不知道怎么打開反而增加溝通成本。給程序做自動(dòng)化消費(fèi)的才考慮壓縮。5.4 編碼問(wèn)題的統(tǒng)一處理CSV最讓人頭痛的編碼坑在我做過(guò)的項(xiàng)目里出現(xiàn)頻率非常高。業(yè)務(wù)方從Excel導(dǎo)出的CSV默認(rèn)是GBK或者GB2312編碼上傳到HDFS后Hive按UTF-8解析結(jié)果中文全部變成亂碼。處理方案有兩種第一種在導(dǎo)入前統(tǒng)一轉(zhuǎn)換編碼# 本地轉(zhuǎn)碼后再上傳 iconv -f GBK -t UTF-8 user_info_original.csv user_info_utf8.csv # 轉(zhuǎn)碼后的文件上傳HDFS hdfs dfs -put user_info_utf8.csv /input/第二種在導(dǎo)出時(shí)指定編碼給下游。Hive自身沒(méi)有編碼轉(zhuǎn)換函數(shù)但可以通過(guò)SELECT搭配普通字符串操作變通處理常見的做法是導(dǎo)出后在本地統(tǒng)一轉(zhuǎn)換。我的建議是源頭統(tǒng)一UTF-8。和業(yè)務(wù)方約定所有CSV文件必須提供UTF-8編碼版本。這個(gè)約定看起來(lái)簡(jiǎn)單但在實(shí)操中能省掉一大半的亂碼麻煩。如果你控制不了源端那就在導(dǎo)入前例行執(zhí)行iconv轉(zhuǎn)碼步驟把它寫進(jìn)定時(shí)調(diào)度里。6. 常見問(wèn)題與排查技巧實(shí)錄6.1 表頭沒(méi)有被跳過(guò)第一條數(shù)據(jù)丟失現(xiàn)象建表時(shí)明明設(shè)置了skip.header.line.count1LOAD之后查詢發(fā)現(xiàn)第一行數(shù)據(jù)不見了。排查思路這個(gè)屬性是Hive讀取時(shí)候的控制參數(shù)它生效的前提是文件在表目錄下能被識(shí)別成數(shù)據(jù)文件。如果你用LOAD DATA加載的是整個(gè)CSV文件會(huì)發(fā)現(xiàn)表頭行被正確跳過(guò)但如果你先hdfs dfs -put把文件放進(jìn)了外部表的LOCATION目錄然后建表時(shí)又加了skip.header.line.count1那么建表之前文件就已經(jīng)在那里了之后LOAD新文件時(shí)表頭跳過(guò)邏輯可能只作用于新增的文件而不是歷史文件。實(shí)操中我傾向于不用這個(gè)屬性而是在上傳之前用腳本統(tǒng)一去掉表頭。理由很簡(jiǎn)單這個(gè)屬性在不同Hive版本上存在兼容差異而預(yù)處理去表頭是確定性最高的方案。6.2 字段內(nèi)含換行符導(dǎo)致行數(shù)變多CSV規(guī)范允許字段內(nèi)包含換行符比如一個(gè)備注字段里就有一個(gè)真正的換行這就導(dǎo)致Hive在按行讀取文件時(shí)誤以為出現(xiàn)了新紀(jì)錄。這種場(chǎng)景下OpenCSVSerde同樣能處理——RFC 4180規(guī)范要求含換行的字段必須用引號(hào)包住OpenCSVSerde解析時(shí)能識(shí)別出這是個(gè)字段內(nèi)的換行而不是行終結(jié)符。但要注意如果源端生成CSV時(shí)沒(méi)有用引號(hào)包住含換行的字段那任何解析器都沒(méi)法正確判斷數(shù)據(jù)必然被拆成兩行。而且Hive讀取文件是按行\(zhòng)n切分后再交給SerDe解析的這意味著如果字段內(nèi)有換行但沒(méi)有引號(hào)包裹必錯(cuò)如果字段內(nèi)有換行且用引號(hào)包裹OpenCSVSerde可以正確還原換行實(shí)測(cè)過(guò)一個(gè)文件里包含大量多行地址字段的數(shù)據(jù)用OpenCSVSerde加載后文本字段內(nèi)的換行被還原成\n存儲(chǔ)字段整體是完整的查詢結(jié)果也能對(duì)上行數(shù)。前提條件就是源端CSV生成必須規(guī)范。6.3 導(dǎo)入后部分行顯示為NULL這個(gè)最常見的原因是CSV文件里本來(lái)就有空值。比如1001,張三,28,,2024-06-01city字段是空的導(dǎo)入后顯示NULL是正常的。但有一種情況很坑CSV里出現(xiàn)\N字符。在Hive中\(zhòng)N是文本文件中表達(dá)NULL的默認(rèn)標(biāo)記。如果你的CSV數(shù)據(jù)里恰好有字符串\N比如某個(gè)字段值是\N表示空導(dǎo)入后它會(huì)被自動(dòng)識(shí)別成NULL而不是字符串\N。這是Hive的默認(rèn)行為處理方法是建表時(shí)通過(guò)SERDEPROPERTIES修改WITH SERDEPROPERTIES ( serialization.null.format )設(shè)置成空字符串后只有空字段才是NULL\N會(huì)被當(dāng)作普通字符串處理。6.4 導(dǎo)出文件亂碼問(wèn)題導(dǎo)入時(shí)亂碼的原因在前面說(shuō)過(guò)了。導(dǎo)出時(shí)亂碼的問(wèn)題則往往出在文件后續(xù)流轉(zhuǎn)環(huán)節(jié)用INSERT OVERWRITE DIRECTORY導(dǎo)出的文件是UTF-8編碼的但用Excel打開的時(shí)候Excel會(huì)默認(rèn)猜測(cè)編碼如果猜成GBK就會(huì)顯示亂碼。有一個(gè)不太優(yōu)雅但很實(shí)用的做法導(dǎo)出后帶一個(gè)BOM頭Byte Order Mark。實(shí)測(cè)帶BOM的UTF-8文件用Excel打開時(shí)編碼識(shí)別準(zhǔn)確率幾乎100%。Hive本身不支持寫B(tài)OM所以通常在本地用命令處理# 給導(dǎo)出文件加上UTF-8 BOM printf \xEF\xBB\xBF temp_with_bom.csv cat user_info_all.csv temp_with_bom.csv mv temp_with_bom.csv user_info_all.csv不過(guò)這也會(huì)帶來(lái)新問(wèn)題如果這個(gè)文件還要再導(dǎo)回HiveBOM頭會(huì)變成第一個(gè)字段值的一部分需要在導(dǎo)入時(shí)用TRIM或者正則處理掉。所以我只在面向業(yè)務(wù)人員的導(dǎo)出場(chǎng)景加上BOM面向系統(tǒng)對(duì)接的導(dǎo)出保持純UTF-8。6.5 常見問(wèn)題排查速查表現(xiàn)象可能原因解決思路導(dǎo)入后中文亂碼源文件GBK編碼Hive按UTF-8解析上傳前用iconv轉(zhuǎn)UTF-8第一條正常數(shù)據(jù)丟失表頭未被過(guò)濾或過(guò)濾策略不對(duì)預(yù)處理去掉表頭重新LOAD列數(shù)錯(cuò)位、字段串列字段內(nèi)含逗號(hào)但無(wú)引號(hào)包裹源端修復(fù)CSV或替換分隔符字段內(nèi)容被截?cái)嘧侄蝺?nèi)含換行符且被解析成新行確認(rèn)引號(hào)包裹或用OpenCSVSerdeLOAD后原文件消失從HDFS導(dǎo)入時(shí)文件被移動(dòng)用外部表LOCATION方式或先復(fù)制導(dǎo)入后大量NULL類型轉(zhuǎn)換失敗或CSV空值先用全STRING裸表加載導(dǎo)出文件帶日志信息未加--silenttrue重跑并添加靜默參數(shù)導(dǎo)出文件有多個(gè)partReducer數(shù)量大于1用getmerge合并或設(shè)置reduce1帶表頭導(dǎo)出時(shí)UNION ALL類型不匹配第一個(gè)分支與后續(xù)分支字段類型不一致全部字段CAST成STRING7. 踩過(guò)的坑與實(shí)用經(jīng)驗(yàn)總結(jié)我在做Hive數(shù)據(jù)導(dǎo)入導(dǎo)出項(xiàng)目時(shí)踩過(guò)不少坑有些坑的排查時(shí)間長(zhǎng)達(dá)一整天。這里分享幾個(gè)最典型的經(jīng)驗(yàn)。第一個(gè)經(jīng)驗(yàn)從業(yè)務(wù)方接收CSV時(shí)先做數(shù)據(jù)質(zhì)檢再導(dǎo)入。一份20GB的CSV文件如果導(dǎo)入后又發(fā)現(xiàn)某個(gè)字段串列或者編碼有問(wèn)題重新導(dǎo)入的時(shí)間成本非常高。我的習(xí)慣是先拿一個(gè)幾千行的采樣文件導(dǎo)入到臨時(shí)表跑幾個(gè)簡(jiǎn)單的查詢行數(shù)、空值率、列數(shù)分布確認(rèn)沒(méi)有問(wèn)題后再全量導(dǎo)入。這個(gè)步驟只花幾分鐘但能避免幾小時(shí)的返工。第二個(gè)經(jīng)驗(yàn)用外部表做中轉(zhuǎn)用內(nèi)部表做存儲(chǔ)。所有CSV原始數(shù)據(jù)都建外部表LOCATION指向固定的HDFS目錄。這樣做的好處是后續(xù)清洗出錯(cuò)時(shí)原始數(shù)據(jù)還在DROP表也不會(huì)影響HDFS上的文件。清洗后的數(shù)據(jù)再用內(nèi)部表保存享受Hive的管理和生命周期功能。第三個(gè)經(jīng)驗(yàn)導(dǎo)出CSV給業(yè)務(wù)方之前一定要跟對(duì)方確認(rèn)打開方式。如果對(duì)方說(shuō)“我用Excel打開”那么編碼用UTF-8帶BOM分隔符用逗號(hào)字段內(nèi)有逗號(hào)的情況必須加雙引號(hào)如果對(duì)方說(shuō)“我用Python pandas讀”那么編碼用UTF-8不帶BOM加不加表頭取決于對(duì)方需求但字段內(nèi)最好不要有多余的轉(zhuǎn)義符否則pandas的read_csv參數(shù)配置會(huì)很繁瑣。上個(gè)項(xiàng)目里就遇到過(guò)這樣的事我導(dǎo)出的CSV字段里為了兼容Excel加了雙引號(hào)轉(zhuǎn)義結(jié)果下游Python腳本用默認(rèn)參數(shù)讀取時(shí)引號(hào)也被讀進(jìn)來(lái)了字段值變成了張三帶引號(hào)對(duì)方又花了大半天寫清洗邏輯。從那以后每次導(dǎo)出我都會(huì)問(wèn)清楚下游消費(fèi)方式再?zèng)Q定轉(zhuǎn)義策略。第四個(gè)經(jīng)驗(yàn)CSV導(dǎo)入導(dǎo)出的調(diào)度任務(wù)一定要有監(jiān)控和告警。數(shù)據(jù)量大的時(shí)候LOAD DATA任務(wù)可能跑10分鐘以上如果中途失敗Hive不會(huì)自動(dòng)清理半成品數(shù)據(jù)部分文件可能已經(jīng)被寫入。重跑之前先確保表目錄是干凈的或者用INSERT OVERWRITE而不是INSERT INTO否則可能舊新數(shù)據(jù)混在一起。8. 一個(gè)端到端的完整實(shí)戰(zhàn)案例為了把這些分散的點(diǎn)串起來(lái)我給出一個(gè)從我實(shí)際項(xiàng)目中抽象出來(lái)的完整流程。需求描述某公司的運(yùn)營(yíng)團(tuán)隊(duì)每天會(huì)從業(yè)務(wù)系統(tǒng)導(dǎo)出當(dāng)天的用戶行為CSV文件包含用戶ID、行為類型、行為時(shí)間、行為詳情等字段。文件格式為標(biāo)準(zhǔn)CSVUTF-8編碼第一行是表頭。需要每天自動(dòng)導(dǎo)入Hive供數(shù)據(jù)分析團(tuán)隊(duì)使用。8.1 第一步創(chuàng)建外部臨時(shí)表CREATE EXTERNAL TABLE IF NOT EXISTS tmp_user_behavior_raw ( user_id STRING, behavior STRING, event_time STRING, detail STRING ) ROW FORMAT SERDE org.apache.hadoop.hive.serde2.OpenCSVSerde WITH SERDEPROPERTIES ( separatorChar ,, quoteChar \, escapeChar \\ ) STORED AS TEXTFILE LOCATION /data/tmp/user_behavior_raw TBLPROPERTIES (skip.header.line.count 1);8.2 第二步上傳CSV文件# 刪除歷史遺留文件避免新舊混存 hdfs dfs -rm -f /data/tmp/user_behavior_raw/*.csv # 上傳當(dāng)天的CSV文件 hdfs dfs -put /home/user/data/user_behavior_20240601.csv /data/tmp/user_behavior_raw/因?yàn)榻送獠勘砦募诺絃OCATION目錄后Hive立刻就能查看到數(shù)據(jù)不用再執(zhí)行LOAD DATA。文件不會(huì)被移動(dòng)原始文件保留一份后續(xù)如果要回溯仍然找得到。8.3 第三步數(shù)據(jù)質(zhì)檢-- 查看總行數(shù) SELECT COUNT(*) FROM tmp_user_behavior_raw; -- 查看每條記錄各字段為NULL的情況 SELECT SUM(CASE WHEN user_id IS NULL OR user_id THEN 1 ELSE 0 END) AS user_id_null_cnt, SUM(CASE WHEN behavior IS NULL THEN 1 ELSE 0 END) AS behavior_null_cnt, SUM(CASE WHEN event_time IS NULL THEN 1 ELSE 0 END) AS event_time_null_cnt FROM tmp_user_behavior_raw; -- 抽查幾條樣本 SELECT * FROM tmp_user_behavior_raw LIMIT 10;如果行數(shù)、空值率、樣本內(nèi)容都符合預(yù)期繼續(xù)下一步不滿意就直接刪目錄重新上傳。8.4 第四步清洗并寫入正式表CREATE TABLE IF NOT EXISTS dws_user_behavior ( user_id STRING, behavior STRING, event_time TIMESTAMP, detail STRING ) PARTITIONED BY (dt STRING) STORED AS ORC; SET hive.exec.dynamic.partition.mode nonstrict; INSERT OVERWRITE TABLE dws_user_behavior PARTITION (dt) SELECT user_id, behavior, CAST(event_time AS TIMESTAMP) AS event_time, detail, 2024-06-01 AS dt FROM tmp_user_behavior_raw WHERE user_id IS NOT NULL AND user_id ! ;正式表用ORC存儲(chǔ)查詢性能比TEXTFILE高很多而且還支持后續(xù)的向量化查詢、列裁剪等優(yōu)化。這一步重點(diǎn)是把STRING類型的event_time轉(zhuǎn)成TIMESTAMP過(guò)濾掉空user_id的臟數(shù)據(jù)。8.5 第五步導(dǎo)出當(dāng)日分析結(jié)果INSERT OVERWRITE DIRECTORY /tmp/behavior_export/20240601 ROW FORMAT DELIMITED FIELDS TERMINATED BY , SELECT user_id, behavior, event_time, detail FROM dws_user_behavior WHERE dt 2024-06-01;然后合并下載hdfs dfs -getmerge -nl /tmp/behavior_export/20240601 /home/user/export/behavior_20240601.csv這樣給到需求方的是一個(gè)干凈、單文件、UTF-8無(wú)BOM的CSV直接可以分發(fā)給業(yè)務(wù)團(tuán)隊(duì)使用。9. 寫在最后的補(bǔ)充我實(shí)際做這些導(dǎo)入導(dǎo)出工作時(shí)越來(lái)越覺(jué)得CSV這種格式雖然簡(jiǎn)單但正因?yàn)楹?jiǎn)單反而容易在細(xì)節(jié)上翻車。SerDe選型、編碼統(tǒng)一、表頭處理、文件合并每個(gè)環(huán)節(jié)單獨(dú)拿出來(lái)都不難合在一起卻需要一套完整的流程去保證穩(wěn)定可靠。建議你在自己的項(xiàng)目里先建立一套標(biāo)準(zhǔn)化的CSV導(dǎo)入導(dǎo)出流程模板包括建表語(yǔ)句模板、質(zhì)檢SQL模板、導(dǎo)出腳本模板。這樣新需求來(lái)了只需要替換表名和字段名就能快速?gòu)?fù)用整套流程不用每次從零開始摸索。這套流程沉淀得越完善你在處理數(shù)據(jù)對(duì)接上的時(shí)間成本就越低。如果后續(xù)有需要還可以在這個(gè)基礎(chǔ)上擴(kuò)展成通用的數(shù)據(jù)交換模塊支持其他分隔符格式、壓縮格式、甚至自動(dòng)識(shí)別表頭字段名的功能。先把基礎(chǔ)的CSV鏈路打磨扎實(shí)后面所有擴(kuò)展都會(huì)順很多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美青青视频| 天天日天天干天天摸天天操| 爱丝福利| 一级黄色视频网| 日韩国产十八禁| 国产亚洲福利第一页丝袜| 97色欧州| 日韩pv中文| 欧美传媒| 久久精品店| 在线综合 亚洲 欧美中文字幕 | 欧美国产精品| 伊人亚洲综合| 国产后入清纯| 综合网~91综合网| 乱老女人一区二区视频| 亚洲欧洲日韩天堂av| 人妻酒店出差被中出免费在线播放| 又大又黄国产| 亚洲国产成人精品无码专区| 亚洲中文字幕精品一区| 极品色综合| 九九无码久久精品视频| 五月香婷婷| 99精品人妻| 成人精品在线观看| 夜夜草网站| 乳欲人妻办公室奶水| 大色网久久| 九九热最新| 五月丁香激情四射| 久久香蕉网| 干超碰碰熟女| 欧美 亚洲精品首页| 亚洲男人天堂Av| 亚洲 日本 国产 综合| 日本成人在线不卡一区二区三区| 久草精品在线| av在线免费一区二区| 玖玖资源中文字幕制服丝袜| A 在线网址| 婷婷性网| 最新9久久久9免费视频| 国产精品视频| 久久99网站| 久久久无码av精| 51久久夜色精品国产麻豆| 美女网站91| 99AV| 久久久久久九九九| 午夜成人爽爽爽爽A片李冰冰| AV色五月天| 美欧老女人97| 色婷婷久久综合超碰| 亚洲国产成人高清在线| 国产精品自在自拍视频| 激情接吻视频久久久久久| 成人无遮挡毛片免费看| 国产精品久久久鸭无码的功能| 久草免费福利在线播放| 无码精品人妻一区二区三区妖精| 91处女在线观看| 青草影院内射高潮| 九九热五区| 人妻在线大香蕉| 亚洲电影91| 思思热在线观看| 伊人久久大香线蕉无码| 97人妻免费中文字幕| 大黄片做爱的大的| 五月天大香蕉| 99这里有精品| 亚洲区限制级| 99在线精品观看视频中文| 东北老熟女| 欧美狠狠干| 秋霞一集毛片观看| 97人人操人人摸人人爱| 亚洲综合另类欧美久久久| 欧美日韩淫加| 日本东京热大香蕉a片| 好屌色综合| wuyechaopeng| 人人操人人色网| 东京太热男人的天堂久久久| 人妻精品一区二区三区| 亚洲一本色码中文字幕| 亚洲毛片久久| 久久精品毛片免费不卡| 超碰 另类 欧美 | 翔田千里A片一区二区| 少妇厨房愉情理伦片bd在线观看| 熟女人妇一区二区三区| 精品久久久高清无码| 中文字幕一区二区三区四区在线视频| 精品国产片亚洲一区| 欧美麻豆成人同性GⅤ在线| 丝袜美腿制服人妻二区中文字幕| 好吊妞转入那个网| 日韩激情中文字幕有码| 蜜臀久久99精品久久久久电影| 国产精品乱码久久久久久久久| 精品一区二区三区蜜桃臀赵总 | 天天射夜夜| 97chaopenrihan| 60秒不遮不挡| 日韩乱伦视频| 超碰97男人| 91成人社区| 葡萄牙性视频一二区| 欧美一区二区三区互相| 国产 日韩 欧美 人妻 熟女 中文 69人妻精品一区二区绯色 | 综合97亚洲| 久久久青青草| 强奸乱伦中文字幕AV| 美女露胸露尿口| 97超级色碰碰| 另类天堂| 亚洲高潮少妇| 91n处女在线观看| 人人贴人人摸| 超碰97男人| 中文字幕在线免费观看 | 夜夜影视四色| 91无码人妻| 思思视频免费看网站| 97九色人妻| 欧美九一精品久久久熟妇| 国模私拍一区二区三区神乳| 亚洲av热热色| 在线无码视频| 日本天堂网| 中文乱码字幕观看视频| 欧洲天天在线| 亚洲国产综合图区中文字幕| 人妻夜夜爽天天爽麻豆三区网站 | 十八禁视频网站| 亚洲午夜蜜臀| 亚洲五月婷| 免费97视频| 北约熟女超碰| 9ⅰ久久久天天| 久久色一区| 色吧 综合| 亚洲男人天堂2012| 夜夜躁狠狠躁日日躁av| 中文字幕视频在线观看一区二区| 91啦人妻| 亚洲丰满很很操| 久久久999国产精品| 久久久久久久伊人精品| 精品国产网站| 人妻少妇被猛烈进入中| 九九九九九九九九九九九蜜桃| 热久久国产| 久久成人午夜狠狠| 伊人一区二区在线播放| 男人的天堂2019AV| 成人性爱av| 久久国语| 91黑丝在线播放| 在线a亚洲视频播放在线| 天天操天天干一区二区 | 综合激情婷婷| 后入式免费视频| 69视频福利导航| 亚洲小电影免费涩涩成人在线高清| 啊啊啊97视频| 久久精品性| 美女啊啊啊啊啊| 日欧美色| 国产精品视频精品一二| 久久精品国产亚洲AV先锋| 日本一天色道久久久精品视频| 色色福利| 国产午夜精品在线观看| 五月天亚洲网| 嗯嗯嗯不要不要免费视频| 九九干| 99久久综合| 极品尤物在线观看| Sekablack无码一区| 啊啊啊操死我了| 玖玖蜜臀资源网| 在线看片国产精品每日更新| 亚洲欧美日韩制服另类| 欧美综合色图片| 无码欧美有限公司| 家庭乱伦性爱av| 超碰97国产欧美| 男人的天堂色偷偷青青草视频婷婷网| 久操精品网| 84YTCOM性无码| 色阁阁AV综合网| 综合久草| 91动漫操逼视频| 不卡在线观看视频| 欧美色97| 中韩中文字幕在线观看| 亚洲色图伊人网| 亚洲s在线观看| 激情av| 天天躁日日躁AAAAXXXX国产| 精品人妻一区二区三区鲁大师| 超碰碰97| 亚洲 欧美 另类 综合 偷拍| 日本99热| 99精品无码| 福利操逼| 精品少妇人妻av久久免费| 欧美亚洲情色| 91欧美色| 久久男人| 久久久久久久久久久久97| 天天爱综合网| 色性荡荡荡荡视频| 欧美精品激情| 蜜桃久久综合视频| 亚洲国产第一页综合视频| 日本精品高清一二区一本到| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 丝袜制服字幕在线| 韩国久久97| 在线强奷到舒服的无码视频| 丁香六月啪啪| Blackedraw视频一区二区| PMv在线观看| 欧美女同在线| 91中文字幕制服丝袜免费视频| 97国产综合欧美| 亚洲综合夜色| 日本999精品| 伊人一区二区三区| 韩国国产欧美情侣视频在线| 亚洲国产91精品一区二区久久| 久久禁| 国产中文字幕在线观看| 四虎免费在线播放| 女人天堂av在线播放| 999999精品| 国产传媒日韩欧美| 亚洲小电影免费涩涩成人在线高清| 精品美女久久久久| 手机看av网站在线看| AV综合中文字幕干| 丝袜熟女2P| 亚洲 图片 综合91| 国产农村妇女精品1区二区| 日日夜夜青青草母狗| 91真人天天在线| AV色图| 97超碰伊人| 啊啊啊啊啊啊在线| 8x福利精品第一福利视频导航| 精品毛片av一区二区| 日韩亚洲中文有码视频| 免费观看啪视频| 性色avv| 久久国产99精品72福利| 色偷偷色偷偷欧美日韩| 欧美se综合| 国产情侣自拍在线播放| 殴美,日韩国产伦精品| 中文字幕片| 怡红院亚洲怡春院av| 超碰91在线| 再深点灬舒服灬太大了添视频| 久久久久久久强迫| 无码人妻系列少妇| 97天堂| 免费一级精品啪啪视频| 内射夫妻三片| 色综合天天| 志村玲子视频一区二区| 噜噜噜亚洲精品| 91综合网站| 岛国网址国产 | 伊人97色天使| 天堂男人网| 青草青草久热| 性色av一区二区| 91亚洲图片| 国产午夜无码片在线观看影视 | 91欧洲国产成人久久精品网站| 婷婷超| 男人的天堂com| 亚熟在线| 久久一留热品黄| 91 偷| 色哟哟AV| 精品91日日夜夜超清资源| 国产精品无码久久久久2028| 色婷婷婷五月天激情四射| 婷婷丁香人妻 | baisiav| 亚洲激情av| 久久精品国产Aⅴ| 久久大黄片| 激情看片网站| 黑人干亚洲| 人妻一区视频| 夜夜骑日日| 亚洲图片欧洲图片aⅴ| 鸥美中出| 日本三级精品| 张柏芝国产一区在线观看| 日韩亚洲中文有码视频| 欧美天堂超碰97| 久操大香蕉手机视频在线看| 真实高潮91| 国产无码精品久久久久久| 久久一二区四| 日韩,欧美,中文在线| 一区二区高清视频| 九九成人| 不卡av在线中文字幕| 亚码激情| 波多野结衣之双飞调教在线播放| 夜夜做夜夜爽精品视频| 啊啊啊啊啊啊啊国| 午夜一区二区三区国产| 97香蕉网| 影音先锋每日最新资源在线观看 | 上海一级黄片| 亚洲无无码αⅴ每日更新| 国产精品美女视频诱惑| 欧美激情 一区| 午夜噜噜噜| 99精品无码| 婷婷亚洲天堂| 久久78| 亚洲 另类 丝袜 自拍 动漫| 欧美一区91大爱| 91操熟女视频| 少妇啪啪自拍| 欧美疯狂做爰xxxx| 另类专区加勒比| 91爱网| 青青操视频在线| 91 国产丝袜在线播放-百度| 南澳成人一级片在线播放| 久96热在线观看视频| 先锋精品av色鲁| 性猛交| 日韩三级伊人| 色九九九九久| 999岛国大片| 91黑人狂躁丰满熟妇| 色眯眯av| 久 久无码人妻AV| 中文字幕三四区| 激情天天视频| 99这里有精品视频| 五月天婷婷色| 国产欧美成人精品| 国产又黄又爽| 亚洲天堂在线怕怕视频 | 国产不卡精品91| 99黄页网站| 一起草三级AV电影在线观看 | 大屁股人妻女教师撅着屁股| 超碰成人国产| 激情五月综合网| 91熟女少妇| 少妇一级婬片免费放一级a性色.| 成人综合色网| 超碰97COm中文| 亚洲毛片基地专区| 中日高清无码操逼视频| 亚洲性猛| 国产91会所女技师在线观看| 视频在线观看一二三区| 中文不卡视频| 在线另类| 少妇精品久久| 欧美一级做a爰片免费视频| 亚洲国产丝袜在线观看| 情趣丝袜无码操逼视频| 欧美九九99久久精品| 国产精品亚洲四五区在线观看| 欧美洲精品一级| 亚洲第一成人影院色播| 91n处女在线观看| 曰本人妻人人澡人人夹| 九九九九九九九九九九精品视频| www.大香| 思思热一热婷婷热一热| 高潮综合网| 2019天天干天天操| 78m成人视线| 奸色色 男人天堂 天天射| 国产蜜臀在线| 欧亚性爱啪啪| 综合五月天| 熟妇熟女一区二三区| 91丨九色丨东北熟女| 91色色综合| 一卡二卡三卡| 五月丁香久久| 日韩欧美女求操每天更新| 密臀国产在线| 久久中文色图| 可以看的av| 91精品国产91综合久久蜜臀| 98一区二区精品| 春色综合网| 久久久久久夜夜夜夜夜| 免费精品无码一级毛片牛牛影视 | 快灬快灬 一下爽蜜桃在线观看| 欧美性爱1080p| 日本免费二区三区| 996热| 中文字幕黄色片| 国产h片在线观看视频| 黄色av一区二区在线| 另类小说欧美激情校园春色| 人人妻人人澡人人爽久久av| 无码男人天堂| 亚洲综合图文| 午夜免费福利视频一区| 久久久精品中文字幕麻豆| 色色色欧美| 色姑娘综合网| 精品一区二区久久| 男人天堂站| 亚洲AV操| 免费AV中文网在线观看| 美熟女逼导航AV操逼| www.av在线观看| 国产成年女黄特黄| 全国男人天堂网| 久久精品99| 一二三啪啪专区| 亚洲最大无码中文字幕网站| 热思思免费视频| 狠狠搞 亚洲91| 一本久久精品中文字| 亚洲Av噜噜一区二区三区妖精| 极品白嫩美女白浆成人福利在线看| 亚洲囯产精品女人久久久| 网友自拍第1页| 欧美亚洲丝袜美女电影| 尤物av网站| 国产性感在线观看| 婷婷在线视频| gogogo免费高清看中国国语 | 99热免费| 成人五月天丁香激情综合| 亚洲色狠| 丁香婷婷久久| 亚洲欧美日韩国产丝袜自拍中文| 啊啊啊啊啊啊啊网址在线观看| 欧美第一页| 四季av一区二区凹凸精品小说| 超碰 另类 欧美| 亚洲不卡三级手机播放| 欧洲精品人妻| 天天看天天干| 国产午夜精品在线观看| 色眯眯av| 久九色| 26uuu性| 国产这里只有精品| 嗯嗯啊在线视频| 天天干天天干天天| 日韩性色b| 久久久9品一区二区三区| 午夜无遮挡男女啪啪视频| 久久香蕉国产线看观看猫咪av| 综合色图区| 国产免费内射视频| 亚洲精品久久久久久久蜜桃臀| 日韩丝袜人妻AV| 蜜臀av网址| 久久69| yazhouzaixian| 欧美日韩性爱无码| 俺去啦自拍| 国产三级电影免费观看| 精品免费成人久久| 综合91网| 伊人天天久久动态图| 国产自产一区视频在线| 人人妻人人爱人人玩| 色97| 日本精品中文字幕视频| av线电影| 91粉芽高清在线一区二区| 超碰色图| 日夜干射色啊| 黄色av一区二区在线| 人妻铁牛TV| 亚洲免费97免费| 日本色色色视频| 日夜精品| 91性高| 日日日日日| 91在线精品一区二区三区| 欧美日韩另类字幕中文| 色玖玖| 亚欧日韩成人| 激情视频一二三| 熟妇最新先锋一二三区| 免费男人的天堂| 家庭乱伦性爱av| 东京热一区二区三区四区五区六区| 欧美日韩大陆黑人少妇99| www.婷婷| 深田咏美亚洲精品福利社| 丰满人妻无码一区二区三区| 无码区蜜乳| 色欧洲| 天天操女人| 久久久一区二区三区三州| 久久亚洲日韩熟女精品| 99国产在线绯色一区| 国产久久一区二区| 精品人妻伦一区二区三区久久| 91免费看一区二区三区| 日亚韩精品视频二区三| 亚洲宅男天堂| 亚州成人a∨| 黄色免费网页无码| 2017天天透天天通天天擦| 老熟女乱子伦中文字幕一区二区| 99久久9| 95人妻爽爽人人做人人澡 | 欧美午夜一区二区三区| 色欲Av人妻精品一区二| 无码不卡亚洲成?人片| 韩日精品四区| 黑丝自慰喷水网站| 日产国产精品中文久久婷婷| 欧美性爱一内片一区二区三区| 亚洲天堂女优在线 | 日韩国产十八禁| 亚洲第一页欧美| 啊啊啊好大好湿| 黑丝少妇| 亚洲日韩成人性爱视频| av三级电影在线播放| 肉丝中文无码高清| 久久99手机免费视频| 人妻av在线| 国产理论视频在线播放| 亚洲欧美日韩免费观看| 91痴汉| 91精品婷婷国产综合久久竹菊| 99九九久久| 强奸乱伦资源| 婷婷午夜成人色中色| WWW.操逼.COM| 99久久综合| 日本ZZ高免费A级视频| 美国精品国产精品| 激情天天视频| 亚洲精品三| 精品欧美日韩在线观看| 国产性爱在线视频一区二区| 99欧美| 欧美一级黄色18片免费看| 视频一区二区三区精品| 黄色片一区二区三区四区五区| 超碰欧美97资源| 免费超碰97久久| 日韩无码AB| 99久在线精品99re8a| 91网站18在线| 久久久久久9999| 超碰人人干天天射| 一本色道久久综合狠狠操| 欧美综合传媒| 亚洲AV永久无码精品成人调教| 久久久九九| 亚洲双插| 欧美日韩在线小说 | 伊人九九| 精品人妻一二三| 国产真实子伦对白| 一级岛国大片| 日韩欧美国产高清视频| 久久99网站| www.婷婷六月天| 色爽爽文学| 美女91在线观看| 97爱碰| 欧美图片校园春色| 日韩性爱啪啪视频| 国产精品亚洲一级av第二区| 日韩国产乱子伦App| 欧美一级A片在线看视频性色| 婷婷五月天成人| 91欧美高清| 97日视频| 91精品国产91熟女| 国产精品视频自拍在线| 色久桃花影院在线观看| 久热久| 亚洲 图片 欧美 色图| 亚洲资源网| 国内毛片四区| 日韩av电影成人在线| 人人操,操人人| 精品一区二区三区蜜桃臀赵总 | 久久25| 日本一级不卡一二区| 日韩97P| 曰韩操B| 天天添天天干电影| 亚洲日韩熟女人妻高清在线| 诱惑网综合| www.久久最新地址| 狠狠久久四虎| 婷婷激情五月综合| 岛国黄片网站| 成功精品影院| 伦理日韩国产久久| 2018天天日天天日| 五月激情综合网| 亚州高清色综合| 亚洲超碰97| 在线精品福利免费播放| 丝袜无码a片| 欧美少妇人妻| 亚洲精品视频在线| 涩涩久久精品| 91亚洲色人| 国内精品999| 97国产精品在线观看| 午夜一级免费毛片| 白丝jkav| 搡老熟女免费视频 | 精品中文日韩字幕视频| 插入逼91| 欧插网站| 男人的天堂网页| 99综合视频一体| 成人精品水蜜桃久久久久久久| 欧美成熟性爱精品| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 97超碰天天爱天天爱| 久草视频分类在线| 日本超碰色精品| 岛国黄片网站| 欧美精品丝袜久久久中文字幕| 一本色道久久综合精品婷婷| aⅴ日韩成人电影av在线免费看av大全| 熟妇艹鸡八| www熟女乱伦com| 91丝袜美女| 国产亚洲色婷婷久久99精品91 - 百度| 欧美激情综合| 狼人狠干| 插入综合网| 日韩小电影| 国产高清1234区| av网站国产主播在线| 大鸡吧尹人在线| 色哟哟 日韩精品| 久艹伊人精品综合在线| 日韩簧片免费看| 区二区亚洲婷| 国产真实野战在线视频| 久久熟女嫩草成人片免费| 国产亚州精品美女久久久免费| 男人天堂 天天射| 抽插无码高清一区| 美女9118禁| 中日无幕一二三四区| 狠狠操,使劲操| 久久久18禁| 男女激情黄色网址| 全国男人天堂网| www.欧精品| 国产精品成人久久一区二区三区| 九区国产| 婷婷五月天av| 成年人黄色视频免费| 欧美视频第二页| 操逼网免费无码视频| 亚洲毛片久久| 18岁禁 茉莉成人久久| 亚洲国产精品无码AV在线| 97久久综合网| 色综合加勒比四四季| 性色av蜜臀av色欲aV| 97国产|免费| 九一亚洲国产免费| 404操逼福利视频| 亚洲毛片久久| 97一本大道亚洲一区| www.久久爱| 人人做天天爱| 亚洲少妇视频| 国产青青美女玩逼视频| 久久激情五月| 久久亚州精品成人Av无| 2017,超碰| WWW.加勒比人妻一区不卡.com| 日本福利二区视频| 日本操逼视频不卡直接放| 久久久免费视频18| 欧美日韩222| 色婷网| 国产一区二区a毛片| 久久久久国色αv免费观看| 日韩在线97| 欧美毛片在线网| 午夜福利免费精品视频| 日本操逼aaaaa| 色色青青久久| 国产嫩草精品A88AV在线| 欧美性爱精品一区二区| 精品国产一区二区三区在线播出| 蜜臀久久99精品久久久久久酒店| AV色五月天| 久久9精品视频| 中日高清无码操逼视频| 亚洲无吗在线视频| 懂色中文一区二区三区| 91美女视频在线观看| 日日骚av| 亚洲欧美啪啪| av东京热男人的天堂| 在线人妻熟女一区二区三区四区五区| 91性高潮久久久久久久久| 91强热人妻| 欧美黄色片在线播放| 亚洲一区二区在线观看91| 天堂8在线新版官网| 一级做a爰片久久毛片图片| 亚洲天堂一区| 亚洲高清自拍| 国产精品视频在线观看| 亚洲熟女诱惑| 人人操人人肉久久精品| 9精品久久久久| 蜜桃传媒视频第一区入口在线看| 天天日熟妇| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 国产美女91视频| 快点操死我| 91美女在线精品视频| 校园春色制服丝袜中文字亚洲| 五月婷婷久久综合| 色狠狠综合| 激情五月丁香五月| 五月综合激情网| 天天日日夜夜| 国产欧美美女免费观看视频| 久久麻豆一区二区| 嗯嗯啊中文字幕| 一区黄二区黄| 欧美天天综| 日韩精品人妻中文字幕久久久| 中文字幕版| 2017大香蕉国产精品久久| 97在线青| 99re这里只有精品2| 台湾佬大香蕉| 日本人妻最新在线中| 高清在线不卡一区二区 视频| 久久欲| 破苞ⅩXXX性无码动漫无码| 国产精品老师| 黑操B| 伊人网在线观看| 亚洲drav色图| 97久久国产精品女不卡| 26uuu最新| 搡老女人老妇女AAA一VU麻豆| 日韩无码黄色片| 四虎影院成年人片| 天天综合AV| 日韩精品第3页| 亚洲脚交| a级免费在线观看| 上海一级黄片| 91色情黑丝搞鸡在线观看一区二区三区三州| 天无日色综合| 欧美一级专区免费大片| 天堂性色| 久久国产乱子伦精品免费女人| 亚洲最大无码中文字幕网站| 殴美,日韩国产伦精品| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 新亚洲无码| 久久精品国产亚洲AV片多多 | 亚洲精品九九九| 美女尤物人人操| 天天欧美色| 亚洲欧美在线综合| 亚洲久久久久| 国产无码一二三区| 91最新综合| 青青草在线视频播放器| 日韩免费福利在线观看| 激情久久久| 日韩美女高潮喷水视频| 日韩猛交| 中文字幕在线观看二区三区| 69精品人人人人| 欧美色图电影| 啪一啪免费视频| 亚洲美女30b| 神马麻豆福利院| 免费a在线播放v| 国产精品久久久蜜臀| 欧美精品黑人猛交高潮| 日va操| 精品九九九九九九九| 91啪啪| 丝袜大香蕉| 久久久久久裸体| 都市久久精品激情亚洲| 日韩偷拍色图| 96久久久久久久| 婷婷中文网| 亚洲老司机123专区| 日本国产亚洲一区在线观看| 久久超碰爱| 亚洲欧美在线丝袜| 久久香蕉国产线看观看猫咪av| 天天操美美| 午夜福利一区二区影院| 日韩AV色图| 午夜性刺激视频免费观看| 免费观看欧美日韩操逼视频| 久热香蕉精品在线视频| 国产精品熟女AV中文字幕在线播放| 久热伊人| 五月天偷拍| 啪啪啪综合| 青青草日韩无码| 男人天堂新| www.久久| 91色香| 91熟女熟妇视频网站| 人妻一区二区三区熟女| 麻豆国产尤物AV| 丰满人妻一区二区三区免费| 色吧五月| 久久97超碰| 91狠狠综合久久久久久| 视频国产欧美在线播放| 亚洲精品色| 国产成人亚洲精品无码最新在线| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 91狠狠色丁香婷婷综合久久| 欧美日韩不卡传媒| 久久综合99| 99re免费| 日韩激情视频| 国产精品呦一区二区三区| 欧美丝袜美女电影一二三四区| 精品在线观看视频在线| 久操电影网| 日本有码影片下载| 日韩极品无码B| 大香蕉之青青草原| 天天干天天狼在线视频| 鸥美中出| 天美一二三在线观看Av| 多毛小伙内射老太婆| 亚州精品人妻一二三区| 色五月婷婷在线| 色哟哟 日韩精品| 中出后入| 一区二区 韩日AV| 亚洲欧美国产va在线播放频| 爱爱久久| 天天干,夜夜爽| 狠狠久久手机视频精品| 2019午夜福利视频| 91久久久久久久| 日本伦乱九九九综合| 学生妹天天看| 狂操嫩妻视频一区二区三区| 狠狠色伊人亚洲综合网站色| 欧美精品,四区。五区| 99激情| 日韩在线一区高清在线| 色狠狠一区二区三区香蕉| 亚洲欧美一区二区三区在钱蜜桃| 欧美丰满少妇xx高潮| 亚洲狠狠入| 欧美午夜色妇色鬼| 十八禁视频网站| 黄色成人网久久久久久| yazhouzaixian| 蜜臀精品1区2区| 91呆哥人妻| 亚洲AV成人无码一二三久久| 久久久久久久久久久精| 和协无码影院| 色五月激情综合网| 欧美日韩国产另类综合| 91丝袜美女视频| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 97视频620| 美日韩成人| 色色香蕉| 亚洲成人黄色在线观看| 久热精品在线| 蜜桃久久久久久久久久久久| 嗯嗯嗯好爽| 国产精品熟女丝袜一区二区| 日韩在线欧美精品一区二区| 久久久久国色αv免费观看| 熟妇高潮精品一区二区三区下载| 女优视频第10页| 久久久成人国产精品无码| 中文字幕日韩专区精品系列| 麻豆成人AV| 久久女女| 精品无码一区二区人妻久久蜜桃 | 激情小说图片亚洲首页| 午夜传煤十二区精品| 免费草草草草草视频| 午夜天堂精品久久| 久久久久久久一级黄色打同平台| 国产亚州精品美女久久久免费| 欧美性爱18观看| 国产高清亚洲日韩一区| 日韩精品啪啪啪| 熟妇无码视频三区| 久久久久人| 狠狠2050在线观看| 久久爱超碰网| 四虎国产成人精品免费一女五男| 成 人 影视 一区 二区 三区 四区| 丁香五月婷婷色| 欧美性爱系列| 天天操天天舔| 久久精品国产免费观看99| av绯色| 太久视频| 女人喷水视频在线观看| 国产女人高潮嗷嗷嗷叫小说| 日韩激情毛片一级久久久| 精品一区二区三区国产| 丁香五月天视频| 熟女六十路| 日韩精品一区二区三区色欲| 色噜噜人妻丝袜a∨先锋影| 一级特级aaaa毛片免费观看 | 丝袜美腿诱惑亚洲欧美视频在线观看 | 免费看一级a性色生活片久久无| 亚洲欧美日韩精品久久久一区二区| 精品午夜福利国产一区二区在线观看 | 国产激情av女片自拍| 强奸乱伦中文字幕AV| 日本国产欧美高清在线| 亚洲码专区| 操操啪| 国产最新AV| 久久综合女优| 综合一区二区影视| 欧美色图另类图片| 97资源久久| 欧美高清18A片| 一级片在线观看高清无码| 黑人无码一区二区| 五月天婷婷成人网| 蜜桃中文字日产乱幕4区| 91久久伊人婷婷青青草| 伊人久久亚洲色欲综合网站| 岛国天天午夜影院传媒网| 日本男人天堂| 一级做受视频免费是看美女| 五月丁香拍拍激情综合三级| 亚洲国产无码精品首页久久久| 国产精品一二三免费网站| 97久久精品亚洲中六字幕| 九9热伊人| 成人性交午夜免费片| V A在线| 国精精品无码一二三区水多多| 五月天婷婷基地| 亚洲蜜臀懂色| 天天日骚逼熟女| 久久久久少妇| 黄片免费久久久久久久| 精品色色| 国产美女口爆吞精| 久九九九九九九九热| 电家庭影院午夜69久久夜色精品国产69乱| 成人小说视频在线精品欧美| 九九久久综合| 美女大乳久久久久久久女人18| 干妹子| 久久亚洲国产成人| 亚洲欧美精品福利在线| 人妻一区久久二区三区色播| 淫纸中9区| 亚洲精品成人动漫在线| 99色视频| 久湿久久| 18禁在线视频| 国产亚洲在线| 亚洲自拍一区夜夜操| 97视频免费播放| 亚洲暴力强奸AV| 九九九网页| 99热在线只有精品| 国产一级内射无挡观看| 欧美有码激情视频一区二区三区| 日韩中文字幕宗合在线| 精品91日日夜夜超清资源| 人人干人人搞人人摸| 欧美日韩黄色片一区二区三区四区人与兽做爱 | 日韩av三四区| 欧美九九九九九| 日本一本道A级黄色毛片试看60分钟| 在线啊啊啊啊| 不卡视频一区蜜桃视频 | 最新av在线| 97操| 99这里有精品| 青青草一区二区三区四| 秋霞一级A片黄色视频| 午夜精品99久久久久传媒| 久操免费电影| 欧亚性爱啪啪| 老女人碰碰在线碰碰视频| 日韩一级欧美一级国产一级台湾| 超碰99在线观看| 亚洲欧美综合网站| 午夜AV人气不卡| 熟女自慰久久久| 国产精品午夜AV完会免费| 99热66| 欧美伊人电影| 大地资源在线观看中文第二页| 老熟女中文字幕高清| 老子午夜伦不卡影院| 午夜福利久久久噜久噜久久综合| 超碰色97| 五月丁香六月| 综合第一页| 天天拍天天操| 久久αⅴ| 99无码视频| 搡老女人老91二区| 99精品在线观看| 欧美日韩资源| 九久久九精品视频| 天美精品原创av片国产| 二区熟妇韩日| 欧美日韩*字幕一区| 亚洲棕合电彰| 欧美黄色片在线播放| A啊啊在线观看| 国产精品干干干| 91国精产品| 亚洲第一在线视频| 久久在肏| 国内精品999| 欧美日韩大香蕉| 粉嫩AV一区夜夜嗨| 国产极品99热在线播放69| 国产和美国毛片| 熟女乱伦二区| 超碰地址久久| 国产人伦精品一区二区三区| 另类TS人妖一区二区三区| 91精品国久久久久久无码| 国产欧美一级在线观看| 97在线日韩中文字幕| 发朗少妇买婬全视频中文| 欧美激情激情xxxx欧美专区| 老师充足的奶水小说| 国产精品蜜乳AV| 综合亚洲欧美| 国产精品亚洲四五区在线观看| 国产成人精品无码久久| 国产乱码久久久| 精品少妇后入一区二区三区四区人妻巨乳| 欧美精品久久96人妻无码| 99re99视频在线免费观看| 999国产精品999| 中文字幕欧美丝袜07资源| 青青草国产盗摄一二三区| 日本午夜久久电影| 亚洲阿v天堂在线| 色臀aV| 夜夜嗨一区二区| 亚洲色图欧美色图日韩色图| 亚洲校园激情| 人妻天天爽夜夜爽爽| 日逼国产| 亚洲国产综合视频| 人妻中文字幕精品无码| 热热色国产一二区AV| 又大又长又爽| 亚洲国产午夜真人一级片中文字幕精品黄网站| 超碰色97| daxiangjiao你懂的| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 再深点灬舒服灬太大了添视频| 国产人妻久久精品一区二区三区| 欧美日日夜夜| 一级免费啪啪片| 久久性生大片免费观看性| 亚洲第一男人天堂| 国产久久视频| 五月激情视频| 亚洲 一区二区 自拍| 黑人免费福利视频| 天天欲望网| 丝袜色综合| 色噜噜人妻丝袜AV资源| 久久九九99| 日本色色色视频| 色色色日本| 射久久| 久久久一二三四区| 欧美大片天天看| 啊啊啊啊啊啊好多水| 97自拍视频在线| 啪一啪免费视频| 亚洲无码超碰免费| 夜色91| 99少妇| 亚洲第一男人天堂| 亚洲精品 欧美精品| 2019AV天堂| 国产视频三区四区| 五月丁香色综合| 免费一级视频特黄色大片| 日韩国产成人自拍视频| 国产亚洲性生活视频播放| 亚洲中文字幕在现观看| 欧美欧美少妇| 日本道人妻久久久在线不卡色视频| 动漫区日韩区欧美区| 亚洲官网在线| 国产精品经典一卡久久久| 欧美夜夜狠| 99re9在线| 日日干夜夜干| 色婷婷五月综合| 色欲天天综合网| www激情| 五月丁香六月婷| 超碰人人在线| 9久热| 日韩另类色图| 婷婷五月天补不补| 蜜桃色色网站视频三区| 亚洲第一综合| 五月婷婷六月激情| 色婷婷六月| 激情五月综合网| 亚洲91少妇| 日本亚洲vr欧美不卡高清专区| 亚洲精品一区二区三区新线路| 亚洲国产精品久久久久婷婷青年| 青青草密桃在线播放| 久久久久中出|