2016-11-01 4 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の以上の列を追加する必要があります。その場合、

私は105の列を持つ新しいスキーマで新しいテーブルを作成する場合、私は1つのプロジェクトの2つのテーブルがあります。また、今後数日でいくつかの列を追加または削除すると、そのために新しい表を作成する必要があります。私は、同じプロジェクトに異なるスキーマを使用するテーブルがたくさんあることを恐れています。

現在のテーブルで古いスキーマを新しいスキーマに置き換えた場合、1つのプロジェクトに対して1つのテーブルしか持たなくなりますが、スキーマの競合のために古いデータを読み込むことはできません。

このような場合にavroスキーマを使用する最良の方法は何ですか?

答えて

0

私はdefaultプロパティを使用すると、列が現在のデータに存在しないことを列が現在のデータでそれを存在しないという場合には、デフォルト値を返す場合、私は、その

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

ようアブロスキーマに新しい列を追加しました期待どおりにデータ値を返します。

デフォルトとしてNULL値を設定するために、あなたは、typeプロパティに

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

または

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

という帰の位置を必要とし、最初の場所であるか、またはデフォルトのプロパティを有する第二場所にすることができます。

+0

デフォルト値としてnullを追加する方法はありますか? – colintobing

+0

私の答え、幸運@colintobingを更新しました – neverwinter

2

これは確かに挑戦的です。最善の方法は、すべてのスキーマの変更が古いデータと互換性があることを確認することです。デフォルトのカラムだけを削除し、追加するカラムにデフォルトを指定してください。これにより、スキーマを矛盾なく安全に交換し、古いデータを読み続けることができます。 Avroはそれについてかなり巧みで、それは "スキーマの進化"と呼ばれています(あなたがGoogleにもっと少ししたい場合に備えて)、リーダーとライターのスキーマが少し違うようにします。

Kafkaには、Confluentのスキーマレジストリを使用してこれらの種類のスキーマ変更を自動的に処理するネイティブHDFSコネクタ(Flumeなし)があります。レジストリを使用して、スキーマが互換性があるかどうかを確認できますそれらがある場合、新しいスキーマを使用してデータを書き込むだけで、Hiveテーブルは自動的に一致するように進化します。

関連する問題