2017-03-05 23 views
4

私はこの奇妙なエラーが発生しました。私は、データフレームが存在する場合(またはそうでない場合はそれを作成する)データフレームを読み込んで変更し、それを同じターゲットパスに「重ね書き」モードで並べ替える形式で保存します。最初の実行でDataFrameをparquetフォーマットに保存しようとしたときに '上書き'モードを使用すると、

何のデータフレームがない場合、私は1つを作成し、それを保存します。これは、出力フォルダに4つのファイルを生成:

  • _SUCCESS.crcを
  • 一部-R- < .....> snappy.parquet.crc
  • _SUCCESS
  • 一部-R- <。 .....>。その後

をsnappy.parquet、セカンドランで、私はそれを修正し、データフレームを読んで、私はそれを上書きしようとすると、それは*part-r-<.....>.snappy.parquet file does not exist*という例外がスローされます。例外が発生したときに

出力フォルダは空ですが、df.write.parquet(path, 'overwrite')の実行前にフォルダには、このファイルが含まれています。

私は「偽」にspark.sql.cacheMetadataを設定しようとしましたが、それは助けにはなりませんでした。 spark.catalog.listTables()は空のリストを返すので、何も更新する必要はありません。

は今のところ、私は単純に出力フォルダの項目を削除し、データフレームを作成します。できます。しかし、なぜ元のメソッドが '上書き'モードで失敗するのですか?

ありがとうございました。

+0

物理プランを作成したあとにsavemodeを適用すると問題が発生するsparkディレクトリを削除すると、savemodeを追加することができます –

+0

sparkからs3に書き込んでいるときにappendも同じ問題と保存モードに直面しています – braj259

答えて

1

RDDは変数のようなデータを保持していません。アクションが呼び出されたときに、データを取得する方法(getPartition)とそのデータを変換(計算)する方法を知っているデータ構造です。

ですから、ここでやっていることで、

1回目=> ... =>パスに保存
2回目以降=>読み取りパスから =>いくつかの変換を行います= >上書きモードではパスA

に保存は今、あなたの実際のアクションがパスに保存で、注意してください。 SparkはDAGを作成します.DAGはデータの検索場所(パスAに保存)、変換方法、保存場所/表示場所を知るためのものです。

しかし、あなたは、すでに空いているそのパスを読み取ろうと、最初のパスを削除するには、追加することの実行計画でモードオーバーライド、スパークを選択しているよう。

ので、回避策として、パーティションごとのようにどちらかの別のフォルダにそれらを保存することができ、または次の2つのパス1つの宛先と1 tmpに保存することができます。

df.cache() 

あなたはHDFSからそれを読ん直後 - ここで行うには

+0

同じ問題に直面している。私がしたことは、それを一時的な場所に書き込んだ後、そこから読んでメインの場所に書き込むことです。それでも失敗します。何かご意見は ?前もって感謝します。 – braj259

1

もう一つは、それをキャッシュすることです。

関連する問題