2016-03-03 35 views
2
计数

我有我已经使用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 is not a member of scala.collection.Map[(String, String),Long]

+0

countByValue()返回一个映射,groupByKey是一个RDD上的方法 - 你不能在它上面使用它。 –

回答

7

就直接算对,组(如果有)算账:

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

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

+0

正是我在找的东西! –