2016-11-06 11 views
1

Ausführen der Spark-Shell mit Spark Version 2.0.1 und Scala Version 2.11.8.funken `reduceGroups` Fehler überladen Methode mit Alternativen

Der folgende Code nicht Scheck eingeben:

val is = sc.parallelize(0 until 100) 
val ds = is.map{i => (s"${i%10}", i)} 
val gs = ds.groupByKey(r => r._1) 
gs.reduceGroups((v: ((String, Int), (String, Int))) => (v._1._1, v._1._2 + v._2._2)) 

Die Fehlermeldung

<console>:32: error: overloaded method value reduceGroups with alternatives: 
    (f: org.apache.spark.api.java.function.ReduceFunction[(String, Int)])org.apache.spark.sql.Dataset[(String, (String, Int))] <and> 
    (f: ((String, Int), (String, Int)) => (String, Int))org.apache.spark.sql.Dataset[(String, (String, Int))] 
cannot be applied to ((((String, Int), (String, Int))) => (String, Int)) 
     gs.reduceGroups((r : ((String, Int), (String, Int))) => (r._1._1, r._1._2 + r._2._2)) 

Soweit ich sagen kann, ist, die Lambda-I genau zu reduceGroups passieren stimmt mit der Unterzeichnung durch die erforderliche zweite Alternative.

Antwort

2

reduceGroups erwartet eine Funktion, die zwei Argumente benötigt, während die Funktion, die Sie übergeben, eine Funktion eines einzelnen Arguments ist. Vergleicht man Signaturen Sie passieren:

((V, V)) ⇒ V 

während erwartet wird:

(V, V) ⇒ V 

wo V(String, Int) ist.

können Sie verwenden:

gs.reduceGroups(
    (v1: (String, Int), v2: (String, Int)) => (v1._1, v1._2 + v2._2) 
) 

Eine prägnante Lösung, die die Schlüssel nicht dupliziert:

spark.range(0, 100) 
    .groupByKey(i => s"${i % 10}") 
    .reduceGroups(_ + _) 
Verwandte Themen