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的其他配置项

ArgumentDescription
--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
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值