公司大數據平臺ETL操作中,在使用sqoop將mysql中的數據抽取到hive中時,由於mysql庫中默寫字段中會有換行符,導致數據存入hive後,條數增多(每個換行符會多出帶有null值得一條數據),導致統計數據不準確。因爲sqoop 導出文件不能是ORC這種列式存儲,所以只能替換。導出後對替換的字符在進行替換,將數據表存儲 orc
解決辦法:
利用一下兩個參數可以實現對換行等特殊字符的替換或者刪除
--hive-delims-replacement
--hive-drop-import-delims
使用方法,
1、在原有sqoop語句中添加 --hive-delims-replacement “ ” 可以將如mysql中取到的\n, \r, and \01等特殊字符替換爲自定義的字符,此處用了空格
2、在原有sqoop語句中添加 --hive-drop-import-delims 可以將如mysql中取到的\n, \r, and \01等特殊字符丟棄
給個具體的例子:
/usr/local/sqoop/bin/sqoop-import --connect jdbc:mysql://ip:port/xxx --username xxxx --password xxxx --table data_clt_app_info_1210 --target-dir /tmp/tmp_data_clt_app_info_text_1210_bak --fields-terminated-by '||' -m 1 --split-by stat_date --delete-target-dir --hive-delims-replacement 'aaaaaaaa'
大功告成
把特殊換行換成 aaaaaaaa
create table tmp.change_orc stored as orc as
select stat_date,app_id,queue,start_time,finish_time,regexp_replace(job_name,'aaaaaaaa',' \n ') as job_name from tmp.tmp_data_clt_app_info_text_1210_bak