Использование развивающейся схемы avro для хранилища импала / улья

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


person tesnik03    schedule 01.04.2016    source источник


Ответы (1)


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

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

или пометьте их как допускающие значение NULL:

{ "name": "newField", "type": ["null", "int"] }
person alexeipab    schedule 02.04.2016