web-dev-qa-db-fra.com

Écraser uniquement certaines partitions dans un ensemble de données partitionné spark

Comment pouvons-nous écraser un ensemble de données partitionné, mais uniquement les partitions que nous allons modifier? Par exemple, recalculer le travail quotidien de la semaine dernière et écraser uniquement la semaine dernière des données.

Par défaut Spark consiste à écraser toute la table, même si seules certaines partitions vont être écrites.

15
Madhava Carrillo

Depuis Spark 2.3.0, il s'agit d'une option lors du remplacement d'une table. Pour la remplacer, vous devez définir la nouvelle spark.sql.sources.partitionOverwriteMode paramètre sur dynamic, l'ensemble de données doit être partitionné et le mode d'écriture overwrite. Exemple:

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

Je recommande de faire une répartition basée sur votre colonne de partition avant d'écrire, afin de ne pas vous retrouver avec 400 fichiers par dossier.

Avant Spark 2.3.0, la meilleure solution serait de lancer des instructions SQL pour supprimer ces partitions puis de les écrire avec le mode append.

36
Madhava Carrillo

Pour info, pour les utilisateurs de PySpark, assurez-vous de définir overwrite=True dans le insertInto sinon le mode serait changé en append

à partir du code source :

def insertInto(self, tableName, overwrite=False):
    self._jwrite.mode(
        "overwrite" if overwrite else "append"
    ).insertInto(tableName)

voici comment l'utiliser:

spark.conf.set("spark.sql.sources.partitionOverwriteMode","DYNAMIC")
data.write.insertInto("partitioned_table", overwrite=True)

ou dans la version SQL fonctionne très bien.

INSERT OVERWRITE TABLE [db_name.]table_name [PARTITION part_spec] select_statement

pour doc regardez ici

8
Ali Bey