我有非唯一键值对,我已经使用创建的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()
但这返回一个错误
错误:值groupByKey不是scala.collection.Map [(String,String),Long]的成员
只需直接数对并随后分组(如果需要)即可:
kvPairs.map((_, 1L))
.reduceByKey(_ + _)
.map{ case ((k, v), cnt) => (k, (v, cnt)) }
.groupByKey
如果要gropuByKey
在还原之后进行操作,则可能需要使用自定义分区程序,该分区程序仅考虑键的第一个元素。您可以检查RDD拆分并在新的RDD上进行汇总以获取示例实现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句