【问题标题】:How to Group By many keys in Spark RDD?如何在 Spark RDD 中按多个键分组?
【发布时间】:2016-11-19 13:41:23
【问题描述】:

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

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]]    ]

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

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

会比 Spark RDD 的 groupBy 更高效吗?

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

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

【问题讨论】:

    标签: apache-spark group-by rdd


    【解决方案1】:

    您没有提及您运行的是哪个版本的 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(_++_)
    

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

    【讨论】:

    • 如果我的回答对您有帮助,您能接受吗?
    • @GlennieHellesSindholt 为什么是.map{case(x, y, z) => ((x,y), List(z))}.reduceByKey(_++_) 而不是.map{case(x, y, z) => ((x,y), List(z))}.groupByKey?这是非常低效的。
    • 好吧,在这种情况下你可以使用任何一个,但我已经养成了始终使用reduceByKey而不是groupByKey的习惯,因为groupByKeyreduceByKey相比通常效率低下(参见为什么here)。
    • @GlennieHellesSindholt 我已经接受了你的回答,但由于我的声誉(少于 15 名),它没有出现。再次感谢。我也不知道为什么我的声誉仍然是 1... :(
    • 有人能解释一下 reduceByKey 在这里做什么吗?我无法通过逐个运行示例来理解。
    猜你喜欢
    • 2017-06-15
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多