Sqoop 导入具有 avro 格式的换行符的数据,然后使用 hive 查询

Posted

技术标签:

【中文标题】Sqoop 导入具有 avro 格式的换行符的数据,然后使用 hive 查询【英文标题】:Sqoop Import of Data having new line character in avro format and then query using hive 【发布时间】:2018-04-06 08:54:53 【问题描述】:

我的要求是通过 sqoop (1.4.6) 以 avro 格式将数据从 RDBMS 加载到 HDFS(由 CDH 5.9.X 支持),然后使用外部 hive(1.1) 表来查询数据。 不幸的是,RDBMS 中的数据有一些换行符。

我们都知道 hive 无法解析数据中的换行符,通过 hive 选择整个数据时,数据映射失败。但是,hive 的 select count(*) 工作正常。

我在 sqoop 导入期间使用了以下选项并检查过,但没有用:

--hive-drop-import-delims
--hive-delims-replacement

以上选项适用于文本格式。但是以文本格式存储数据对我来说不是一个可行的选择。 上述选项在 Sqoop 生成(codegen)POJO 类的 toString 方法中正确转换(显然文本格式按预期工作),所以我觉得在 avro 导入期间根本没有使用此方法。可能是因为 avro 处理换行符没有问题,就像 hive 一样。

我很惊讶,没有人会遇到这种常见的情况,一个有备注的表格,评论字段很容易出现这个问题。

谁能给我建议一个解决方案?

我的命令:

sqoop import \
-Dmapred.job.queue.name=XXXX \
--connect jdbc:oracle:thin:@Masked:61901/AgainMasked \
--table masked.masked \
--username masked \
--P \
--target-dir /user/masked/ \
--as-avrodatafile \
--map-column-java CREATED=String,LAST_UPD=String,END_DT=String,INFO_RECORD_DT=String,START_DT=String,DB_LAST_UPD=String,ADDR_LINE_3=String\
--hive-delims-replacement ' '
--null-string '\\N'
--null-non-string '\\N'
--fields-terminated-by '\001'
-m 1

【问题讨论】:

您正在使用 bit hive 导入和 HDFS 导入的组合。对于 Hive 导入,您应该使用命令 --hive-import --hive-drop-import-delims --map-column-hive 【参考方案1】:

这看起来像是 avro serde 的问题。这是一个开放的错误。 https://issues.apache.org/jira/browse/HIVE-14044.

你可以在 hive 2.0 中尝试同样的方法吗?

【讨论】:

【参考方案2】:

正如 VJ 所说,avro 中的换行符存在一个未解决的问题。

您可以尝试的另一种方法是

    Sqoop 将数据以文本文件格式存储到 Hive 临时表中。 创建一个 avro 表。 将临时表中的数据插入 hive 中的主 avro 表。

因为换行符在文本文件格式中处理得很好

【讨论】:

以上是关于Sqoop 导入具有 avro 格式的换行符的数据,然后使用 hive 查询的主要内容,如果未能解决你的问题,请参考以下文章

Sqoop - 使用 Avro 格式将表从 Oracle 导入 Hive 的最佳选择是啥?

使用 sqoop 将数据从 CSV 导入 Avro 表的命令

在 sqoop 中使用 java api 导入 avro 数据

Dataproc 上的 Sqoop 无法将数据导出为 Avro 格式

14_sqoop数据导入

sqoop配置安装以及导入