【问题标题】:How to specify fields delimiter when import MySQL into Hive with Sqoop?使用 Sqoop 将 MySQL 导入 Hive 时如何指定字段分隔符?
【发布时间】:2016-11-16 19:46:21
【问题描述】:

我尝试使用 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解析数据不正确,即hivetbl有100多行和字段没有对齐。

MySQL中不转义特殊字符,Sqoop中如何指定字段和记录的分隔符?

【问题讨论】:

  • 你可以尝试使用orc、parquet或avro来代替简单的文本格式。

标签: mysql hadoop hive sqoop


【解决方案1】:

您正在使用--hive-import,它会为您创建配置单元表如果不存在。它将使用 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' \

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多