Mapreduce 使用演进的avro模式进行impala/hive存储
我们有一个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)像 为此,我们将通过创建外部表在配置单元中创建表-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
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"] }