我正在从存储在hdfs中的avro文件创建配置单元表。并且,此avro文件是从mongodb集合生成的。问题是某些字段具有空值,我希望配置单元表中的字段除了应存储的值(如int,字符串,数组等)外,还接受空值。我使用
创建了配置单元表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
答案 0 :(得分:0)
我已经解决了在配置单元表列中接受空值的问题,但是我仍然无法为avro文件中的mongoDB id字段指定正确的架构。我已从avro文件中删除了_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文件的架构:
from hdfs.ext.avro import AvroReader, AvroWriter
from hdfs import InsecureClient
import json
client = InsecureClient('http://master:50070')
dir_path = '/path/to/avro/file'
with AvroReader(client, dir_path) as reader:
schema = reader.schema
schema = json.dumps(schema)
print sc