我们需要一个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值旧记录来实现吗?
答案 0 :(得分:1)
是的,您可以,但对于所有新列,您应指定默认值:
{ "name": "newField", "type": "int", "default":999 }
或将它们标记为可空:
{ "name": "newField", "type": ["null", "int"] }