sql - 如何在 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 数据库的结果输出:
解决方案
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
推荐阅读
- ios - ReasonML 可以用来制作原生 iOS 应用吗?
- node.js - 在 node.js 中为电影 api 添加“+”到“”
- vb.net - Vb.net 遍历字典以刷新列表框项属性
- rust - 访问另一个哈希图中的非可变哈希图
- python - 为什么 r2_score 在 train_test_split 和 pipeline cross_val_score 之间有很大不同?
- python - 如何在 python 中将 .csv 更改为列表,反之亦然?
- php - Lumen / Docker / MySQL (SQLSTATE[HY000] [2002] Connection denied) 但我可以外部连接
- javascript - 将嵌套数组值映射到 Map,并具有按数组索引设置 Map 值的功能,该索引将通过引用反映在嵌套数组中
- docker - 如何使用 exec、rw 标志挂载 docker tmpfs?
- python - 拆分 CSV 时打开的输出文件过多