我们有一个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"] }