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

8ehkhllq  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(318)

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

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文件的模式:

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

相关问题