Может ли кто-нибудь реализовать CombineByKey () вместо GroupByKey () в Spark для группировки элементов? - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь сгруппировать элементы СДР, которые я создал. Один простой, но дорогой способ - использовать GroupByKey(). но недавно я узнал, что CombineByKey() может выполнять эту работу более эффективно. мой RDD очень прост. это выглядит так:

(1,5)
(1,8)
(1,40)
(2,9)
(2,20)
(2,6)
val grouped_elements=first_RDD.groupByKey()..mapValues(x => x.toList)

результат:

(1,List(5,8,40))
(2,List(9,20,6))

я хочу сгруппировать их по первому элементу (ключу).

Может ли кто-нибудь помочь мне сделать это с помощью функции CombineByKey()? я действительно смущен CombineByKey()

1 Ответ

2 голосов
/ 26 марта 2020

Для начала взглянем на API. См. docs

combineByKey[C](createCombiner: (V) ⇒ C, mergeValue: (C, V) ⇒ C, mergeCombiners: (C, C) ⇒ C): RDD[(K, C)]

Так что он принимает три функции, которые я определил ниже

scala> val createCombiner = (v:Int) => List(v)
createCombiner: Int => List[Int] = <function1>

scala> val mergeValue = (a:List[Int], b:Int) => a.::(b)
mergeValue: (List[Int], Int) => List[Int] = <function2>

scala> val mergeCombiners = (a:List[Int],b:List[Int]) => a.++(b)
mergeCombiners: (List[Int], List[Int]) => List[Int] = <function2>

Как только вы определите затем вы можете использовать его в своем вызове combByKey, как показано ниже

scala> val list = List((1,5),(1,8),(1,40),(2,9),(2,20),(2,6))
list: List[(Int, Int)] = List((1,5), (1,8), (1,40), (2,9), (2,20), (2,6))

scala> val temp = sc.parallelize(list)
temp: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[41] at parallelize at <console>:30

scala> temp.combineByKey(createCombiner,mergeValue, mergeCombiners).collect
res27: Array[(Int, List[Int])] = Array((1,List(8, 40, 5)), (2,List(20, 9, 6)))

Обратите внимание, что я попробовал это в Spark Shell и, следовательно, вы можете увидеть выходные данные под выполненными командами. Они помогут вам понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...