如何在Scala中将数据帧上的代码从For循环更改为FoldLeft、Fold或FoldRight
我试图比较两个数据集(DS1和DS2)。因此,我将它们拉入两个数据帧,现在我想比较(DS1)的每一列和DS2的每一列。如何在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
在比较每一列中的每条记录之前,我希望通过执行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=>…)
。不要期望这样的重构会加快速度。事实上,我是个新手。我是一名学生,正在尝试尽快完成一个项目。有没有任何指南或博客可以让我学习地图,我如何迭代所有的列和记录。谢谢如果你必须尽快完成,只需坚持使用你已经熟悉的技术。如果你愿意的话希望学习它-你必须投入一些时间阅读一本书或参加一个在线课程谢谢,我会报名参加这门课程