Pyspark: répartition vs partitionBy
Je suis en train de travailler à travers ces deux concepts dès maintenant et voudrais un peu de clarté. De travail par le biais de la ligne de commande, j'ai essayé d'identifier les différences et quand un développeur utilise répartition vs partitionBy.
Voici un exemple de code:
rdd = sc.parallelize([('a', 1), ('a', 2), ('b', 1), ('b', 3), ('c',1), ('ef',5)])
rdd1 = rdd.repartition(4)
rdd2 = rdd.partitionBy(4)
rdd1.glom().collect()
[[('b', 1), ('ef', 5)], [], [], [('a', 1), ('a', 2), ('b', 3), ('c', 1)]]
rdd2.glom().collect()
[[('a', 1), ('a', 2)], [], [('c', 1)], [('b', 1), ('b', 3), ('ef', 5)]]
J'ai pris un coup d'oeil à la mise en œuvre des deux, et la seule différence que j'ai remarqué pour la plupart, est que partitionBy peut prendre une fonction de partitionnement, ou à l'aide de la portable_hash par défaut. Ainsi, dans partitionBy, tous les mêmes clés doivent être dans la même partition. Dans la répartition, je m'attends à ce que les valeurs soient réparties plus uniformément sur les partitions, mais ce n'est pas le cas.
Compte tenu de cela, pourquoi serait-on jamais utiliser de répartition? Je suppose que le seul moment où je pouvais le voir utilisé est si je ne travaille pas avec PairRDD, ou j'ai des données à grande inclinaison?
Il y a une chose que je suis absent, ou quelqu'un pourrait jeter de la lumière à partir d'un angle différent pour moi?
OriginalL'auteur Joe Widen | 2015-11-20
Vous devez vous connecter pour publier un commentaire.
repartition
existe déjà dans Rdd, et ne gère pas le partitionnement par clé (ou par tout autre critère à l'exception de la Commande). Maintenant PairRDDs ajouter la notion de touches et par la suite ajouter une autre méthode qui permet de partition par cette touche.Donc oui, si vos données sont saisies, vous devez absolument partition par cette clé, qui dans de nombreux cas, est le point de l'utilisation d'un PairRDD en premier lieu (pour les jointures, reduceByKey, et ainsi de suite).
Bonne question, je suis en voir la même distribution lors de l'essayer (la Scala).
Rien d'autre qu'une simple probabilité.
repartition
est fait à l'aide de la paire de RDD en interne par l'ajout de clé aléatoire à valeurs existantes afin de ne pas fournir des garanties solides sur la sortie de la distribution de données. BTW, Vous devriez probablement accepter la réponse.En fait tous de repartitionnement dans la Spark est gérée à l'aide de la paire de Rdd. Si nécessaire Étincelle ajoute juste factice des clés ou des valeurs factices pour le faire fonctionner.
OriginalL'auteur Marius Soutier
repartition()
est utilisé pour spécifier le nombre de partitions de prendre en compte le nombre de cœurs et de la quantité de données que vous avez.partitionBy()
est utilisé pour la fabrication de brassage des fonctions plus efficaces, comme lareduceByKey()
,join()
,cogroup()
etc.. Il est bénéfique que dans les cas où un RDD est utilisé plusieurs fois, de sorte qu'il est généralement suivi parpersist()
.Différences entre les deux en action:
OriginalL'auteur Hui Guo