2016-04-01 2 views
1

У нас есть структура 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?

ответ

1

Да, вы можете, но и для всех новых столбцов следует указать значение по умолчанию:

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

или помечать их как обнуляемым:

{ "name": "newField", "type": ["null", "int"] } 
Смежные вопросы