1

我有一个镶木地板文件,名为test.parquet。它包含一些整数。当我使用以下代码读取它时:为什么spark.read.parquet()运行2个工作?

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

df.show(false) 

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

在日志中显示2个执行的作业。它们分别是:

enter image description here

一个是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

enter image description here

所以,我的问题是:

  1. 为什么第一种方法执行2个工作,而第二种方法只执行一个?
  2. 而且,为什么第二种方法比第一种方法更快?
+0

如果您正在按顺序执行这些命令,首先要加载然后显示df。这是2个不同的任务。如果你要求spark再次读取该文件。那么他已经有了它的执行计划,即使是垃圾收集器没有清理的数据也是如此,因此唯一能够执行的任务就是显示数据。 – eliasah

+0

@eliasah你在谈论为什么第二种方法更快?因为当我颠倒了以上两种方法的执行顺序时,第二种方法比第一种方法更快。 – himanshuIIITian

+0

那么,我的评论说 – eliasah

回答

2

Spark将文件读取两次。 1-进化模式 2-创建数据帧

一旦生成模式,将创建快速的数据帧。

+0

感谢您的回应!但我仍然不明白为什么第一种方法执行2个工作? – himanshuIIITian

+0

答案在你的问题兄弟中。在第二种方法中,你已经定义了模式 - StructField(“id”,LongType,false))。这就是它只创建一个作业来加载文件的原因。 但是在第一种方法中,您并未定义模式。 Spark sql将通过读取文件来生成模式。这将是第一份工作。然后,整个文件将被加载以创建一个DataFrame。这将是第二份工作 –

+0

谢谢!在与@eliasah讨论之后,我明白了。 – himanshuIIITian

相关问题