Avro-schemas
AVRO-スキーマ
スキーマベースのシリアル化ユーティリティであるAvroは、スキーマを入力として受け入れます。 さまざまなスキーマが利用可能であるにもかかわらず、Avroはスキーマを定義する独自の標準に従います。 これらのスキーマは、次の詳細を説明します-
- ファイルのタイプ(デフォルトで記録)
- 記録の場所
- レコードの名前
- 対応するデータ型を持つレコードのフィールド
これらのスキーマを使用すると、シリアル化された値を少ないスペースでバイナリ形式で保存できます。 これらの値は、メタデータなしで保存されます。
Avroスキーマの作成
Avroスキーマは、JavaScript Object Notation(JSON)ドキュメント形式で作成されます。これは、軽量のテキストベースのデータ交換形式です。 次のいずれかの方法で作成されます-
- JSON文字列
- JSONオブジェクト
- JSON配列
例-次の例は、名前空間finddevguidesで、名前Employeeの名前と年齢のフィールドを持つドキュメントを定義するスキーマを示しています。
{
"type" : "record",
"namespace" : "finddevguides",
"name" : "Employee",
"fields" : [
{ "name" : "Name" , "type" : "string" },
{ "name" : "Age" , "type" : "int" }
]
}
この例では、各レコードに4つのフィールドがあることがわかります-
- type -このフィールドはドキュメントの下にあり、fieldsという名前のフィールドの下にもあります。
- ドキュメントの場合、複数のフィールドがあるため、ドキュメントのタイプ、通常はレコードを示します。
- フィールドの場合、タイプはデータタイプを表します。
- namespace -このフィールドは、オブジェクトが存在する名前空間の名前を記述します。
- name -このフィールドは、fieldsという名前のフィールドの下だけでなく、ドキュメントの下にもあります。
- ドキュメントの場合、スキーマ名を記述します。 このスキーマ名と名前空間は、ストア内のスキーマを一意に識別します( Namespace.schema name )。 上記の例では、スキーマの完全な名前はfinddevguides.Employeeになります。
- フィールドの場合、フィールドの名前を記述します。
Avroのプリミティブデータ型
Avroスキーマには、プリミティブデータ型と複雑なデータ型があります。 次の表では、Avroの*プリミティブデータ型*について説明します-
Data type | Description |
---|---|
null | Null is a type having no value. |
int | 32-bit signed integer. |
long | 64-bit signed integer. |
float | single precision (32-bit) IEEE 754 floating-point number. |
double | double precision (64-bit) IEEE 754 floating-point number. |
bytes | sequence of 8-bit unsigned bytes. |
string | Unicode character sequence. |
Avroの複雑なデータ型
プリミティブデータ型に加えて、Avroは6つの複雑なデータ型、つまりレコード、列挙、配列、マップ、ユニオン、固定を提供します。
記録
Avroのレコードデータタイプは、複数の属性のコレクションです。 それは次の属性をサポートしています-
- name -このフィールドの値は、レコードの名前を保持します。
- namespace -このフィールドの値は、名前空間の名前を保持します オブジェクトが保存されます。
- type -この属性の値は、ドキュメント(レコード)のタイプまたはスキーマ内のフィールドのデータタイプを保持します。
- fields -このフィールドはJSON配列を保持します。JSON配列には、スキーマ内のすべてのフィールドのリストがあり、各フィールドには名前とタイプの属性があります。
例
以下にレコードの例を示します。
{
" type " : "record",
" namespace " : "finddevguides",
" name " : "Employee",
" fields " : [
{ "name" : " Name" , "type" : "string" },
{ "name" : "age" , "type" : "int" }
]
}
Enum
列挙はコレクション内のアイテムのリストであり、Avro列挙は次の属性をサポートしています-
- name -このフィールドの値は、列挙の名前を保持します。
- namespace -このフィールドの値には、列挙の名前を修飾する文字列が含まれています。
- symbols -このフィールドの値は、列挙型のシンボルを名前の配列として保持します。
例
以下に列挙の例を示します。
{
"type" : "enum",
"name" : "Numbers",
"namespace": "data",
"symbols" : [ "ONE", "TWO", "THREE", "FOUR" ]
}
配列
このデータ型は、単一の属性項目を持つ配列フィールドを定義します。 この項目属性は、配列内の項目のタイプを指定します。
例
{ " type " : " array ", " items " : " int " }
Maps
マップデータタイプはキーと値のペアの配列であり、データをキーと値のペアとして整理します。 Avroマップのキーは文字列でなければなりません。 マップの値は、マップのコンテンツのデータ型を保持します。
例
{"type" : "map", "values" : "int"}
組合
ユニオンデータ型は、フィールドに1つ以上のデータ型がある場合は常に使用されます。 JSON配列として表されます。 たとえば、フィールドがintまたはnullの場合、ユニオンは["int"、 "null"]として表されます。
例
以下は、共用体を使用したドキュメントの例です-
{
"type" : "record",
"namespace" : "finddevguides",
"name" : "empdetails ",
"fields" :
[
{ "name" : "experience", "type": ["int", "null"] }, { "name" : "age", "type": "int" }
]
}
一定
このデータ型は、バイナリデータの格納に使用できる固定サイズのフィールドを宣言するために使用されます。 属性としてフィールド名とデータがあります。 Nameはフィールドの名前を保持し、sizeはフィールドのサイズを保持します。
例
{ "type" : "fixed" , "name" : "bdata", "size" : 1048576}