我的要求是通过avro格式的sqoop(1.4.6)将rdbms中的数据加载到hdfs中(由cdh5.9.x支持),然后使用一个外部hive(1.1)表来查询数据。不幸的是,rdbms中的数据有一些新行字符。
我们都知道hive不能解析数据中的新行字符,当通过hive选择整个数据时,数据Map失败。但是,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条答案
按热度按时间tf7tbtn21#
正如vj所提到的,avro中的新行字符有一个开放的问题。
你可以尝试的另一种方法是
将数据以textfileformat的形式放入配置单元暂存表中。
创建一个avro表。
将数据从暂存表插入配置单元中的主avro表。
因为换行符在textfileformat中处理得非常好
ua4mk5z42#
这看起来像是avro serde的问题。这是一个开放的错误。https://issues.apache.org/jira/browse/hive-14044.
你能在Hive2.0中尝试同样的方法吗?