私は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つの質問は、リーダースキーマとライタースキーマとは何であり、それらはどのように役立つのでしょうか。
1つのavroファイルがあり、そのスキーマを変更したい場合は、そのファイルを内部の新しいスキーマで書き換えることができます。しかし、テラバイトのavroファイルがあり、それらのスキーマを変更したい場合はどうでしょうか。スキーマが変更されるたびに、すべてのデータを書き換えますか?
スキーマの進化により、古いデータのスキーマとの下位互換性を維持しながら、新しいデータの書き込みに使用されるスキーマを更新できます。次に、すべてのデータに1つのスキーマがあるかのように、すべてをまとめて読み取ることができます。もちろん、互換性を維持するために、許可された変更を管理する正確なルールがあります。これらのルールは スキーマ解決 にリストされています。
リーダースキーマとライタースキーマには、進化を超えた他の使用例があります。リーダーをフィルターとして使用できます。ほんの一握りだけに関心がある数百のフィールドを持つデータを想像してみてください。その少数のフィールドのスキーマを作成して、必要なデータのみを読み取ることができます。逆の方法で、デフォルトデータを追加するリーダースキーマを作成するか、スキーマを使用して2つの異なるデータセットのスキーマを結合できます。
または、読み取りと書き込みの両方に、変更されないスキーマを1つだけ使用することもできます。これが最も単純なケースです。