2016-07-26 87 views
1

我有一個加載兩個Avro文件(都具有相同架構)的Spark作業(在CDH 5.5.1中),然後將它們組合起來製作一個DataFrame(也具有相同的架構),然後把它們寫回Avro。Spark在寫入Avro時會更改架構

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

這是用來結合現有的數據和幾個更新(因爲文件是不可變的)。然後我用HDFS中的新文件替換原來的文件。

但是,如果我重複更新過程(即嘗試向以前更新的文件添加一些更新的更新),則作業將失敗,因爲現在的模式不同!到底是怎麼回事?

回答

2

這是由於spark-avro包的行爲。

在寫入Avro時,spark-avro將所有類型的對象都寫爲null,

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

如果您的輸入模式已經只包含空字段,那麼這個問題就不會變得明顯。

這不是火花阿夫羅頁提到,但在某些Cloudera documentation被描述爲火花阿夫羅的侷限性之一:

由於火花是轉換數據類型,注意以下:

  • 枚舉類型擦除 - Avro的枚舉類型成爲字符串時,它們被讀入的Spark火花,因爲不支持 枚舉類型。
  • 輸出上的聯合 - Spark將所有類型的聯合以及null選項都寫入給定類型的聯合。
  • Avro模式更改 - Spark將所有內容都讀入內部表示。即使您只是讀取並寫入數據,輸出的 模式也會不同。
  • Spark模式重新排序 - Spark在將模式中的元素寫入磁盤時會重新排列其模式中的元素,以便 分區的元素是最後一個元素。

又見這個問題的GitHub(spark-avro 92