我正在从存储在hdfs中的avro文件创建一个配置单元表。而且,这个avro文件是从mongodb集合生成的。问题是有些字段有空值,我希望配置单元表中的字段除了应该存储的值(如int、string、array等)之外,也接受空值。我使用
CREATE EXTERNAL TABLE pub_avro
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
location "hdfs://path/to/avro_source_file"
TBLPROPERTIES (
'avro.schema.url'='hdfs://path/to/avro_schema.avsc');
这将创建表:
OK
Time taken: 0.32 seconds
但当我打印字段时,它会给我:
hive> select * from pub_avro limit 10;
OK
Failed with exception java.io.IOException:org.apache.avro.AvroTypeException: Found null, expecting array
Time taken: 0.532 seconds
1条答案
按热度按时间pgky5nke1#
我已经解决了在配置单元表列中接受空值的问题,但是仍然无法为avro文件中的mongodb id字段指定正确的模式。我已经搬走了
_id
字段,在指定字段类型时,我使用null
每一个领域。{ "name":"field_name", "type":["string", "null"]}
而不是{ "name":"field_name", "type":"string"}
编辑:我已经得到了mongodb id的模式
{"name": "_id", "type": [{"namespace": "._id", "type": "record", "name": "_id", "fields": [{"name": "oid", "type": ["string", "null"]}]}, "null"] }
我用这个脚本得到了avro文件的模式: