1. ホーム
  2. apache-spark

[解決済み] spark dataframeの書き込みメソッドで特定のパーティションを上書きする

2023-02-27 22:14:34

質問

spark ですべてではなく、特定のパーティションを上書きしたいのです。以下のコマンドを試しています。

df.write.orc('maprfs:///hdfs-base-path','overwrite',partitionBy='col4')

ここで、dfは上書きされるインクリメンタルデータを持つデータフレームです。

hdfs-base-pathにはマスターデータが格納されています。

上記のコマンドを試すと、すべてのパーティションが削除され、dfに存在するパーティションがhdfsパスに挿入されます。

私の要件は、指定された hdfs パスの df に存在するパーティションのみを上書きすることです。どなたか、この件で私を助けていただけませんか。

どのように解決するのですか?

これはよくある問題です。2.0までのSparkでは、パーティションディレクトリに直接書き込むことで、唯一の解決策となります(例)。

df.write.mode(SaveMode.Overwrite).save("/root/path/to/data/partition_col=value")

2.0より前のSparkを使用している場合、Sparkがメタデータファイルを出力しないようにする必要があります(自動パーティション発見ができなくなるため)。

sc.hadoopConfiguration.set("parquet.enable.summary-metadata", "false")

1.6.2以前のSparkを使っている場合は _SUCCESS のファイルを削除する必要があります。 /root/path/to/data/partition_col=value ファイルがないと、パーティションの自動検出ができなくなります。(1.6.2 以降を使用することを強くお勧めします)。

大規模なパーティショニングされたテーブルを管理する方法について、私の Spark Summit での講演でもう少し詳しく知ることができます。 防弾ジョブ .