Avro文件
Apache Avro是一個數據序列化係統。Avro提供:
豐富的數據結構。
一種緊湊、快速的二進製數據格式。
容器文件,用於存儲持久數據。
遠程過程調用(RPC)。
與動態語言的簡單集成。讀取或寫入數據文件或使用或實現RPC協議都不需要代碼生成。代碼生成作為可選的優化,隻值得為靜態類型語言實現。
的Avro數據源支持:
模式轉換:Apache Spark SQL和Avro記錄之間的自動轉換。
分區:無需任何額外配置,即可輕鬆讀寫分區數據。
壓縮:將Avro寫入磁盤時使用的壓縮。受支持的類型有
未壓縮的
,時髦的
,縮小
.您還可以指定泄氣級別。記錄名稱:通過傳遞參數的映射來記錄名稱和命名空間
recordName
而且recordNamespace
.
也看到讀寫流Avro數據.
配置
您可以使用各種配置參數更改Avro數據源的行為。
來忽略沒有.avro
擴展讀取時,可以設置參數avro.mapred.ignore.inputs.without.extension
在Hadoop配置。默認值是假
.
火花.sparkContext.hadoopConfiguration.集(“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
字段名是member0
,member1中
,等,按照會員的聯盟
.這與在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模式:
進口org.apache.avro.模式瓦爾模式=新模式.解析器()。解析(新文件(“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記錄:
進口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 /輸出”)
#從指定目錄創建數據幀df=火花.讀.格式(“avro”).負載(“/ tmp / episodes.avro”)保存讀入的Avro記錄的子集子集=df.在哪裏(“醫生> 5”)子集.寫.格式(“avro”).保存(“/ tmp /輸出”)
要在SQL中查詢Avro數據,請將數據文件注冊為表或臨時視圖:
創建臨時視圖集使用avro選項(路徑“/ tmp / episodes.avro”)選擇*從集