1. 程式人生 > 資料庫 >hive從mysql匯入資料量變多的解決方案

hive從mysql匯入資料量變多的解決方案

原始導數命令:

bin/sqoop import -connect jdbc:mysql://192.168.169.128:3306/yubei -username root -password 123456 -table yl_city_mgr_evt_info --split-by rec_id -m 4 --fields-terminated-by "\t" --lines-terminated-by "\n" --hive-import --hive-overwrite -create-hive-table -delete-target-dir -hive-database default -hive-table yl_city_mgr_evt_info

原因分析:可能是mysql中欄位裡面有'\n'等分隔符,匯入hive時預設以'n'作換行符,導致hive中的記錄數變多。

解決方法:

匯入資料時加上--hive-drop-import-delims選項,會刪除欄位中的\n,\r,\01。

最終導數命令:

bin/sqoop import -connect jdbc:mysql://192.168.169.128:3306/yubei -username root -password 123456 -table yl_city_mgr_evt_info --split-by rec_id -m 4 --hive-drop-import-delims --fields-terminated-by "\t" --lines-terminated-by "\n" --hive-import --hive-overwrite -create-hive-table -delete-target-dir -hive-database default -hive-table yl_city_mgr_evt_info

參考官方文件:https://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html

補充:Sqoop匯入MySQL資料到Hive遇到的坑

1.sqoop匯入到HDFS

1.1執行sqoop job,會自動更新last value

# sqoop 增量匯入指令碼
bin/sqoop job --create sqoop_hdfs_test02 -- import \
--connect jdbc:mysql://localhost:3306/pactera_test \
--username root \
--password 123456 \
--table student \
--target-dir /user/sqoop/test002/ \
--fields-terminated-by "\t" \
--check-column last_modified \
--incremental lastmodified \
--last-value "2018-12-12 00:03:00" \
--append

說明:--append 引數是必須的,要不然第二次執行job 會報錯,如下:

hive從mysql匯入資料量變多的解決方案

至此,sqoop job 已建設完畢!

2.Hive建立表,並讀取sqoop匯入的資料

create external table if not exists student_hive (SId int,Sname string,Sage string,Ssex string,last_modified Timestamp) 
row format delimited fields terminated by '\t' location 'hdfs://node01:8020/user/sqoop/test002/';

注意:此處hive中時間的格式為timestamp,設定為date DB資料無法正常載入。

第一次全量載入,整條路線完全OK,hive表可以查詢到資料。

-----------------------重點分割線-----------------------

* sqoop lastmodified格式的增量載入,會將last-value 儲存為job執行的系統時間,若測試資料庫的check-column 小於當前系統時間(即上一個job的last-value),則資料將不被載入。

hive從mysql匯入資料量變多的解決方案

如SId=6 就沒有被載入,遂改為今日時間(2018-12-26 17:05)進行資料測試,資料成功被載入!喲呵!!

總結:

使用lastmodified格式,進行sqoop增量匯入時,

1.注意--append的使用;

2.last-value為job執行的系統時間,在資料測試時,要保證資料的準確,資料的自增長。

3.一切皆有定數,檢視資料,準確定位自己系統遇到的問題

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。