2016-11-01 13 views
2

Я использую flume + kafka, чтобы поместить данные журнала в hdfs. Мой тип данных раковины - Avro. В схеме avro (.avsc) имеется 80 полей в виде столбцов.с использованием другой схемы avro для новых столбцов

Так что я создал внешнюю таблицу как этот

CREATE external TABLE pgar.tiz_biaws_fraud 
PARTITIONED BY(partition_date INT) 
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' 
LOCATION '/data/datapool/flume/biaws/fraud' 
TBLPROPERTIES ('avro.schema.url'='hdfs://xxxx-ns/data/datapool/flume/biaws/fraud.avsc') 

Теперь мне нужно добавить еще 25 столбцов в Avro схеме. В этом случае

Если я создаю новую таблицу с новой схемой, которая содержит 105 столбцов, у меня будет две таблицы для одного проекта. И если я добавлю или удалю некоторые столбцы в ближайшие дни, я должен создать для этого новую таблицу. Я боюсь иметь много таблиц, которые используют разные схемы для того же проекта.

Если я поменяю прежнюю схему на новую схему в текущей таблице, у меня будет только одна таблица для одного проекта, но я больше не могу читать и получать старые данные из-за конфликта схемы.

Каков наилучший способ использования схемы Avro в случае, если это так?

ответ

0

Я добавил новые столбцы Avro схемы, как этот

{"name":"newColumn1", "type": "string", "default": ""}, 
{"name":"newColumn2", "type": "string", "default": ""}, 
{"name":"newColumn3", "type": "string", "default": ""}, 

Когда я использую default свойство, если столбцы не существует в текущих данных возвращает значение по умолчанию, если столбцы не существуют в текущем данном это возвращает значение данных, как ожидалось.

Для установки нулевого значения по умолчанию, вам нужно что

{ "name": "newColumn4", "type": [ "string", "null" ], "default": "null" }, 

или

{ "name": "newColumn5", "type": [ "null", "string" ]}, 

Положения нуля в типе собственности, может быть первым местом или может быть вторым местом со свойством по умолчанию.

+0

Как добавить значение null в качестве значения по умолчанию? – colintobing

+0

Я обновил свой ответ, удачи @colintobing – neverwinter

2

Это действительно сложно. Лучший способ - убедиться, что все изменения схемы, которые вы делаете, совместимы со старыми данными - поэтому удалите только столбцы с настройками по умолчанию и убедитесь, что вы указываете значения по умолчанию в добавляемых столбцах. Таким образом, вы можете безопасно менять схемы без конфликтов и продолжать чтение старых данных. Avro довольно умен в этом вопросе, он называется «эволюция схемы» (если вы хотите, чтобы google немного больше) и позволяет схемам чтения и записи быть немного разными.

В качестве ссылки я хочу упомянуть, что Kafka имеет собственный разъем HDFS (т.е. без Flume), который использует реестр схем Confluent для автоматической обработки этих видов изменений схемы - вы можете использовать реестр для проверки совместимости схем , а если они есть - просто напишите данные, используя новую схему, и таблица Hive будет автоматически развиваться, чтобы соответствовать.

 Смежные вопросы

  • Нет связанных вопросов^_^