Sqoop导入具有avro格式的新行字符的数据,然后使用配置单元进行查询

时间:2018-04-06 08:54:54

标签: hadoop hive avro sqoop

我的要求是通过avro格式的sqoop(1.4.6)将数据从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

2 个答案:

答案 0 :(得分:0)

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

您可以在hive 2.0中尝试相同的操作吗?

答案 1 :(得分:0)

如VJ所述,avro中的新行字符存在未解决的问题。

您可以尝试的替代方法是

  1. 将数据作为textfileformat存入hive登台表。
  2. 创建一个avro表。
  3. 将数据从登台表插入配置单元中的主avro表。
  4. 由于换行符在textfileformat中处理得很好