在下列情况下如何组合火花计算的结果?

时间:2017-04-05 15:19:29

标签: scala apache-spark

问题是计算每个类对应的每列的平均值。类编号在第一列中给出。

为了更清晰,我正在提供测试文件的一部分。

2 0.819039 -0.408442 0.120827
3 -0.063763 0.060122 0.250393
4 -0.304877 0.379067 0.092391
5 -0.168923 0.044400 0.074417
1 0.053700 -0.088746 0.228501
2 0.196758 0.035607 0.008134
3 0.006971 -0.096478 0.123718
4 0.084281 0.278343 -0.350414

所以任务是计算

1: avg(), avg(), avg()
.
.
.

我对Scala很新。经过大量的代码处理后,我想出了以下代码

val inputfile = sc.textFile ("testfile.txt")
val myArray = inputfile.map { line =>
    (line.split(" ").toList)
}
var Avgmap:Map[String,List[Double]] = Map()
var countmap:Map[String,Int] = Map()
for( a <- myArray ){
    //println( "Value of a: " + a + " " + a.size );
    if(!countmap.contains(a(0))){
        countmap += (a(0) -> 0)
        Avgmap += (a(0) -> List.fill(a.size-1)(1.0))
    }
    var c = countmap(a(0)) + 1
    val countmap2 = countmap + (a(0) -> c)
    countmap = countmap2

    var p = List[Double]()
    for( i <- 1 to a.size - 1) {
        var temp = (Avgmap(a(0))(i-1)*(countmap(a(0)) - 1) + a(i).toDouble)/countmap(a(0))
        // println("i: "+i+" temp: "+temp)
        var q = p :+ temp
        p = q
    } 
    val Avgmap2 = Avgmap + (a(0) -> p)
    Avgmap = Avgmap2;
    println("--------------------------------------------------")
    println(countmap)
    println(Avgmap)
} 

当我执行此代码时,我似乎将结果分成两半的数据集。请帮我把它们组合起来。

编辑:关于我正在使用的变量。 countmap会记录classnumber -> number of vectors encountered。同样地,Avgmap记录了与密钥对应的每列的平均值。

1 个答案:

答案 0 :(得分:0)

首先,使用DataFrame API。在secont,你想要的只是一行

df.select(df.columns.map(c => mean(col(c))) :_*).show