Scala 在以下情况下,如何组合spark计算的结果?

Scala 在以下情况下,如何组合spark计算的结果?,scala,apache-spark,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

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

为了更清晰,我给出了测试文件的一部分

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()
.
.
.
我对斯卡拉很陌生。在对代码进行了大量修改之后,我想出了以下代码

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)
} 
val inputfile=sc.textFile(“testfile.txt”)
val myArray=inputfile.map{line=>
(行分割(“”)toList)
}
var Avgmap:Map[String,List[Double]]=Map()
var countmap:Map[String,Int]=Map()
对于(a 0)
Avgmap+=(a(0)->列表填充(a.size-1)(1.0))
}
var c=countmap(a(0))+1
val countmap2=countmap+(a(0)->c)
countmap=countmap2
var p=列表[双精度]()
对于(IP)
Avgmap=Avgmap2;
println(“-------------------------------------------------------------”)
println(countmap)
println(Avgmap)
} 
当我执行这段代码时,我似乎在数据集的两半中得到了结果。请帮我把它们组合起来


编辑:关于我正在使用的变量
countmap
记录遇到的
classnumber->向量数
。类似地,
Avgmap
会记录到目前为止与键对应的每列的平均值。

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

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

您使用的是spark,这意味着您的数据和计算在分布式集群中工作。这意味着您必须编写不同于仅在本地运行计算的代码。无法更新计算中的某些外部集合。一切都需要在rdd内部发生。看看spark api。你要按你的班级类型分组,然后用一个总数来计算你的平均成绩。如果使用spark sql和dataframes,可能会更容易。