如果多次执行,Scala为什么需要较少的时间来读取文件?

时间:2019-04-08 10:04:35

标签: scala apache-spark

我想比较读取pyspark和scala spark文件的时间。在Scala中,我正在执行以下操作:

import org.apache.spark.sql.SparkSession

object Playground extends App {
  def getDfFromFile(path: String, spark: SparkSession) = {
    spark
      .read
      .format("csv")
      .option("inferSchema", true)
      .option("header", true)
      .load(path)
  }

  val master = "local"
  val spark = SparkSession.builder()
    .master(master)
    .getOrCreate()
  spark.sparkContext.setLogLevel("WARN")

  val N = 1
  val avgTime = (0 until N)
    .map(_ => {
      val start = System.nanoTime()
      getDfFromFile("resources/bigdatafile.csv", spark)
      val end = System.nanoTime()

      end - start
    }).sum / Math.pow(10, 9)
  println(avgTime)
}

使用N = 1大约需要2.7秒。如果将其增加到10,则大约需要3.7秒。使用N = 100,需要9.7秒。

很明显,时间的增加量在N中不是线性的。为什么不呢?怎样使它线性化,以便可以有效地比较在Spa​​rk和PySpark中第一次读取文件 所需的时间?

编辑:

如果我更改代码以改为在map函数内创建sparkSession:

  val N = 100
  val avgTime = (0 until N)
    .map(_ => {
      val spark = SparkSession.builder()
        .master(master)
        .getOrCreate()
      spark.sparkContext.setLogLevel("WARN")

      val start = System.nanoTime()
      getDfFromFile("resources/bigdatafile.csv", spark)
      val end = System.nanoTime()

      spark.close()

      end - start
    }).sum / Math.pow(10, 9)

对结果几乎没有影响。

1 个答案:

答案 0 :(得分:1)

火花执行策略是惰性的,在您的情况下,这意味着火花仅在您对其执行操作操作(收集,接收,...)时才从文件中加载数据,但是您的代码仅计算开始时间和结束时间并进行汇总,因此无需从文件中加载数据!

对于时间评估,您应该对文件数据应用一些逻辑(包括动作操作),例如,可以应用字数统计算法,甚至可以只打印任何行。