如果你想找到多少個1和0有您能更多信息:
val rdd = clusterAndLabel.map(x => (x,1)).reduceByKey(_+_)
這會給你一個RDD[(Int,Int),Int]
包含你描述的到底是什麼,意思是:[((0,0),2), ((1,0),1), ((1,1),1), ((2,1),2), ((2,0),1)]
。如果你真的希望他們收集到他們的第一個鍵,就可以加入這一行:
val rdd2 = rdd.map(x => (x._1._1, (x._1._2, x._2))).groupByKey()
這將產生RDD[(Int, (Int,Int)]
它看起來像你所描述的,即:[(0, [(0,2)]), (1, [(0,1),(1,1)]), (2, [(1,2),(0,1)])]
。
如果你需要實例的數量,它看起來像(至少在你的例子中)clusterAndLabel.count()
應該做的工作。
我真的不明白問題3嗎?我可以看到兩件事:
你想知道有多少個鍵有3次出現。要做到這一點,你可以從我叫rdd
(無需對groupByKey線)的對象開始做下去:
val rdd3 = rdd.map(x => (x._2,1)).reduceByKey(_+_)
這將產生和RDD[(Int,Int)]
這是怎樣的一個頻率RDD的:關鍵是多少出現的次數和價值是這把鑰匙被擊中的次數。這裏看起來像:[(1,3),(2,2)]
。所以如果你想知道有多少對出現三次,你只需要做rdd3.filter(_._1==3).collect()
(這將是一個大小爲0的數組,但如果它不是空的,那麼它將有一個值,它將是你的答案)。
你想知道第一個鍵3發生了多少次(在你的例子中再次爲0)。然後你從rdd2
開始做:
val rdd3 = rdd2.map(x=>(x._1,x._2.size)).filter(_._1==3).collect()
再次將產生一個空數組或尺寸1的陣列包含的元素數量有3對他們的第一個關鍵。需要注意的是,你可以做到這一點直接,如果你不需要顯示rdd2
,你可以做:
val rdd4 = rdd.map(x => (x._1._1,1)).reduceByKey(_+_).filter(_._1==3).collect()
(!性能你可能想reduceByKey
之前做的過濾器也)
這條線上有一個右側缺失:val rdd2 = rdd.map(x =>(x._1._1,(x._1._2,x._2))。groupByKey() –
thanks!編輯它。 –