数据框上的地图花费的时间太长

时间:2019-03-20 15:03:31

标签: scala apache-spark hdfs bigdata parquet

我正在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上运行有什么区别吗?

谢谢

0 个答案:

没有答案