公司大数据平台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