📅  最后修改于: 2020-12-02 05:25:26             🧑  作者: Mango
Avro是基于模式的序列化实用程序,接受模式作为输入。尽管有各种可用的架构,但Avro遵循其自己的定义架构标准。这些模式描述了以下细节-
使用这些架构,您可以使用更少的空间以二进制格式存储序列化的值。这些值存储时没有任何元数据。
Avro模式以JavaScript Object Notation(JSON)文档格式创建,这是一种轻量级的基于文本的数据交换格式。它是通过以下方式之一创建的-
示例-以下示例显示一个模式,该模式在名称空间Tutorialspoint下以名称Employee定义了一个文档,该字段具有名称和年龄。
{
"type" : "record",
"namespace" : "Tutorialspoint",
"name" : "Employee",
"fields" : [
{ "name" : "Name" , "type" : "string" },
{ "name" : "Age" , "type" : "int" }
]
}
在此示例中,您可以观察到每个记录有四个字段-
类型-此字段位于文档以及名为字段的字段下。
对于文档,它显示文档的类型,通常是一条记录,因为有多个字段。
如果是字段,则类型描述数据类型。
namespace-此字段描述对象所在的名称空间的名称。
名称-此字段位于文档下方以及名为字段的字段下方。
如果是文档,则描述架构名称。此架构名称与名称空间一起唯一标识存储中的架构( Namespace.schema name )。在上面的示例中,架构的全名将为Tutorialspoint.Employee。
对于字段,它描述了字段的名称。
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中的记录数据类型是多个属性的集合。它支持以下属性-
name-该字段的值保存记录的名称。
namespace-该字段的值保存存储对象的名称空间的名称。
type-该属性的值保存文档(记录)的类型或架构中字段的数据类型。
字段-此字段包含一个JSON数组,其中包含模式中所有字段的列表,每个字段都有名称和类型属性。
例
下面给出的是记录示例。
{
" type " : "record",
" namespace " : "Tutorialspoint",
" name " : "Employee",
" fields " : [
{ "name" : " Name" , "type" : "string" },
{ "name" : "age" , "type" : "int" }
]
}
枚举是集合中项目的列表,Avro枚举支持以下属性-
name-此字段的值保存枚举的名称。
名称空间-该字段的值包含限定枚举名称的字符串。
符号-该字段的值将枚举的符号保存为名称数组。
例
下面给出的是枚举的示例。
{
"type" : "enum",
"name" : "Numbers",
"namespace": "data",
"symbols" : [ "ONE", "TWO", "THREE", "FOUR" ]
}
此数据类型定义具有单个属性项的数组字段。此items属性指定数组中项目的类型。
例
{ " type " : " array ", " items " : " int " }
map数据类型是键值对的数组,它将数据组织为键值对。 Avro映射的密钥必须是字符串。映射的值保存映射内容的数据类型。
例
{"type" : "map", "values" : "int"}
只要字段具有一个或多个数据类型,就使用联合数据类型。它们表示为JSON数组。例如,如果字段可以是int或null,则联合表示为[“ int”,“ null”]。
例
下面给出的是使用联合的示例文档-
{
"type" : "record",
"namespace" : "tutorialspoint",
"name" : "empdetails ",
"fields" :
[
{ "name" : "experience", "type": ["int", "null"] }, { "name" : "age", "type": "int" }
]
}
此数据类型用于声明一个固定大小的字段,该字段可用于存储二进制数据。它具有字段名称和数据作为属性。名称保留字段的名称,大小保留字段的大小。
例
{ "type" : "fixed" , "name" : "bdata", "size" : 1048576}