簡體   English   中英

寫入Avro時Spark會更改架構

[英]Spark changes the schema when writing to Avro

我有一個Spark作業(在CDH 5.5.1中),該作業加載兩個Avro文件(都具有相同的架構),將它們組合成一個DataFrame(也具有相同的架構),然后將它們寫回到Avro。

作業將顯式比較兩個輸入模式以確保它們相同。

這用於結合一些更新的現有數據(因為文件是不可變的)。 然后,我通過在HDFS中重命名它們,將它們替換為新的合並文件。

但是,如果我重復更新過程(即嘗試向以前更新的文件中添加一些其他更新),則作業將失敗,因為現在的架構有所不同! 到底是怎么回事?

這是由於行為火花Avro的包。

寫入Avro時,spark-avro將所有內容寫入給定類型的並集以及null選項。

換句話說, "string"變成["string", "null"]因此每個字段都可以為空。

如果您的輸入架構已經僅包含可為空的字段,則此問題不會變得明顯。

spark-avro頁面上未提到這一點,但是在某些Cloudera文檔中將其描述為spark-avro的限制之一:

因為Spark正在轉換數據類型,所以請注意以下幾點:

  • 枚舉類型被擦除-將Avro枚舉類型讀入Spark時會變成字符串,因為Spark不支持枚舉類型。
  • 輸出上的並集-Spark將所有內容都寫為給定類型的並集以及null選項。
  • Avro模式更改-Spark將所有內容讀入內部表示形式。 即使您只是讀取然后寫入數據,輸出的架構也會有所不同。
  • Spark模式重新排序-Spark將其模式中的元素寫入磁盤時對其進行重新排序,以便在其上進行分區的元素是最后一個元素。

另請參見此 github問題:( spark-avro 92

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM