2016-04-04 7 views
4

Funktioniert flamMap in Spark wie die Kartenfunktion und verursacht daher kein Mischen oder löst einen Shuffle aus. Ich vermute, dass es schlurrt. Kann es jemand bestätigen?Verursacht eine flatMap im Funken einen Shuffle?

+2

Siehe http://stackoverflow.com/questions/26273664/what-are-the-spark-transformations-that-causes-a-shuffle –

Antwort

2

Es gibt kein Mischen mit Map oder FlatMap. Die Operationen, die Shuffle verursachen, sind:

  • Repartition Operationen:
    • Repartition:
    • Coalesce:
  • ByKey Operationen (mit Ausnahme Zählung):
    • GroupByKey:
    • ReduceByKey:
  • Join-Operationen:
    • Cogroup:
    • Registriert:

Obwohl die Menge der Elemente in jeder Partition neu gemischt Daten deterministisch sein, und so ist die Ordnung der Partitionen selbst, die Reihenfolge dieser Elemente ist nicht. Will man folgende Shuffle vorhersagbar Daten bestellt, dann ist es möglich, zu verwenden:

  • mapPartitions jede Partition zu sortieren verwenden, beispielsweise .sorted
  • repartitionAndSortWithinPartitions effizient Partitionen zu sortieren, während gleichzeitig
  • repartitioning
  • sortBy machen ein global RDD bestellt

Mehr Infos hier: http://spark.apache.org/docs/latest/programming-guide.html#shuffle-operations

+0

Die Antwort muss eine Korrektur- Coalesce doesnt produzieren ein Mischen. Es ist eine enge RSS-Abhängigkeit. – bigdatamann

3

Kein Mischen. Hier sind die Quellen für beide Funktionen:

/** 
* Return a new RDD by applying a function to all elements of this RDD. 
*/ 
def map[U: ClassTag](f: T => U): RDD[U] = withScope { 
    val cleanF = sc.clean(f) 
    new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF)) 
} 

/** 
* Return a new RDD by first applying a function to all elements of this 
* RDD, and then flattening the results. 
*/ 
def flatMap[U: ClassTag](f: T => TraversableOnce[U]): RDD[U] = withScope { 
    val cleanF = sc.clean(f) 
    new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.flatMap(cleanF)) 
} 

Wie Sie sehen können, RDD.flatMap nur ruft flatMap auf Scala Iterator, der Partition darstellt.