Avro文件

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

  • 豐富的數據結構。

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

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

  • 遠程過程調用(RPC)。

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

Avro數據源支持:

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

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

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

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

也看到讀寫流Avro數據

配置

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

來忽略沒有.avro擴展讀時,可以設置參數avro.mapred.ignore.inputs.without.extensionHadoop配置。默認為

火花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文件中推斷出一個模式並合並它們,而不是從單個文件中推斷read模式。

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

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

Avro類型

Spark 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類型

Spark SQL類型

日期

int

DateType

timestamp-millis

TimestampType

timestamp-micros

TimestampType

小數

固定

DecimalType

小數

字節

DecimalType

請注意

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

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

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

Spark SQL類型

Avro類型

Avro邏輯類型

ByteType

int

ShortType

int

BinaryType

字節

DecimalType

固定

小數

TimestampType

timestamp-micros

DateType

int

日期

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

Spark 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文件筆記本

在新標簽頁打開筆記本