我正在测试下面的脚本在星火壳单分区扫描的分区表。
val s = System.nanoTime
var q =
s"""
select * from partitioned_table where part_column = 'part_column_value'
"""
spark.sql(q).show
println("Elapsed: " + (System.nanoTime-s) / 1e9 + " seconds")第一次执行大约需要30秒,而所有后续的执行大约需要2秒。
如果我们看一下运行时统计信息--在第一次执行之前还有两个额外的作业。

看起来像有1212个阶段的作业扫描一个表中的所有分区(分区总数为1199,HDFS文件的总数为这个表- 1384)。
我没有找到一种方法来发现scala/java或SQL代码到底在为作业0运行什么,但我怀疑它是用于缓存的。
每次我退出shell并重新启动它时,我都会在第一次执行之前看到这两个额外的任务。当然,类似的观察也适用于其他查询。
问题
更新关于作业的详细信息.

发布于 2018-07-10 16:01:04
这个问题发生在特定的Spark版本2.0.2中。在构建计划和执行查询之前,Spark一直在扫描所有分区。
这些问题已记录在案,并在Spark2.1.0中修复。
https://stackoverflow.com/questions/47018941
复制相似问题