Mam listę Tupli typu: (identyfikator użytkownika, nazwisko, liczba).Używanie reduceByKey w Apache Spark (Scala)
Na przykład
val x = sc.parallelize(List(
("a", "b", 1),
("a", "b", 1),
("c", "b", 1),
("a", "d", 1))
)
Ja próbując zmniejszyć tę kolekcję do typu, gdzie każda nazwa element jest liczony. w powyższym val x
Więc jest konwertowany do:
(a,ArrayBuffer((d,1), (b,2)))
(c,ArrayBuffer((b,1)))
Oto kod Obecnie używam:
val byKey = x.map({case (id,uri,count) => (id,uri)->count})
val grouped = byKey.groupByKey
val count = grouped.map{case ((id,uri),count) => ((id),(uri,count.sum))}
val grouped2: org.apache.spark.rdd.RDD[(String, Seq[(String, Int)])] = count.groupByKey
grouped2.foreach(println)
Ja próbuje użyć reduceByKey jak wykonuje się szybciej niż groupByKey.
W jaki sposób można zaimplementować metodę lowerBeyKey zamiast powyższego kodu, aby zapewnić takie samo odwzorowanie?
Więc, w zasadzie, reduceByKey ma taki sam skutek jak zrobienie groupBy, a następnie zastosowanie funkcji Custom Dise? – Savvas
@Savvas wynik końcowy jest równy, ale 'reduceByKey' ma wymaganie pamięci O (1) na executor, podczas gdy' groupByKey' zachowuje wszystkie pogrupowane wartości w pamięci, które mogą prowadzić do OOM. – maasg