我试图了解是什么导致了阅读速度的巨大差异。我有一个包含 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秒。
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 列的数据集,这非常快,可能太快了(取决于您的硬件)。
因此,就您而言,可能发生了以下情况之一: