首页 > 解决方案 > 如何在 Apache Spark 的 Scala 中按数据集分组?

问题描述

我想按我的字符串的第一部分对我的数据集进行分组。因此,要按“SC Freiburg”、“Arsenal”等对其进行分组……除了分组依据之外,我还需要对分组的人数进行计数。

scala> res61.foreach(println)
SC Freiburg,2014,Germany,7747
Arsenal,2014,Germany,7745
Arsenal,2014,Germany,7750
Arsenal,2014,Germany,7758
Bayern Munich,2014,Germany,7737
Bayern Munich,2014,Germany,7744
Bayern Munich,2014,Germany,7746
Bayern Munich,2014,Germany,7749
Bayern Munich,2014,Germany,7752
Bayern Munich,2014,Germany,7754
Bayern Munich,2014,Germany,7755
Borussia Dortmund,2014,Germany,7739
Borussia Dortmund,2014,Germany,7740
Borussia Dortmund,2014,Germany,7742
Borussia Dortmund,2014,Germany,7743
Borussia Dortmund,2014,Germany,7756
Borussia Mönchengladbach,2014,Germany,7757
Schalke 04,2014,Germany,7741
Schalke 04,2014,Germany,7753
Chelsea,2014,Germany,7751
Hannover 96,2014,Germany,7738
Real Madrid,2014,Germany,7748
Lazio,2014,Germany,7759

提示:我必须使用 rdd 操作,请不要建议使用我看过这篇文章的数据帧:spark dataset group by and sum 但我不知道在我的示例中重现它。

这是来自我的 postgresql 数据库的结果输出:

结果

标签: sqlscalaapache-sparkgroup-bydataset

解决方案


RDD 有 groupBy() 和 groupByKey() 方法。例如,要进行分组计数,您可以执行以下操作:

val str ="""SC Freiburg,2014,Germany,7747
   Arsenal,2014,Germany,7745
   ...
"""
val rdd = sc.parallelize(str.split("\n"))
rdd.map (_.split(",")).keyBy(_(0)).groupByKey().map {case (k, v) => (k, v.size)}.collect

推荐阅读