web-dev-qa-db-ja.com

Spark save(write)parquet 1つのファイルのみ

私が書いたら

dataFrame.write.format("parquet").mode("append").save("temp.parquet")

temp.parquetフォルダーで、行番号と同じファイル番号を取得しました

私は寄木細工について完全に理解していないと思いますが、それは自然ですか?

8
Easyhyum

coalesce beforewrite操作を使用します

dataFrame.coalesce(1).write.format("parquet").mode("append").save("temp.parquet")


EDIT-1

よく見ると、 docscoalesceについて警告しています

ただし、抜本的な合体を行っている場合は、 numPartitions = 1に変更すると、計算が必要なノードよりも少ないノードで行われる可能性があります(たとえば、numPartitions = 1の場合は1つのノード)

したがって、 @ Amar のように、 repartition を使用することをお勧めします

5
y2k-shubham

以前の回答は正しいものですが、単一パーティションへの再パーティション化または合体後に生じる影響を理解する必要があります。すべてのデータは、すぐに単一のファイルに書き込むために、単一のワーカーに転送する必要があります。

インターネット全体で繰り返し言及されているように、実行計画に追加されるシャッフルステップにもかかわらず、このシナリオではrepartitionを使用する必要があります。このステップは、ファイルを順番にマージする代わりに、クラスターのパワーを使用するのに役立ちます。

言及する価値のある代替案が少なくとも1つあります。すべてのファイルを単一のファイルにマージする簡単なスクリプトを作成できます。そうすれば、クラスターの単一ノードへの大量のネットワークトラフィックを生成することを回避できます。

2
bottaio

パーティションを1に設定して、単一ファイルとして保存できます

dataFrame.write.repartitions(1).format("parquet").mode("append").save("temp.parquet")
0
Amar