我的要求是通过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
答案 0 :(得分:0)
这看起来像avro serde的问题。这是一个开放的bug。 https://issues.apache.org/jira/browse/HIVE-14044
您可以在hive 2.0中尝试相同的操作吗?
答案 1 :(得分:0)
如VJ所述,avro中的新行字符存在未解决的问题。
您可以尝试的替代方法是
由于换行符在textfileformat中处理得很好