web-dev-qa-db-ja.com

パーティション化されたspark= Datasetの一部のパーティションのみを上書きする

パーティション分割されたデータセットを上書きすることはできますが、変更するパーティションのみを上書きできますか?たとえば、先週の毎日のジョブを再計算し、先週のデータのみを上書きします。

デフォルトSpark動作は、一部のパーティションのみが書き込まれる場合でも、テーブル全体を上書きします。

15

Spark 2.3.0であるため、これはテーブルを上書きするときのオプションです。上書きするには、新しいspark.sql.sources.partitionOverwriteModedynamicに設定し、データセットを分割する必要があり、書き込みモードoverwrite。例:

spark.conf.set(
  "spark.sql.sources.partitionOverwriteMode", "dynamic"
)
data.write.mode("overwrite").insertInto("partitioned_table")

書き込む前にパーティション列に基づいてパーティションを再作成することをお勧めします。そうすれば、フォルダーごとに400個のファイルが作成されることはありません。

Spark 2.3.0の前に、最良の解決策は、SQLステートメントを起動してこれらのパーティションを削除し、モード追加で書き込みます。

36

参考までに、PySparkユーザーの場合は、必ずoverwrite=TrueinsertIntoを使用しない場合、モードは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

ドキュメントについてはこちらをご覧ください

8
Ali Bey