为啥 spark.read.parquet() 运行 2 个作业?

Posted

技术标签:

【中文标题】为啥 spark.read.parquet() 运行 2 个作业?【英文标题】:Why spark.read.parquet() runs 2 jobs?为什么 spark.read.parquet() 运行 2 个作业? 【发布时间】:2017-06-28 04:48:29 【问题描述】:

我有一个名为 test.parquet 的镶木地板文件。它包含一些整数。当我使用以下代码阅读它时:

val df = spark.read.parquet("test.parquet")

df.show(false)

+---+
|id |
+---+
|11 |
|12 |
|13 |
|14 |
|15 |
|16 |
|17 |
|18 |
|19 |
+---+

在日志中它显示了 2 个已执行的作业。它们如下:

一个是parquet 工作,另一个是show 工作。然而,当我使用以下代码读取镶木地板文件时:

val df = spark.read.schema(StructType(List(StructField("id",LongType,false)))).parquet("test.parquet")

df.show(false)

+---+
|id |
+---+
|11 |
|12 |
|13 |
|14 |
|15 |
|16 |
|17 |
|18 |
|19 |
+---+

只执行一项作业,即show

所以,我的问题是:

    为什么第一种方法执行 2 个作业,而第二种方法只执行一个? 而且,为什么第二种方法比第一种更快?

【问题讨论】:

如果您按顺序执行这些命令,首先您会加载然后显示 df。那是2个不同的任务。如果您要求 spark 再次读取该文件。好吧,他已经有了它的执行计划,即使垃圾收集器确实清理了数据,所以 spark 将执行的唯一任务就是显示数据。 @eliasah 你在谈论为什么第二种方法更快?因为当我(按顺序)颠倒上述两种方法的执行顺序时,第二种方法也比第一种方法快。 嗯,我的评论是这样说的 好的...我明白了!您知道第一种方法执行 2 个作业的原因吗? 我也在评论中解释了这一点。事实上,数据真的太小了,无法真正进行比较。 【参考方案1】:

Spark 读取文件两次。 1-发展架构 2- 创建数据帧

一旦生成了模式,就会快速创建数据帧。

【讨论】:

感谢您的回复!但我仍然不明白为什么第一种方法执行 2 个工作? 答案在你的问题兄弟中。在第二种方法中,你已经定义了模式 - StructField("id",LongType,false))。这就是它只创建一个作业来加载文件的原因。但是在第一种方法中-您没有定义架构。 Spark sql 将通过读取文件来生成模式。这将是第一份工作。然后,将加载整个文件以创建 DataFrame。这将是第二份工作 谢谢!在与@eliasah 讨论之后,我明白了。

以上是关于为啥 spark.read.parquet() 运行 2 个作业?的主要内容,如果未能解决你的问题,请参考以下文章

使用 parquet 格式附加 Apache Spark 中列的描述

Spark数据框加入问题

为啥我无法读取这些数据帧

Spark缓慢重新分区许多小文件

如何刷新 HDFS 路径?

Spark LuceneRDD - 它是如何工作的