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”)選擇*從集