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

Spark - Group by Key then Count by Value

我有使用 map 函数从 RDD Array[String]

创建的非唯一键值对
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()

但这return一个错误

error: value groupByKey is not a member of scala.collection.Map[(String, String),Long]

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

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

如果您想 gropuByKey 减少后,您可能需要使用自定义分区程序,它只考虑键的第一个元素。您可以查看 示例实现。