web-dev-qa-db-fra.com

Spark enregistrer (écrire) parquet un seul fichier

si j'écris

dataFrame.write.format("parquet").mode("append").save("temp.parquet")

dans le dossier temp.parquet j'ai les mêmes numéros de fichier que les numéros de ligne

je pense que je ne comprends pas bien le parquet mais est-ce naturel?

8
Easyhyum

Utiliser coalesce avant écrire opération

dataFrame.coalesce(1).write.format("parquet").mode("append").save("temp.parquet")


EDIT-1

En y regardant de plus près, les docs mettent en garde contre coalesce

Cependant, si vous faites une fusion radicale, par exemple à numPartitions = 1, cela peut entraîner le calcul sur moins de nœuds que vous le souhaitez (par exemple, un nœud dans le cas de numPartitions = 1)

Par conséquent, comme suggéré par @ Amar , il est préférable d'utiliser repartition

5
y2k-shubham

Bien que les réponses précédentes soient correctes, vous devez comprendre les répercussions qui surviennent après le repartitionnement ou la fusion vers une seule partition. Toutes vos données devront être transférées à un seul travailleur juste pour les écrire immédiatement dans un seul fichier.

Comme il est mentionné à plusieurs reprises sur Internet, vous devez utiliser repartition dans ce scénario malgré l'étape de lecture aléatoire qui est ajoutée au plan d'exécution. Cette étape permet d'utiliser la puissance de votre cluster au lieu de fusionner séquentiellement des fichiers.

Il y a au moins une alternative à mentionner. Vous pouvez écrire un script simple qui fusionnerait tous les fichiers en un seul. De cette façon, vous éviterez de générer un trafic réseau massif vers un seul nœud de votre cluster.

2
bottaio

Vous pouvez définir des partitions comme 1 pour enregistrer en tant que fichier unique

dataFrame.write.repartitions(1).format("parquet").mode("append").save("temp.parquet")
0
Amar