Spark中

时间:2016-08-19 09:57:57

标签: scala apache-spark

我需要在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是使用DataFramegroupBy,但我读到这个操作非常昂贵,需要对所有数据进行彻底的重新洗牌。

那么,执行分组的成本较低的选项是什么?一个具体的例子将不胜感激。

1 个答案:

答案 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的优化。