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

时间:2018-07-25 07:29:20

标签: hive avro

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

1 个答案:

答案 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