sqoop:导出MySQL数据至Hive时,数据中包含\001或\n等字符

场景

使用sqoop从MySQL导出数据至Hive时,如果数据中包含hive指定的列分隔符,如\001 或\t,那么在Hive中就会导致数据错位;如果数据中包含换行符\n,那么就会导致原先的一行数据,在Hive中变成了两行。

解决办法

在sqoop执行时,使用如下参数:

--hive-drop-import-delims 导入Hive时,从字符串字段中删除\n、\r和\01。
--hive-delims-replacement 导入Hive,将字符串字段中的\n、\r和\01替换为指定字符串。

如:

sqoop-import \
--connect jdbc:mysql://ip:port/databasesName \
--username xxxx \
--password xxxx \
--table tableName\
--target-dir /data/tableDir \ #Hive表在HDFS中的位置
--fields-terminated-by '\001'  \ #指定导入到Hive时的列分割符
-m 1 \  #表明几个Map并行跑
--split-by stat_date \ #拆分数据的字段,假设-m设置为4,数据有100条,sqoop首先会获取拆分字段的最大值,最小值,步长为100/4=25;
--delete-target-dir \ #导入Hive前是否先删除HDFS中的目标目录,相当于overwrite
--hive-delims-replacement ''  #将特殊字符转换成空字符串

Sqoop导入Hive的其他配置项

Argument Description
--hive-home 设置$HIVE_HOME的位置,不加则默认使用环境中的$HIVE_HOME
--hive-import 导入表进hive(如果不设置分隔符的话,则使用Hive默认的分隔符。)
--hive-overwrite 导入表进Hive时,覆盖原先的Hive表
--create-hive-table 如果Hive表不存在,则自动创建;如果以及存在,则会报错
--hive-table 设置目标Hive表。
--hive-drop-import-delims 导入到Hive时,删除原数据中包含的 \n\r,\01字符。
--hive-delims-replacement 导入到Hive时,将原数据中的\n\r,  \01 替换成自定义的字符。
--hive-partition-key 指定Hive表的分区字段。
--hive-partition-value 指定导入Hive表的分区字段的值。
--map-column-hive 设置导入Hive时,指定字段的数据类型。如设置ID为S听类型:--map-column-hive  ID=String

你可能感兴趣的:(sqoop)