2015-06-08 28 views
1

我試圖建立mapValues,所以我可以做一些事情 我有以下RDD創建:星火.mapValues設置了多個值

res10: Array[(Int, (Double, Double, Double))] = Array((1,(9.1383276E7,1.868480924818E12,4488.0)), (22,(107667.11999999922,2582934.208799982,4488.0)), (2,(2.15141303E8,1.0585204549689E13,4488.0)), (3,(4488.0,4488.0,4488.0)), (44,(0.0,0.0,4488.0)), (18,(1348501.0,4.06652001E8,4488.0)), (9,(4488.0,4488.0,4488.0))) 

我想實現下面的代碼,但事情是關在我的語法:

val dataStatsVals = dataStatsRDD.mapValues(x => { 
    x._3, x._1, x._1/x._3, math.pow(((x._2/x._3 - x._1/x._3)), 2) 
}) 

我一直在網上淘試圖找到一個很好的.mapValues例如,做這樣的事情,但似乎無法找到它。

編輯: 輸入是:總和,平方和,和Count

輸出是:計數,總和,平均值,方差

+0

可以explainwhat的功能呢? –

+0

增加了解釋 – theMadKing

回答

4

無採樣預期的輸出,它似乎想要把所有的在一個元組中。如果是這樣,你只是缺少外括號:

val dataStatsVals = dataStatsRDD.mapValues(x => { 
    (x._3, x._1, x._1/x._3, math.pow((x._2/x._3 - x._1/x._3), 2)) 
}) 

這會給你一個Tuple4。結果將是:

1 => 3rd element from original tuple 
2 => 1st element from original tuple 
3 => 1st from original/3rd from original 
4 => output of power function 
2

你只需要處理的元組的右側部分,所以你可以使用模式匹配,以使其更易於閱讀:

val dataStatsVals = dataStatsRDD.mapValues{ 
     case (d1: Double, d2: Double, d3: Double) => (d3, d1, d1/d3, math.pow(((d2/d3 - d1/d3)), 2)) 
    }