Почему Scala тратит меньше времени на чтение файла, если это делается несколько раз? - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу сравнить время, необходимое для чтения файла для 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. Почему нет?И что я могу сделать, чтобы сделать его линейным, чтобы я мог эффективно сравнить, сколько раз нужно прочитать файл в первый раз в Spark и PySpark?

РЕДАКТИРОВАТЬ:

Если вместо этого я изменю код для создания sparkSession внутри функции map:

  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 Ответ

1 голос
/ 08 апреля 2019

Стратегия исполнения Spark ленива, в вашем случае это означает, что spark загрузит данные из файла только тогда, когда вы примените к нему операцию действия (сбор, прием, ...), но ваш код просто вычислит время начала и окончания и объедините его, чтобы не было необходимости загружать данные из файла!

Для оценки времени вы должны применить некоторую логику к данным файла (включая операцию действия), например, вы можете применить алгоритм подсчета слов или даже просто напечатать любую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...