Mapreduce 使用演进的avro模式进行impala/hive存储

Mapreduce 使用演进的avro模式进行impala/hive存储,mapreduce,hive,hadoop2,avro,impala,Mapreduce,Hive,Hadoop2,Avro,Impala,我们有一个JSON结构,需要在impala/hive中解析和使用它。 由于JSON结构正在演变,我们认为可以使用Avro 我们计划解析JSON并将其格式化为avro impala可以直接使用avro格式的数据。假设我们将其存储在HDFS目录/user/HDFS/person\u data/ 我们将继续将avro序列化的数据放在该文件夹中,并将逐个解析输入json 比如说,我们有一个针对person的avro模式文件(hdfs://user/hdfs/avro/scheams/person.avs

我们有一个JSON结构,需要在impala/hive中解析和使用它。 由于JSON结构正在演变,我们认为可以使用Avro

我们计划解析JSON并将其格式化为avro

impala可以直接使用avro格式的数据。假设我们将其存储在HDFS目录/user/HDFS/person\u data/

我们将继续将avro序列化的数据放在该文件夹中,并将逐个解析输入json

比如说,我们有一个针对person的avro模式文件(hdfs://user/hdfs/avro/scheams/person.avsc)像

为此,我们将通过创建外部表在配置单元中创建表-

CREATE TABLE kst
  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'
  TBLPROPERTIES (
    'avro.schema.url'='hdfs://user/hdfs/avro/scheams/person.avsc');
假设明天我们需要更改此模式(hdfs://user/hdfs/avro/scheams/person.avsc)到-


我们是否可以继续将新的序列化数据放在同一HDFS目录/user/HDFS/person\u data/中,并且通过将city列作为空值的旧记录,impala/hive仍然可以工作?

是的,您可以,但对于所有新列,您应该指定一个默认值:

{ "name": "newField", "type": "int", "default":999 }
或将其标记为可为空:

{ "name": "newField", "type": ["null", "int"] }
{ "name": "newField", "type": "int", "default":999 }
{ "name": "newField", "type": ["null", "int"] }