Avro文件

Apache Avro是一个数据序列化系统。Avro提供:

  • 丰富的数据结构。

  • 紧凑、快速二进制数据格式。

  • 一个容器文件,存储持久数据。

  • 远程过程调用(RPC)。

  • 简单的集成动态语言。代码生成不需要读或写数据文件或使用或实现RPC协议。代码生成一个可选的优化,只值实现静态类型语言。

Avro数据源支持:

  • 模式转换:Apache火花之间自动转换的SQL和Avro记录。

  • 分区:容易阅读和写作分区数据没有任何额外的配置。

  • 压缩:压缩时使用写作Avro磁盘。支持的类型未压缩的,时髦的,缩小。您还可以指定抑制水平。

  • 名字:记录名称和名称空间通过传递参数的映射recordNamerecordNamespace

也看到读和写流Avro数据

配置

你可以改变的行为Avro数据源使用各种配置参数。

没有忽略文件.avro扩展阅读时,你可以设置参数avro.mapred.ignore.inputs.without.extension在Hadoop配置。默认值是

火花sparkContexthadoopConfiguration(“avro.mapred.ignore.inputs.without.extension”,“真正的”)

配置压缩写作时,设置以下属性:火花

  • 压缩编解码器:spark.sql.avro.compression.codec。支持的编解码器是时髦的缩小。默认的编码是时髦的

  • 如果压缩编解码器缩小你可以设置压缩级别:spark.sql.avro.deflate.level。默认级别1

集群中可以设置这些属性火花配置或者在运行时使用spark.conf.set ()。例如:

火花相依(“spark.sql.avro.compression.codec”,“缩小”)火花相依(“spark.sql.avro.deflate.level”,“5”)

砖运行时9.1 LTS以上,您可以更改默认的模式推理行为Avro通过提供mergeSchema选择当阅读文件。设置mergeSchema真正的将从一组Avro推断出一个模式文件的目标目录并将它们合并而不是推断从单个文件读取模式。

支持类型Avro - >火花SQL转换

该库支持阅读所有Avro类型。它使用以下从Avro类型映射到火花SQL类型:

Avro类型

火花SQL类型

布尔

BooleanType

int

IntegerType

LongType

浮动

FloatType

倍增式

字节

BinaryType

字符串

StringType

记录

StructType

枚举

StringType

数组

ArrayType

地图

MapType

固定

BinaryType

联盟

看到联盟类型

联盟类型

Avro数据源支持阅读联盟类型。Avro考虑以下三种类型联盟类型:

  • 联盟(int,长)映射到LongType

  • 联盟(浮动,双)映射到倍增式

  • 联盟,空),在那里的东西任何支持Avro类型。这个映射到相同的SQL类型的火花的东西,可以为空设置为真正的

所有其他的联盟类型是复杂类型。他们映射到StructType字段名称在哪里member0,member1中等等,符合的成员联盟。这是符合当Avro之间的转换和拼花的行为。

逻辑类型

Avro数据源支持阅读以下Avro逻辑类型:

Avro逻辑类型

Avro类型

火花SQL类型

日期

int

DateType

timestamp-millis

TimestampType

timestamp-micros

TimestampType

小数

固定

DecimalType

小数

字节

DecimalType

请注意

Avro数据源忽略文档、别名和其他属性出现在Avro文件。

支持类型的火花SQL - > Avro转换

该库支持写的火花Avro SQL类型。对于大多数类型,从火花类型映射到Avro类型很简单(例如IntegerType被转换为int);下面列出的一些特殊情况:

火花SQL类型

Avro类型

Avro逻辑类型

ByteType

int

ShortType

int

BinaryType

字节

DecimalType

固定

小数

TimestampType

timestamp-micros

DateType

int

日期

您还可以指定整个输出Avro模式选项avroSchema,所以火花SQL类型可以转换成其他Avro类型。下面的转换不是默认应用,需要用户指定Avro模式:

火花SQL类型

Avro类型

Avro逻辑类型

ByteType

固定

StringType

枚举

DecimalType

字节

小数

TimestampType

timestamp-millis

例子

这些示例使用episodes.avro文件。

/ / Avro记录转换为火花类型、过滤、和/ /然后写回Avro记录瓦尔df=火花格式(“avro”)。负载(“/ tmp / episodes.avro”)df过滤器(“医生> 5”)。格式(“avro”)。保存(“/ tmp /输出”)

这个示例演示了一个自定义Avro模式:

进口orgapacheavro模式瓦尔模式=模式解析器()。解析(文件(“episode.avsc”))火花格式(“avro”)选项(“avroSchema”,模式toString)负载(“/ tmp / episodes.avro”)显示()

这个例子演示了Avro压缩选项:

/ /配置使用缩小压缩火花相依(“spark.sql.avro.compression.codec”,“缩小”)火花相依(“spark.sql.avro.deflate.level”,“5”)瓦尔df=火花格式(“avro”)。负载(“/ tmp / episodes.avro”)/ /写出压缩Avro记录df格式(“avro”)。保存(“/ tmp /输出”)

这个例子演示了分区Avro记录:

进口orgapache火花sqlSparkSession瓦尔火花=SparkSession构建器()。(“本地”)。getOrCreate()瓦尔df=火花createDataFrame(Seq((2012年,8,“蝙蝠侠”,9.8),(2012年,8,“英雄”,8.7),(2012年,7,“机器人”,5.5),(2011年,7,“Git”,2.0)))。toDF(“年”,“月”,“标题”,“评级”)dftoDF格式(“avro”)。partitionBy(“年”,“月”)。保存(“/ tmp /输出”)

这个例子演示了记录名称和命名空间:

瓦尔df=火花格式(“avro”)。负载(“/ tmp / episodes.avro”)瓦尔的名字=“AvroTest”瓦尔名称空间=“org.foo”瓦尔参数=地图(“recordName”- >的名字,“recordNamespace”- >名称空间)df选项(参数)。格式(“avro”)。保存(“/ tmp /输出”)
#创建一个DataFrame从一个指定的目录df=火花格式(“avro”)负载(“/ tmp / episodes.avro”)#节省Avro记录读入的子集子集=df在哪里(“医生> 5”)子集格式(“avro”)保存(“/ tmp /输出”)

在SQL查询Avro数据,注册表文件作为数据或临时视图:

创建临时视图使用avro选项(路径“/ tmp / episodes.avro”)选择*

笔记本的例子:读写Avro文件

以下笔记本演示了如何读和写Avro文件。

Avro读写文件的笔记本

在新标签页打开笔记本