2016-07-26 7 views
1

2つのAvroファイル(同じスキーマを持つ)を読み込んでSparkジョブ(CDH 5.5.1)を作成し、それらを結合してDataFrameを作成しますそれらをAvroに書き戻します。Avroへの書き込み時にSparkがスキーマを変更する

ジョブは、2つの入力スキーマを明示的に比較して、それらが同じであることを確認します。

これは、ファイルが不変であるため、既存のデータといくつかの更新を結合するために使用されます。その後、元のファイルをHDFSで名前を変更して新しい結合ファイルに置き換えます。

ただし、更新プロセスを繰り返すと(つまり、以前に更新されたファイルにさらに更新を加えようとすると)、スキーマが異なるため、ジョブは失敗します。何が起こっている?

答えて

2

これはspark-avroパッケージの動作によるものです。

Avroに書き込むと、spark-avroはすべてを指定した型の共用体としてnullオプションとともに書き込みます。

つまり、"string"["string", "null"]となり、すべてのフィールドがnullableになります。

入力スキーマにすでにヌル可能フィールドしか含まれていない場合、この問題は明らかになりません。

これは、火花アブロページに記載されていませんが、いくつかのCloudera documentationで火花アブロの制限の一つとして記述されています

スパークは、データ型を変換しているので、以下を監視:

  • 列挙型は消去されている - スパークが 列挙型をサポートしていないため、彼らはスパークに読み込まれたときにアブロ列挙型は文字列になります。
  • 出力上の共用体 - Sparkはすべてを指定された型の共用体としてnullオプションと共に書き込みます。
  • Avroスキーマの変更 - Sparkはすべてを内部表現に変換します。データを読み込んだ後に書き込んだとしても、出力のスキーマは と異なります。
  • スパーク・スキーマの並べ替え - スパークは、ディスクに書き込むときにそのスキーマ内の要素の順序を変更し、 という要素が最後に配置されるようにします。

もこのgithubの問題を参照してください:(spark-avro 92

関連する問題