Apache spark 如何在Spark RDD中按多个键分组?

Apache spark 如何在Spark RDD中按多个键分组?,apache-spark,group-by,rdd,Apache Spark,Group By,Rdd,想象一下我有一个三胞胎: val RecordRDD : RDD[Int, String, Int] = { (5 , "x1", 100), (3 , "x2", 200), (3 , "x4", 300), (5 , "x1", 150), (3 , "x2", 160), (5 , "x1", 40

想象一下我有一个三胞胎:

val RecordRDD : RDD[Int, String, Int] = {

                (5 , "x1", 100),
                (3 , "x2", 200),
                (3 , "x4", 300),
                (5 , "x1", 150),
                (3 , "x2", 160),
                (5 , "x1", 400)
  }
如何根据前两个元素对它们进行有效分组,并根据第三个元素进行排序?例如:

                [5 , [  "x1" -> [100, 150, 400]  ]
                [3 , [   ["x2" -> [160, 200]],   ["x4" -> [300]]    ]
我正在寻找一种有效的方法

我是否应该将其设置为数据帧并使用GroupBy(Col1,Col2)和SortBy(Col3)

这会比Spark RDD的groupBy更高效吗

AggregateByKey能否同时在两个键上聚合


*你可以假设这个RDD相当大!提前谢谢

您没有提到您正在运行哪个版本的Spark,但是使用RDDs的一种方法是:

val result = RecordRDD
  .map{case(x, y, z) => ((x,y), List(z))}
  .reduceByKey(_++_)
  .map{case(key, list) => (key._1, Map((key._2 -> list.sorted)))}
  .reduceByKey(_++_)

我不知道这是否是最有效的方法,但它相当有效;)

如果我的回答有帮助,你能接受这个答案吗?@GlennieHellesSindholt为什么
.map{case(x,y,z)=>((x,y,List(z))}.reduceByKey(++)而不是
.map{case(x,y,z)=>((x,y,List(z)).groupByKey
?这是非常低效的。好吧,在这种情况下,你可以使用任何一种,但我养成了一种习惯,总是使用
reduceByKey
而不是
groupByKey
,因为
groupByKey
reduceByKey
相比往往效率低下(看看原因)。@GlennieHellesSindholt我接受了你的答案,但由于我的名声(不到15岁),它没有出现。再次感谢。我也不知道为什么我的名声仍然是1…:(有人能解释一下reduceByKey在这里做什么吗?我无法理解一块一块地运行示例。