AVRO 模式


Avro 是一个基于模式的序列化实用程序,接受模式作为输入。尽管有各种可用的模式,Avro 还是遵循自己的模式定义标准。这些模式描述了以下细节:

  • 文件类型(默认记录)
  • 记录位置
  • 记录名称
  • 记录中的字段及其对应的数据类型

使用这些模式,你可以使用更少的空间以二进制格式存储序列化值。这些值在没有任何元数据的情况下存储。

创建 Avro 模式


Avro 模式以 JavaScript Object Notation (JSON) 文档格式创建,这是一种基于文本的轻量级数据交换格式。它是通过以下方式之一创建的:

  • 一个 JSON 字符串
  • 一个 JSON 对象
  • 一个 JSON 数组

例子 : 下面的例子显示了一个模式,它定义了一个文档,在命名空间 Newbiego 下,名字为 Employee,有字段 name 和 age。

{
    "type" : "record",
    "namespace" : "Newbiego",
    "name" : "Employee",
    "fields" : [
        { "name" : "Name" , "type" : "string" },
        { "name" : "Age" , "type" : "int" }
    ]
}

在这个例子中,可以观察到每条记录有四个字段:

  • type : 该字段位于文档下以及字段命名字段下。

    • 如果是文档,则显示文档的类型,通常是一条记录,因为有多个字段。

    • 当它是字段时,类型描述数据类型。

  • 命名空间 :该字段描述了对象所在的命名空间的名称。

  • name : 该字段位于文档下以及字段命名字段下。

    • 在文档的情况下,它描述了模式名称。此模式名称与命名空间一起唯一标识存储中的模式 ( Namespace.schema 名称 )。在上面的示例中,模式的全名将是 Newbiego.Employee。

    • 在字段的情况下,它描述了字段的名称。

Avro 的原始数据类型


Avro 模式具有原始数据类型和复杂数据类型。下表描述了 原始数据类型 of Avro:

数据类型 描述
null Null 是没有值的类型。
int 32 位有符号整数。
long 64 位有符号整数。
float 单精度(32 位)IEEE 754 浮点数。
double 双精度(64 位)IEEE 754 浮点数。
bytes 8 位无符号字节序列。
string Unicode 字符序列。

Avro 的复杂数据类型


除了原始数据类型,Avro 还提供了六种复杂的数据类型,即 Records、Enums、Arrays、Maps、Union 和 Fixed。

Record

Avro 中的记录数据类型是多个属性的集合。它支持以下 属性:

  • name :该字段的值保存了记录的名称。

  • 命名空间 :该字段的值保存了命名空间的名称。 对象被存储。

  • type :这个属性的值要么保存文档(记录)的类型,要么保存schema中字段的数据类型。

  • fields : 该字段包含一个 JSON 数组,其中包含模式中所有字段的列表,每个字段都有名称和类型属性。

例子

下面给出了一个记录的例子。

{
" type " : "record",
" namespace " : "Newbiego",
" name " : "Employee",
" fields " : [
 { "name" : " Name" , "type" : "string" },
 { "name" : "age" , "type" : "int" }
 ]
}

Enum

枚举是集合中项目的列表,Avro 枚举支持以下属性:

  • name :该字段的值保存了枚举的名称。

  • 命名空间 :该字段的值包含限定枚举名称的字符串。

  • symbols :该字段的值将枚举的符号保存为名称数组。

例子

下面给出了枚举的示例。

{
    "type" : "enum",
    "name" : "Numbers",
    "namespace": "data",
    "symbols" : [ "ONE", "TWO", "THREE", "FOUR" ]
}

Arrays

此数据类型定义具有单个属性项的数组字段。此 items 属性指定数组中项目的类型。

例子

{ " type " : " array ", " items " : " int " }

Maps

map 数据类型是一个键值对数组,它将数据组织为键值对。这 Avro 映射的键必须是字符串。地图的值保存地图内容的数据类型。

例子

{"type" : "map", "values" : "int"}

Unions

只要字段具有一种或多种数据类型,就会使用联合数据类型。它们表示为 JSON 数组。例如,如果一个字段可以是 int 或 null,则联合表示为 ["int", "null"]。

例子

下面给出了一个使用 unions 的示例文档:

{ 
    "type" : "record",
    "namespace" : "newbiego",
    "name" : "empdetails ",
    "fields" :
    [
        { "name" : "experience", "type": ["int", "null"] }, { "name" : "age", "type": "int" }
    ]
}

Fixed

此数据类型用于声明可用于存储二进制数据的固定大小的字段。它具有字段名称和数据作为属性。 Name 保存字段的名称,size 保存字段的大小。

例子

{ "type" : "fixed" , "name" : "bdata", "size" : 1048576}