我正在InelliJ(spark 2.3,HDP 2.6.5)上运行Scala应用程序。
我正在尝试从HDFS读取实木复合地板文件,并在其上执行贴图操作,但是这花费的时间太长。
我注意到,当我的初始DataFrame很大时,即使我缩小Dataframe,整个地图操作也会花费很长时间。
请查看以下代码示例:
def main(args Array[String]):Unit = {
...
//first part - runs fast
println("Start: " + LocalDateTime.now())
val smallDf:DataFrame = sparkSession.read.parquet(hdfsSmallParquetPath)//for small parquet it returns 3000 rows
val collectedData1 = smallDf.map(runSomeMethod).collect()
println("End: " + LocalDateTime.now())
//second part - runs slow
println("Start: " + LocalDateTime.now())
val bigDf:DataFrame = sparkSession.read.parquet(hdfsBigParquetPath)//for big parquet it returns 3000000 rows
val smallerDf:DataFrame = bigDf.sample(0.001)// shrink it to return 3000 rows
val collectedData2 = smallerDf.map(runSomeMethod).collect()
println("End: " + LocalDateTime.now())
}
def runSomeMethod(r:Row):String = {
"abcd"
}
第一部分运行3000行,耗时约1秒钟,第二部分也运行3000行,但耗时约150秒
如何使第二部分的运行速度与第一部分一样快?
是否有任何可以改善性能的cache()/ persist()?
在小型Dataframe和变小的大型Dataframe上运行有什么区别吗?
谢谢