sqoop 處理換行符 \n 和\r 等特殊符號處理

 

公司大數據平臺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  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章