我尝试使用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中的特殊字符?
答案 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' \