Spark - 按键分组,然后按值计数

Posted

技术标签:

【中文标题】Spark - 按键分组,然后按值计数【英文标题】:Spark - Group by Key then Count by Value 【发布时间】:2016-03-03 04:35:25 【问题描述】:

我有使用RDD Array[String] 中的map 函数创建的非唯一键值对

val kvPairs = myRdd.map(line => (line(0), line(1)))

这会产生以下格式的数据:

1, A
1, A
1, B
2, C

我想按它们的值对所有键进行分组,并提供这些值的计数,如下所示:

1, (A, 2), (B, 1)
2, (C, 1)

我尝试了许多不同的尝试,但我能得到的最接近的是这样的:

kvPairs.sortByKey().countByValue()

这给了

1, (A, 2)
1, (B, 1)
2, (C, 1)

还有,

kvPairs.groupByKey().sortByKey()

提供价值,但还不够:

1, (A, A, B)
2, (C)

我尝试将两者结合在一起:

kvPairs.countByValue().groupByKey().sortByKey()

但这会返回错误

错误:值 groupByKey 不是 scala.collection.Map[(String, String),Long] 的成员

【问题讨论】:

countByValue() 返回一个映射,groupByKey 是 RDD 上的一个方法 - 你不能在它上面使用它。 【参考方案1】:

直接数对数,然后分组(如果必须的话):

kvPairs.map((_, 1L))
  .reduceByKey(_ + _)
  .map case ((k, v), cnt) => (k, (v, cnt)) 
  .groupByKey

如果你想在减少后gropuByKey,你可能想使用只考虑键的第一个元素的自定义分区器。您可以查看RDD split and do aggregation on new RDDs 以获得示例实现。

【讨论】:

以上是关于Spark - 按键分组,然后按值计数的主要内容,如果未能解决你的问题,请参考以下文章

Spark RDD案例:统计每日新增用户

使用 Spark/Scala 有效地按键分组并查找在特定时间窗口中发生的事件的上一个时间戳

Spark 分组然后排序(Java 代码)

Java Map按键(Key)排序和按值(Value)排序

按值然后键对字典进行排序

PySpark如何按值排序,如果值相等,按键排序?