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