我需要在Spark(Scala)中执行简单的数据分组。特别是,这是我的初始数据:
1, a, X
1, b, Y
2, a, Y
1, a, Y
val seqs = Seq((1, "a", "X"),(1, "b", "Y"),(2, "a", "Y"),(1, "a", "Y"))
我需要按第一个键对其进行分组,如下所示:
1, (a, X), (b, Y), (a, Y)
2, (a, Y)
我最初的idia是使用DataFrame
和groupBy
,但我读到这个操作非常昂贵,需要对所有数据进行彻底的重新洗牌。
那么,执行分组的成本较低的选项是什么?一个具体的例子将不胜感激。
答案 0 :(得分:1)
val rdd = sc.parallelize(List((1, "a", "X"),(1, "b", "Y"),(2, "a", "Y"),(1, "a", "Y")))
val mapping = rdd.map(x=>(x._1,List((x._2,x._3))))
val result = mapping.reduceByKey((x,y) => (x ++ y))
这使用了reduceByKey,但是对于所有reduce进程的问题,你必须以每组1个键值对结束。因此,在这种情况下,您需要将每个值显式转换为Lists,以便reduce过程可以合并它们。
您也可以考虑查看使用内部缩减过程的combineByKey
====== EDIT ==
正如zero323所指出的那样,减少这里不会提高效率,相反 - 这个过程将失去groupByKey的优化。