2016-02-29 34 views
2

我試圖找到一種有效的方式來查找以下內容:Scala中我們如何聚集的陣列,以確定每個鍵的數量和百分比VS總

  1. INT1 = 1或0,INT2 = 1 ..k(其中k = 3)和Double = 1.0
  2. 我想知道在每個k中有多少個1或0我需要找到3的結果的百分比數組??

輸入是:

val clusterAndLabel = sc.parallelize(Array((0, 0), (0, 0), (1, 0), (1, 1), (2, 1), (2, 1), (2, 0))) 

所以在這個例子:

  1. 我有:0,0 = 2,0,1 = 0
  2. 我有:1,0 = 1,1.1 = 1
  3. 我有:2,1 = 2,0.0 = 1

共爲7個實例

我的想法做一些aggegation的,但我停留在思想,他們都認爲是2鍵加入

回答

3

如果你想找到多少個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之前做的過濾器也)

+0

這條線上有一個右側缺失:val rdd2 = rdd.map(x =>(x._1._1,(x._1._2,x._2))。groupByKey() –

+0

thanks!編輯它。 –

相關問題