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讀寫文件的筆記本

在新標簽頁打開筆記本