Как изменить код с циклов For на FoldLeft, Fold или FoldRight для фреймов данных в Scala - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь сравнить два набора данных (DS1 и DS2). Итак, я собрал их в два кадра данных, и теперь я хочу сравнить каждый столбец (DS1) с каждым столбцом DS2.
Прежде чем сравнивать каждую запись из каждого столбца, я хотел бы уменьшитьданные, выполнив GroupBy, так что я могу уменьшить количество записей для сравнения.
Я передам эти записи для сравнения из обоих наборов данных в мой алгоритм, который вернет счет обратно.
Я сделал это, используя дляциклы , результаты хорошие, но это отнимает много времени.
Ниже мой код, использующий 4 вложенных цикла,

// 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
  }
}

Удаляя " FOR Loops"и используя вместо этого" Foldleft"я могу оптимизировать свой код и получать более быстрые результаты. Есть ли другой подход, кроме сгибов, чтобы улучшить мои результаты или получить более быстрые результаты. Любая помощь приветствуется.

...