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.
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.
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