2016-07-24 20 views
1
from pyspark import SparkContext 

sc = SparkContext() 

rdd1 = sc.parallelize([('a', 1), ('b', 2), ('c', 3), ('d', 4)], numSlices=8) 
rdd2 = rdd1.mapValues(lambda x: x) 

Diese RDDs haben die gleiche Aufteilung:PySpark beitreten schlurft Co-partitioniert RDDs

rdd1.keys().glom().collect() 
>>> [[], ['a'], [], ['b'], [], ['c'], [], ['d']] 

rdd2.keys().glom().collect() 
>>> [[], ['a'], [], ['b'], [], ['c'], [], ['d']] 

ist es hier mehrere Antworten auf SO, die darauf hinweisen, dass die Zusammenarbeit partitionierten Datenverbindungs ​​keinen Shuffle verursachen, die eine macht Viel Sinn für mich. Beispiel: Does a join of co-partitioned RDDs cause a shuffle in Apache Spark?

Allerdings, wenn ich diese Zusammenarbeit partitioniert RDDs mit PySpark verbinden, werden die Daten in eine neue Partition neu gemischt:

rdd1.join(rdd2).keys().glom().collect() 
>>> [['a'], [], ['c'], ['b'], [], ['d'], [], [], [], [], [], [], [], [], [], []] 

Und die Aufteilung ändert, selbst wenn ich die Anzahl der neuen Partitionen auf das Original 8:

rdd1.join(rdd2, numPartitions=8).keys().glom().collect() 
>>> [['a'], [], ['c'], ['b'], [], ['d'], [], []] 

Wie kann ich nicht vermeiden, ein Mischen mit diesen co-partitioned RDDs?

Ich benutze Spark 1.6.0.

Antwort

3

In diesem Fall weder rdd1 noch rdd2 partitioniert ist

rdd1 = sc.parallelize([('a', 1), ('b', 2), ('c', 3), ('d', 4)]) 
rdd2 = rdd1.mapValues(lambda x: x) 

rdd1.partitioner is None 
## True 

rdd2.partitioner is None 
# True 

so per Definition gibt es nicht nebeneinander aufgeteilt. Während Sie Daten partitionieren und verbinden könnten:

würde dies einfach DAG neu anordnen und shuffle nicht verhindern.

Siehe Default Partitioning Scheme in Spark

+0

Danke auch, könnte dies nur das Problem lösen Ich bin vor. Ich bin jedoch überrascht, dass die Einstellungen "numSlices" keine explizite Partitionierung impliziert. (Ich denke jetzt verstehe ich, warum es nicht 'numPartitions' heißt, wie in anderen Funktionen.) –

+2

Wenn wir über Partitionen in Spark sprechen, meinen wir zwei verschiedene Konzepte. Sie können meine Antwort zu http://stackoverflow.com/q/34491219/1560062 für einige Erklärung überprüfen. – zero323