使用不断发展的avro架构进行impala / hive存储

时间:2016-04-01 17:16:01

标签: mapreduce hive hadoop2 avro impala

我们需要一个JSON结构来解析并在impala / hive中使用它。 由于JSON结构正在发展,我们认为我们可以使用Avro。

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

avro格式的数据可以直接由impala使用。让我们说我们将它存储在HDFS目录 / user / hdfs / person_data /

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

让我们说,我们有一个人的avro架构文件(hdfs://user/hdfs/avro/scheams/person.avsc),如

{
 "type": "record",
 "namespace": "avro",
 "name": "PersonInfo",
 "fields": [
   { "name": "first", "type": "string" },
   { "name": "last", "type": "string" },
   { "name": "age", "type": "int" }
 ]
}

为此,我们将通过创建外部表 -

在hive中创建表
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)更改为 -

{
 "type": "record",
 "namespace": "avro",
 "name": "PersonInfo",
 "fields": [
   { "name": "first", "type": "string" },
   { "name": "last", "type": "string" },
   { "name": "age", "type": "int" },
   { "name": "city", "type": "string" }
 ]
}

我们可以继续将新的seriliazied数据放在同一个HDFS目录/ user / hdfs / person_data /中,并且impala / hive仍然可以通过将city列作为NULL值旧记录来实现吗?

1 个答案:

答案 0 :(得分:1)

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

{ "name": "newField", "type": "int", "default":999 }

或将它们标记为可空:

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