2016-03-03 49 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

正是我在找的東西! –