У нас есть структура JSON, которую нам нужно проанализировать и использовать в импале / улье. Поскольку структура JSON развивается, мы подумали, что можем использовать Avro.
Мы планировали разобрать JSON и отформатировать его как avro.
Данные в формате avro могут использоваться импала напрямую. Допустим, мы храним его в каталоге 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" }
]
}
Для этого мы создадим таблицу в улье, создав внешнюю таблицу -
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 /, и impala / hive по-прежнему будет работать, задав столбец city как старые записи со значением NULL?