如何在Scala中将数据帧上的代码从For循环更改为FoldLeft、Fold或FoldRight

如何在Scala中将数据帧上的代码从For循环更改为FoldLeft、Fold或FoldRight,scala,dataframe,apache-spark,apache-spark-sql,Scala,Dataframe,Apache Spark,Apache Spark Sql,我试图比较两个数据集(DS1和DS2)。因此,我将它们拉入两个数据帧,现在我想比较(DS1)的每一列和DS2的每一列。 在比较每一列中的每条记录之前,我希望通过执行GroupBy来减少数据,以便减少要比较的记录数。 我将把这两个数据集的记录传递给我的算法,该算法将返回一个分数。 我使用for loops实现了这一点,结果很好,但需要花费大量时间。 下面是我使用4个嵌套for循环的代码 // StringDS1 and StringDS2 are Dataframes var s1= string

我试图比较两个数据集(DS1和DS2)。因此,我将它们拉入两个数据帧,现在我想比较(DS1)的每一列和DS2的每一列。
在比较每一列中的每条记录之前,我希望通过执行GroupBy来减少数据,以便减少要比较的记录数。
我将把这两个数据集的记录传递给我的算法,该算法将返回一个分数。
我使用for loops实现了这一点,结果很好,但需要花费大量时间。
下面是我使用4个嵌套for循环的代码

// StringDS1 and StringDS2 are Dataframes
var s1= stringDS1.columns
var s2= stringDS2.columns
var contentString = ofDim[Double](s1.size,s2.size)
var ds1StringCount = stringDS1.count()
var ds2StringCount = stringDS2.count()
for (i <- 0 to s1.size-1) {
  println("entered 1st for Loop")
  var ds1s =stringDS1.groupBy(s1(i)).count() // GroupBy of every column before comparing on DS1
  ds1s.show()
  for(j <- 0 to s2.size-1) {
    var totalScore:Double=0
    println("entered 2nd for loop")
    var ds2s = stringDS2.groupBy(s2(j)).count() //GroupBy of every column before comparing on DS1
    ds2s.show()
    var score = new Array[Double](ds2s.count().toInt)
    var maxScore = new Array[Double](ds1s.count().toInt)
    var m:Int=0
    for(row <- ds1s.rdd.collect()) {

      println("entered 3rd for loop")
      var key1 = row(0).toString
      var value1 = row(1).toString
      println("Key1 is " + key1 + " value is " + value1)
      var s = 0 //Score Array iterator
      for (row <- ds2s.rdd.collect()) {
        println("entered 4th for loop")

        var key2 = row(0).toString
        var value2 = row(1).toString
        println(" key2 is " + key2 + "value 2 is " + value2)
        //println(ds1StringCount + " " + ds2StringCount)
        println("size is " + score.size)
        score(s) = contentAlgoString(key1, key2, value1, value2)  // ContentAlgoString is the Method for the Algorithm where it
                                              // returns a score and that score is stored in an array
        s = s + 1
      } // Loop for k1 -> k2

      maxScore(m) = score.max        // maxScore(m) is an array that stores the max value from the Score Array
      println("Max Score is " + maxScore(m))
      totalScore = totalScore + (maxScore(m) * (value1.toDouble / ds1StringCount.toDouble))
      println("Total Score is " + totalScore)
      m = m + 1


    } // loop for all k1's -> all k2's

    contentString(i)(j)= totalScore  // Total Score is stored in this Array
  }
}
//StringDS1和StringDS2是数据帧
var s1=stringDS1.columns
var s2=stringDS2.0列
var contentString=ofDim[Double](s1.size,s2.size)
var ds1StringCount=stringDS1.count()
var ds2StringCount=stringDS2.count()

对于(我看起来像是一个“请为我做这件事”的问题。在你的例子中,
map
看起来比
fold
s2.map(col=>…)
。不要期望这样的重构会加快速度。事实上,我是个新手。我是一名学生,正在尝试尽快完成一个项目。有没有任何指南或博客可以让我学习地图,我如何迭代所有的列和记录。谢谢如果你必须尽快完成,只需坚持使用你已经熟悉的技术。如果你愿意的话希望学习它-你必须投入一些时间阅读一本书或参加一个在线课程谢谢,我会报名参加这门课程