apache-spark - 如何在 Spark 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", 400)
  }

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

                [5 , [  "x1" -> [100, 150, 400]  ]
                [3 , [   ["x2" -> [160, 200]],   ["x4" -> [300]]    ]

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

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

这样会比Spark RDD的groupBy效率更高吗?

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

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

最佳答案

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

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

关于apache-spark - 如何在 Spark RDD 中按多个键进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40693569/

相关文章:

node.js - 使用 Sequelize 分组

scala - 值 toDS 不是 org.apache.spark.rdd.RDD 的成员

python - 如何将 PySpark RDD 转换为具有未知列的 Dataframe?

scala - 如何在 Spark Scala 中使用 mapPartitions?

python - 根据旧数据帧中重新格式化的列创建新数据帧

Pandas - 延长平均 session 时间

apache-spark - 从本地二进制文件保存并加载 Spark RDD - 最小工作示例

apache-spark - 在 Pyspark 中从带有字符串列表的列中获取最频繁的字符串

java - Arraylist 在 JavaRDD<String>.foreach 之后为空

mysql - 从两列中查找重复项,但显示所有行 MySQL