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

Vis*_*aji 5 apache-spark apache-spark-sql pyspark

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

final_df=spark.read.parquet("/dbfs/FileStore/path/to/file.parquet")
Run Code Online (Sandbox Code Playgroud)

读取该文件需要 14 分钟。

尽管

final_df = spark.read.format("parquet").load("/dbfs/FileStore/path/to/file.parquet")
Run Code Online (Sandbox Code Playgroud)

读取文件仅需2秒。

Koe*_*dlt 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: _*)
  }
Run Code Online (Sandbox Code Playgroud)

我们看到,callingspark.read.parquet(filename)实际上是 的一种“别名” spark.read.format("parquet").load(filename)

结论

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

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

  • 也许您在“慢”操作之后调用了一项操作,触发了实际读取,但没有为“快”操作执行此操作。“快速”的实际上并没有读入文件。
  • 也许在第一次读取之后,您的数据集以某种方式被缓存。这可以消除再次读取文件的需要。
  • ...或者是其他东西 :)