Écraser les partitions spécifiques dans la méthode d'écriture spark dataframe

je veux écraser des partitions spécifiques au lieu de tout dans spark. Je suis en train d'essayer la commande suivante:

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

où df est dataframe ayant les données incrémentielles à écraser.

hdfs-base-chemin d'accès contient les données de base.

quand j'essaie la commande ci-dessus, elle supprime toutes les partitions, et insère celles présentes dans df au chemin HDFS.

ce que mon exigence est d'écraser seulement les partitions présentes dans df à la spécifiée hdfs chemin. Quelqu'un peut-il m'aider à cela?

23
demandé sur Prasad Khode 2016-07-20 21:00:37

8 réponses

C'est un problème commun. La seule solution avec Spark jusqu'à 2.0 est d'écrire directement dans le répertoire de partition, par exemple,

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

si vous utilisez Spark avant 2.0, vous devez empêcher Spark d'émettre des fichiers de métadonnées (parce qu'ils vont casser la découverte automatique de la partition) en utilisant:

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

Si vous utilisez Étincelle avant 1.6.2, vous devrez également supprimer le _SUCCESS fichier /root/path/to/data/partition_col=value ou sa présence cassera la découverte automatique des partitions. (Je il est fortement recommandé d'utiliser 1.6.2 ou plus.)

Vous pouvez obtenir un peu plus de détails sur la façon de gérer les grandes tables partitionnées de mon Étincelle Sommet de parler sur Boulots Pare-Balles.

23
répondu Sim 2016-07-25 20:15:38

enfin! C'est maintenant une fonctionnalité dans l'Étincelle 2.3.0: https://issues.apache.org/jira/browse/SPARK-20236

Pour l'utiliser, vous devez définir l'