パーティション分割されたデータセットを上書きすることはできますが、変更するパーティションのみを上書きできますか?たとえば、先週の毎日のジョブを再計算し、先週のデータのみを上書きします。
デフォルトSpark動作は、一部のパーティションのみが書き込まれる場合でも、テーブル全体を上書きします。
Spark 2.3.0であるため、これはテーブルを上書きするときのオプションです。上書きするには、新しいspark.sql.sources.partitionOverwriteMode
をdynamic
に設定し、データセットを分割する必要があり、書き込みモードoverwrite
。例:
spark.conf.set(
"spark.sql.sources.partitionOverwriteMode", "dynamic"
)
data.write.mode("overwrite").insertInto("partitioned_table")
書き込む前にパーティション列に基づいてパーティションを再作成することをお勧めします。そうすれば、フォルダーごとに400個のファイルが作成されることはありません。
Spark 2.3.0の前に、最良の解決策は、SQLステートメントを起動してこれらのパーティションを削除し、モード追加で書き込みます。
参考までに、PySparkユーザーの場合は、必ずoverwrite=True
でinsertInto
を使用しない場合、モードはappend
に変更されます。
ソースコード から:
def insertInto(self, tableName, overwrite=False):
self._jwrite.mode(
"overwrite" if overwrite else "append"
).insertInto(tableName)
この使用方法:
spark.conf.set("spark.sql.sources.partitionOverwriteMode","DYNAMIC")
data.write.insertInto("partitioned_table", overwrite=True)
または、SQLバージョンでは正常に動作します。
INSERT OVERWRITE TABLE [db_name.]table_name [PARTITION part_spec] select_statement