如何在使用sqoop将mysql导入配置单元时指定字段分隔符?

i7uq4tfw  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(718)

我尝试用sqoopv1.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' \

有100排 mysqltbl 其中一块田地 text 包含 \t 以及 \n ,导致sqoop错误地解析数据,即中有100多行 hivetbl 而且磁场没有对齐。
如何在sqoop中指定字段和记录的分隔符,而不是对mysql中的特殊字符进行转义?

f4t66c6m

f4t66c6m1#

您正在使用 --hive-import ,如果不存在,它将为您创建配置单元表。它将使用配置单元的默认分隔符创建字段,字段以:ctrl a结尾,行以: \n 根据演练文件:
即使配置单元支持转义字符,它也不处理换行字符的转义。
如果数据库的行包含具有配置单元默认行分隔符的字符串字段,则配置单元将在使用sqoop导入的数据时遇到问题( \n 以及 \r 字符)或列分隔符( \01 (字符)出现在其中。你可以用 --hive-drop-import-delims 选项在导入时删除这些字符以提供与配置单元兼容的文本数据。或者,您可以使用 --hive-delims-replacement 选项在导入时用用户定义的字符串替换这些字符,以提供与配置单元兼容的文本数据。
你可以简单地使用 --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' \

相关问题