我在sparkshell中测试下面的脚本-分区表的单分区扫描。
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个阶段的job会扫描一个表中的所有分区(分区总数1199,这个表的hdfs文件总数1384)。
我没有找到一种方法来发现scala/java或sql代码到底在为作业0运行什么,但我怀疑它是用于缓存的。
每次我退出sparkshell并再次启动它时,我都会在第一次执行之前看到这两个额外的作业。当然,类似的观察也适用于其他查询。
问题
是否有可能证明或否定关于缓存的假设?
如果是缓存-如何禁用缓存和如何清理它?
更新。关于工作的细节。
1条答案
按热度按时间fnx2tebb1#
问题发生在特定的spark版本2.0.2上。spark在构建计划和执行查询之前扫描了所有分区。
这些问题已在spark 2.1.0中记录并修复
https://issues.apache.org/jira/browse/spark-16980