使用Sqoop将MySQL导入Hive时如何指定字段分隔符?

时间:2016-07-14 03:21:19

标签: mysql hadoop hive sqoop

我尝试使用Sqoop v1.4将MySQL表导入Hive

sqoop import --connect jdbc:mysqll//localhost:3306/mysqldb \
--username user --password pwd --table mysqltbl \
--hive-import --hive-overwrite \
--hive-table hivedb.hivetbl -m 1 \
--null-string '\\N' \
--null-non-string '\\N' \

mysqltbl中有100行,其中一个字段text包含\t\n,导致Sqoop错误地解析数据,即超过100 hivetbl中的行和字段未对齐。

如何在Sqoop中指定字段和记录的分隔符,而不是逃避MySQL中的特殊字符?

1 个答案:

答案 0 :(得分:2)

您正在使用--hive-import,它会为您创建一个hive表 IF NOT EXISTS 。它将使用Hive的默认分隔符创建 - 字段终止于:CTRL A和以\n

终止的行

根据演习docs

  

即使Hive支持转义字符,它也不会处理新行字符的转义。

     

如果数据库的行包含具有Hive默认行分隔符(\n\r字符)或列分隔符(\01字符)的字符串字段,则Hive将无法使用Sqoop导入的数据存在于他们中间。您可以使用--hive-drop-import-delims选项在导入时删除这些字符以提供与Hive兼容的文本数据。或者,您可以使用--hive-delims-replacement选项在导入时使用用户定义的字符串替换这些字符,以提供与Hive兼容的文本数据。

您只需在查询中使用--hive-drop-import-delims即可删除\n

sqoop import --connect jdbc:mysqll//localhost:3306/mysqldb \
--username user --password pwd --table mysqltbl \
--hive-import --hive-overwrite \
--hive-table hivedb.hivetbl -m 1 \
--hive-drop-import-delims \
--null-string '\\N' \
--null-non-string '\\N' \

如果您想要替换自己的字符串(例如空格,即“”),您可以使用--hive-delims-replacement

sqoop import --connect jdbc:mysqll//localhost:3306/mysqldb \
--username user --password pwd --table mysqltbl \
--hive-import --hive-overwrite \
--hive-table hivedb.hivetbl -m 1 \
--hive-delims-replacement " " \
--null-string '\\N' \
--null-non-string '\\N' \