整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

4.4.1. Avro数据类型和模式

hadoop 花牛 7℃ 0评论

Avro定义了少量数据基本类型,它们可用于以写模式的方式来构建应用特定的数据结构。考虑到互操作性,其实现必须支持所有的Avro类型。

表4-9列举了 Avro的基本类型。每个基本类型还可以使用更冗长的形式和使用type属性来指定,示例如下:

{"type": "null"}

表4-9. Avro基本类型

类型

描述

模式示例

null

空值

"null"

boolean

二进制值

"boolean"

int

32位带符号整数

"int"

long

64位带符号整数

"long"

float

单精度(32位)IEEE 754浮点数

"float"

double

双精度(64位)IEEE 754浮点数

"double"

bytes

8位无符号字节序列

"bytes"

string

Unicode字符序列

"string"

表4-10列举了 Avro的复杂类型,并为每个类型给出模式示例。

表4-10. Avro复杂类型

类型

描述

模式示例

array

一个排过序的对象集合。特定数组中的所有对象必须模式相同

{

"type": "array",

"items" : "long"

}

map

未排过序的键/值对。键必须是字符串,值可以是任何类型,但一个特定map中所有值必须模式相同

{

"type": "map",

"values: "string"

}

record

一个任意类型的命名字段集合

{

"type":"record",

"name":"WeatherRecord",

"doc":"A weather reading.",

"fields":[

{"name": "year", "type": "int"},

{"name": "temperature", "type": "int"},

{"name".: "stationld", "type": "string"}

]

}

enum

一个命名的值集合

{

"type": "enum",

"name": "Cutlery",

"doc": "An eating utensil.",

"symbols": ["KNIFE", "FORK”, "SPOON"]

}

fixed

一组固定数量的8位无符号字节

{

"type": "fixed",

"name" : "MdSHash",

"size": 16

}

union

模式的并集。并集可用JSON数组表示,其中每个元素为一个模式。并集表示的数据必须与其其中一个模式相匹配

[

"null",

"string",

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

]

每个Avro语言API都包含该语言特定的Avro类型表示。例如,Avrodouble类型可以用CC++和Java语言的double类型,Pythonfloat类型以及Ruby的Float类型来表示。

而且,一种语言可能有多种表示或映射。所有的语言都支持动态映射,即 使运行前并不知道具体模式,也可以使用动态映射。对此,Java称为"通用"(generic)映射。

另外,JavaC++实现可以自动生成代码来表示符合某种Avro模式的数据。代码生成(code generationJava中称为“特殊映射”)能优化数据处理,如果读/写数据之前就有一个模式备份。那么,为用户代码生成的类和为通用代码生成的类相比,前者提供的API更贴近问题域。

Java拥有第三类映射,即自反映射(reflect mapping,将Avro类型映射到已有的Java类型)。它的速度比通用映射和特殊映射都慢,所以不推荐在新应用中使用。

表4-11列举了 Java的类型映射。如表所示,特殊映射和通用映射相同,除非有特别说明(同样的,自反映射与特殊映射也相同,除非特别说明)。特殊映射与通用映射仅在record, enum和fixed三个类型方面有区别,其他所有类型均有自动生成的类(类名由name属性和可选的namesapce属性决定)。

表4-11. Avro的Java类型映射

Avro类型

Java通用映射

Java特殊映射

Java自反映射

null

null类型

boolean

boolean

int

int

short或int

long

long

float

float

bytes

java.nio.bytebuffer

字节数组

string

org.apache.avro.util.utf8

java.lang.String

array

org.apache.avro.generic.GenericArray

数组或java.util.Collection

map

java.util.map

record

org.apache.avro.generic.genenicrecord

生成实现org.apache.avro.specific.Specific Record类的实现

具有零参数构造函数的任意用户类。继承了所有不传递的实例字段

enum

java.lang.string

生成]ava enum类型

任意]ava enum类型

fixed

org.apache.avro.generic.genericfixed

生成实现org.apache.avro.pecific.SpecificFixed的

org.apache.avro.generic.genericFixed

union

java.lang.Object

Avro string既可以通过Java String表示,也可以通过Avro Utf8 Java类型表示。之所以使用Utf8表示比较高效,是因为:Avro Utf8类型是易变的,单个Utf8实例可以重用,并对一系列值进行读/写操作。另外Java String在新建对象时进行UTF-8解码,但 Avro执行Utf8解码更晚一些,某些情况下这样做可以提高系统性能。

Utf8实现了 Java 的:java.lang.CharSequence 接口,该接口可以 与Java类库实现互操作。在其他情况下可能需要通过调用 toString()方法将Utf8实例转化成String对象。

Avro从1.6.0版本之后加入一个选项使Avro始终执行向String对 象的转换。有两个方法可以达到该目的。第一个方法是,将模式中的 avro. java, string属性设置成 String:

{ "type": "string", "avro.java.string": "String" }

另外一个方法是,对于一些特定的映射操作,你可以构建基于 String的get()和set()方法的类。如果使用Avro Maven插件,该功能可以通过将stringType属性设置成String来实现。

最后,请注意,Java自反映射始终使用了 Java的String对象,其 主要因素是Java的兼容性而非性能。

转载请注明:全栈大数据 » 4.4.1. Avro数据类型和模式

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址