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

Spa*_*tan 2 group-by apache-spark rdd

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

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

                (5 , "x1", 100),
                (3 , "x2", 200),
                (3 , "x4", 300),
                (5 , "x1", 150),
                (3 , "x2", 160),
                (5 , "x1", 400)
  }
Run Code Online (Sandbox Code Playgroud)

如何有效地按前两个元素对它们进行分组并按第三个元素排序?例如制作:

                [5 , [  "x1" -> [100, 150, 400]  ]
                [3 , [   ["x2" -> [160, 200]],   ["x4" -> [300]]    ]
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种有效的方法。

我应该将其设为 DataFrame 并使用 GroupBy(Col1,Col2) 和 SortBy(Col3) 吗?

这会比 Spark RDD 的 groupBy 更有效吗?

AggregateByKey 可以同时聚合 2 个键吗?

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

Gle*_*olt 5

您没有提到您正在运行哪个版本的 Spark,但是使用 RDD 执行此操作的一种方法是这样的:

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(_++_)
Run Code Online (Sandbox Code Playgroud)

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

  • 如果我的回答有帮助,那么请您接受答案吗? (3认同)