spark.read.parquet 和spark.read.format.load 之间的速度差异

问题描述 投票:0回答:1

我试图了解是什么导致了阅读速度的巨大差异。我有一个包含 3000 万行和 38 列的数据框。

final_df=spark.read.parquet("/dbfs/FileStore/path/to/file.parquet")

读取文件需要 14 分钟。

同时

final_df = spark.read.format("parquet").load("/dbfs/FileStore/path/to/file.parquet")

读取文件仅需2秒。

apache-spark pyspark apache-spark-sql
1个回答
4
投票

spark.read.parquet(filename)
spark.read.format("parquet").load(filename)
做完全相同的事情。

我们可以在源代码中看到这一点(采用 Spark 3.3.2,本文发布时的最新版本)。

  /**
   * Loads a Parquet file, returning the result as a `DataFrame`.
   *
   * Parquet-specific option(s) for reading Parquet files can be found in
   * <a href=
   *   "https://spark.apache.org/docs/latest/sql-data-sources-parquet.html#data-source-option">
   *   Data Source Option</a> in the version you use.
   *
   * @since 1.4.0
   */
  @scala.annotation.varargs
  def parquet(paths: String*): DataFrame = {
    format("parquet").load(paths: _*)
  }

我们看到,调用

spark.read.parquet(filename)
实际上是
spark.read.format("parquet").load(filename)
的一种“别名”。

结论

这两种读取文件的方法是完全相同的。此外,使用这些方法读取文件是一种惰性转换,而不是一个操作。只需 2 秒即可读取 3000 万行和 38 列的数据集,这非常快,可能太快了(取决于您的硬件)。

因此,就您而言,可能发生了以下情况之一:

  • 也许您在“慢”操作之后调用了一项操作,触发了实际读取,但没有为“快”操作执行此操作。 “快”的人实际上并没有读入文件。
  • 也许在第一次读取后,您的数据集以某种方式被缓存。这可以消除再次读取文件的需要。
  • ...或者别的什么:)
© www.soinside.com 2019 - 2024. All rights reserved.