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