【发布时间】: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 个作业的原因吗?
-
我也在评论中解释了这一点。事实上,数据真的太小了,无法真正进行比较。
标签: scala apache-spark apache-spark-sql spark-dataframe parquet