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



我有使用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()

但这会返回一个错误

error: value groupByKey 不是 scala.collection.Map[(String, String),Long] 的成员

只需直接计算配对并在之后分组(如果有必要):

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

如果您想在减少后gropuByKey,您可能需要使用自定义分区程序,它只考虑键的第一个元素。您可以检查RDD拆分并在新的RDD上进行聚合以获取示例实现。

相关内容

  • 没有找到相关文章

最新更新