Hive 在配置单元表的字段中允许空值

Hive 在配置单元表的字段中允许空值,hive,avro,Hive,Avro,我正在从存储在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.ha

我正在从存储在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

我已经解决了在配置单元表列中接受空值的问题,但仍然无法在avro文件中为mongoDB id字段指定正确的模式。我已经从avro文件中删除了
\u id
字段,在指定字段类型时,我对每个字段使用了
null

{“name”:“field_name”,“type”:[“string”,“null”]}

而不是
{“name”:“field_name”,“type”:“string”}

编辑:

我已经获得了mongoDB id的模式,其中有一个
{“name”:“{u id”,“type”:[{“namespace”:“{u id”,“type”:“record”,“name”:“{u 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