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在这里做什么吗?我无法理解一块一块地运行示例。