Sqoop之导入到Hive时特殊字符导致数据变乱

  • 2019 年 10 月 4 日
  • 筆記

    问题是这样的:

    Sqoop从关系型数据库导入数据到Hive时,发现数据量增多了,查找之后发现是由于源数据中含义rtn特殊字符的数据,这样Hive遇到之后就将其视为换行,所以导入到Hive后数据条数增多了很多,问题找到了,怎么解决呢.

方法1: sqoop的sql中对含有特殊字符的字段进行replace操作,如下List-1所示,将特殊字符转换为空格。

List-1 从mysql导入时用replace

replace(replace(replace(description,'r',' '),'n',' '),'t',' ')

方法2: 使用hive-drop-import-delims,这是sqoop官方提供的一个参数,导入到hive时,遇到特殊字符就会将改字符丢弃,如下List-2

List-2

sqoop import   --connect jdbc:mysql://xxxxxxx   --username xxx --password xxx   --delete-target-dir   --target-dir /tmp/hive/xxxx_temp   -m 1   --query "SQL查询语句 where $CONDITIONS"   --hive-drop-import-delims   --split-by xxx   --fields-terminated-by "t"   --lines-terminated-by "n"

    Sqoop还提供了另一个参数–hive-delims-replacement,它会将特殊字符替换为我们设定的字符。

                                                                               图1

    如上图1是官网的截图。由于历史原因,目前我们俩种方式都使用,但是都慢慢的改为方法2了。

Reference

  1. http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html