2017-01-13 3 views
1

Ich habe eine bestellte RDD des Typs ((id, ts), some value). Dies wurde nur mit einem benutzerdefinierten Partitionierer im Feld id partitioniert.Running groupByKey/reduceBuKey für partitionierte Daten, aber mit anderen Schlüssel

math.abs(id.hashCode % numPartitions) 

Jetzt Wenn ich laufen die folgenden zwei Funktionen auf dieser partitionierten RDD, wird es Schlurfen und Neuaufteilung des Datensatzes beinhalten.

val partitionedRDD: ((id:Long, ts:Long), val:String) = <Some Function> 
val flatRDD = orderedRDD.map(_ => (_._1.id, (_._1.ts, _._2))) 

Was ich will, ist wissen, ob flatRDD.groupByKey() und flatRDD.reduceByKey() die gleiche Aufteilung wie die partitionedRDD oder Funken haben den Datensatz wieder und schaffen neue Partitionen mischen?

Danke, Devi

Antwort

1

Ja, unbedingt groupByKey oder reduceByKey auf flatRDD Ausführung eine andere Shuffle verursachen.

Da Sie wissen, dass Ihr flatRDD bereits durch id partitioniert ist, können Sie sicher davon ausgehen, dass alle Datensätze mit demselben id auf einer einzigen Partition liegen. Deshalb, wenn Sie auf groupBy(id) möchten, können Sie mapPartitions (mit preservesPartitioning = true) verwenden und auf jeder Partition separat diese Operation durchführen, so dass Funken zu verhindern, dass Ihre Daten schlurfenden:

flatRDD.mapPartitions({ it => 
    it.toList 
    .groupBy(_._1).mapValues(_.size) // some grouping + reducing the result 
    .iterator 

}, preservesPartitioning = true) 

Dies wird keine zusätzliche Shuffle verursachen:

Verwandte Themen