Avro文件

Apache Avro是一個數據序列化係統。Avro提供:

  • 豐富的數據結構。

  • 一種緊湊、快速的二進製數據格式。

  • 容器文件,用於存儲持久數據。

  • 遠程過程調用(RPC)。

  • 與動態語言的簡單集成。讀取或寫入數據文件或使用或實現RPC協議都不需要代碼生成。代碼生成作為可選的優化,隻值得為靜態類型語言實現。

Avro數據源支持:

  • 模式轉換:Apache Spark SQL和Avro記錄之間的自動轉換。

  • 分區:無需任何額外配置,即可輕鬆讀寫分區數據。

  • 壓縮:將Avro寫入磁盤時使用的壓縮。受支持的類型有未壓縮的時髦的,縮小.您還可以指定泄氣級別。

  • 記錄名稱:通過傳遞參數的映射來記錄名稱和命名空間recordName而且recordNamespace

也看到讀寫流Avro數據

配置

您可以使用各種配置參數更改Avro數據源的行為。

來忽略沒有.avro擴展讀取時,可以設置參數avro.mapred.ignore.inputs.without.extension在Hadoop配置。默認值是

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

要在寫入時配置壓縮,需要設置以下Spark屬性:

  • 壓縮編解碼器: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”

Databricks Runtime 9.1 LTS,您可以在Avro中通過提供mergeSchema選項在讀取文件時。設置mergeSchema真正的將從目標目錄中的一組Avro文件中推斷模式並合並它們,而不是從單個文件中推斷讀取模式。

支持Avro -> Spark SQL轉換的類型

這個庫支持讀取所有Avro類型。它使用以下從Avro類型到Spark SQL類型的映射:

Avro類型

火花SQL類型

布爾

BooleanType

int

IntegerType

LongType

浮動

FloatType

倍增式

字節

BinaryType

字符串

StringType

記錄

StructType

枚舉

StringType

數組

ArrayType

地圖

MapType

固定

BinaryType

聯盟

看到聯盟類型

聯盟類型

Avro數據源支持讀取聯盟類型。Avro認為以下三種類型是聯盟類型:

  • 聯盟(int,長)映射到LongType

  • 聯盟(浮動,雙)映射到倍增式

  • 聯盟,空),在那裏某物是任何支持的Avro類型。映射到與的相同的Spark SQL類型某物,可以為空設置為真正的

所有其他的聯盟類型是複雜類型。他們映射到StructType字段名是member0member1中,等,按照會員的聯盟.這與在Avro和Parquet之間轉換時的行為一致。

邏輯類型

Avro數據源支持讀取以下內容Avro邏輯類型

Avro邏輯類型

Avro類型

火花SQL類型

日期

int

DateType

timestamp-millis

TimestampType

timestamp-micros

TimestampType

小數

固定

DecimalType

小數

字節

DecimalType

請注意

Avro數據源忽略文檔、別名和Avro文件中的其他屬性。

支持的類型為Spark SQL -> Avro轉換

該庫支持將所有Spark SQL類型寫入Avro。對於大多數類型,從Spark類型到Avro類型的映射非常簡單(例如IntegerType被轉換為int);以下是一些特殊情況:

火花SQL類型

Avro類型

Avro邏輯類型

ByteType

int

ShortType

int

BinaryType

字節

DecimalType

固定

小數

TimestampType

timestamp-micros

DateType

int

日期

您還可以使用該選項指定整個Avro輸出模式avroSchema,以便Spark SQL類型可以轉換為其他Avro類型。以下轉換默認情況下不應用,需要用戶指定的Avro模式:

火花SQL類型

Avro類型

Avro邏輯類型

ByteType

固定

StringType

枚舉

DecimalType

字節

小數

TimestampType

timestamp-millis

例子

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

// Avro記錄被轉換為Spark類型,過濾和//然後寫回來作為Avro記錄瓦爾df火花格式“avro”).負載“/ tmp / episodes.avro”df過濾器“醫生> 5”).格式“avro”).保存“/ tmp /輸出”

這個例子演示了一個自定義Avro模式:

進口orgapacheavro模式瓦爾模式模式解析器()。解析文件“episode.avsc”))火花格式“avro”選項“avroSchema”模式toString負載“/ tmp / episodes.avro”顯示()

這個例子演示了Avro壓縮選項:

//配置使用deflate壓縮火花相依“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火花createDataFrameSeq20128“蝙蝠俠”9.8),20128“英雄”8.7),20127“機器人”5.5),20117“Git”2.0))).toDF“年”“月”“標題”“評級”dftoDF格式“avro”).partitionBy“年”“月”).保存“/ tmp /輸出”

這個例子演示了記錄的名稱和命名空間:

瓦爾df火花格式“avro”).負載“/ tmp / episodes.avro”瓦爾的名字“AvroTest”瓦爾名稱空間“org.foo”瓦爾參數地圖“recordName”->的名字“recordNamespace”->名稱空間df選項參數).格式“avro”).保存“/ tmp /輸出”
#從指定目錄創建數據幀df火花格式“avro”負載“/ tmp / episodes.avro”保存讀入的Avro記錄的子集子集df在哪裏“醫生> 5”子集格式“avro”保存“/ tmp /輸出”

要在SQL中查詢Avro數據,請將數據文件注冊為表或臨時視圖:

創建臨時視圖使用avro選項路徑“/ tmp / episodes.avro”選擇

筆記本

下麵的筆記本演示了如何讀取和寫入Avro文件。

讀寫Avro文件筆記本