2016-10-31 1 views
1

In Java Spark konnte ich entweder keyBy() oder mapToPair() verwenden, um einen Schlüssel für eine JavaRDD zu erstellen. Die Verwendung von keyBy() macht meine Absichten klarer und verwendet eine Argumentfunktion mit etwas weniger Code (die Funktion gibt einen Schlüssel und kein Tupel zurück). Gibt es jedoch eine Leistungsverbesserung bei der Verwendung von keyBy() gegenüber mapToPair()?Spark: keyBy() vs mapToPair()

Dank

Antwort

3

Sie können den Unterschied in der Quelle sehen:

def mapToPair[K2, V2](f: PairFunction[T, K2, V2]): JavaPairRDD[K2, V2] = { 
    def cm: ClassTag[(K2, V2)] = implicitly[ClassTag[(K2, V2)]] 
    new JavaPairRDD(rdd.map[(K2, V2)](f)(cm))(fakeClassTag[K2], fakeClassTag[V2]) 
} 

Und:

def keyBy[U](f: JFunction[T, U]): JavaPairRDD[U, T] = { 
    implicit val ctag: ClassTag[U] = fakeClassTag 
    JavaPairRDD.fromRDD(rdd.keyBy(f)) 
} 

Welche Anrufe:

def keyBy[K](f: T => K): RDD[(K, T)] = withScope { 
    val cleanedF = sc.clean(f) 
    map(x => (cleanedF(x), x)) 
} 

Sie im Grunde beide Anruf map und erzeugen eine neue RDD . Ich sehe keine signifikanten Unterschiede zwischen den beiden.