Avro文件
Apache Avro是一个数据序列化系统。Avro提供:
丰富的数据结构。
紧凑、快速二进制数据格式。
一个容器文件,存储持久数据。
远程过程调用(RPC)。
简单的集成动态语言。代码生成不需要读或写数据文件或使用或实现RPC协议。代码生成一个可选的优化,只值实现静态类型语言。
的Avro数据源支持:
模式转换:Apache火花之间自动转换的SQL和Avro记录。
分区:容易阅读和写作分区数据没有任何额外的配置。
压缩:压缩时使用写作Avro磁盘。支持的类型
未压缩的
,时髦的
,缩小
。您还可以指定抑制水平。名字:记录名称和名称空间通过传递参数的映射
recordName
和recordNamespace
。
也看到读和写流Avro数据。
配置
你可以改变的行为Avro数据源使用各种配置参数。
没有忽略文件.avro
扩展阅读时,你可以设置参数avro.mapred.ignore.inputs.without.extension
在Hadoop配置。默认值是假
。
火花。sparkContext。hadoopConfiguration。集(“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模式:
进口org。apache。avro。模式瓦尔模式=新模式。解析器()。解析(新文件(“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记录:
进口org。apache。火花。sql。SparkSession瓦尔火花=SparkSession。构建器()。主(“本地”)。getOrCreate()瓦尔df=火花。createDataFrame(Seq((2012年,8,“蝙蝠侠”,9.8),(2012年,8,“英雄”,8.7),(2012年,7,“机器人”,5.5),(2011年,7,“Git”,2.0)))。toDF(“年”,“月”,“标题”,“评级”)df。toDF。写。格式(“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”)选择*从集