web-dev-qa-db-ja.com

Avroスキーマの進化が必要な理由

私はHadoopとプログラミングに不慣れで、Avroスキーマの進化について少し混乱しています。これまでにAvroについて理解したことを説明します。

Avroは、jsonスキーマを先頭にしてバイナリデータを格納するシリアル化ツールです。スキーマは次のようになります。

{
    "namespace":"com.trese.db.model",
    "type":"record",
    "doc":"This Schema describes about Product",
    "name":"Product",
    "fields":[
        {"name":"product_id","type": "long"},
        {"name":"product_name","type": "string","doc":"This is the name of the product"},
        {"name":"cost","type": "float", "aliases":["price"]},
        {"name":"discount","type": "float", "default":5}
    ]
}

さて、私の質問は、なぜevolutionが必要なのかということです。新しいフィールドのスキーマでdefaultを使用できることを読みました。ただし、ファイルに新しいスキーマを追加すると、その以前のスキーマは上書きされます。 1つのファイルに2つのスキーマを含めることはできません。

もう1つの質問は、リーダースキーマとライタースキーマとは何であり、それらはどのように役立つのでしょうか。

15
Anaadih.pradeep

1つのavroファイルがあり、そのスキーマを変更したい場合は、そのファイルを内部の新しいスキーマで書き換えることができます。しかし、テラバイトのavroファイルがあり、それらのスキーマを変更したい場合はどうでしょうか。スキーマが変更されるたびに、すべてのデータを書き換えますか?

スキーマの進化により、古いデータのスキーマとの下位互換性を維持しながら、新しいデータの書き込みに使用されるスキーマを更新できます。次に、すべてのデータに1つのスキーマがあるかのように、すべてをまとめて読み取ることができます。もちろん、互換性を維持するために、許可された変更を管理する正確なルールがあります。これらのルールは スキーマ解決 にリストされています。

リーダースキーマとライタースキーマには、進化を超えた他の使用例があります。リーダーをフィルターとして使用できます。ほんの一握りだけに関心がある数百のフィールドを持つデータを想像してみてください。その少数のフィールドのスキーマを作成して、必要なデータのみを読み取ることができます。逆の方法で、デフォルトデータを追加するリーダースキーマを作成するか、スキーマを使用して2つの異なるデータセットのスキーマを結合できます。

または、読み取りと書き込みの両方に、変更されないスキーマを1つだけ使用することもできます。これが最も単純なケースです。

33
jaco0646