使用进化的avro模式进行黑斑羚/蜂箱存储



我们有一个JSON结构,需要对其进行解析并在impala/hive中使用。由于JSON结构在不断发展,我们认为可以使用Avro。

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

黑斑羚可以直接使用avro格式的数据。假设我们将其存储在HDFS目录中/user/HDFS/person_data/

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

比方说,我们有一个用于person的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" }
 ]
}

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

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" }
 ]
}

我们可以继续将新的串行数据放在相同的HDFS目录/user/HDFS/person_data/中吗?通过将城市列作为NULL值的旧记录,impala/hive仍然可以工作吗

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

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

或将其标记为可为null:

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

相关内容

  • 没有找到相关文章

最新更新