首页 > 解决方案 > 为什么 Spark 查询在第二次执行时运行得更快?

问题描述

我第二次运行查询时速度明显更快。为什么?

代码:

publicvoidtest3() {
    Dataset<Row>SQLDF=spark.read().json(path:"src/main/resources/data/ipl.json");
    SQLDF.repartition(2);
    Dataset<Row>result1=SqlDF.where("run>10000").select(col:"team",...cols:"run");
    //Dataset<Row>cachedPartition=result1.cache();
    result.collect();
    //result1.show();log.info("PhysicalPlan\n"+result1.queryExecution().executedPlan());

    Dataset<Row>result2=SqlDF.where("run>10000").select(col:"team",..cols:"run");
    result2.collect();
    //result1.show();
    Log.info("PhysicalPlan\n"+result2.queryExecution().executedPlanq);
}

物理计划:

在此处输入图像描述

spark UI 上的执行时间:

在此处输入图像描述

为什么这些查询需要不同的时间,为什么执行时间有这么大的差异?缓存是否发生在幕后?如果是,为什么物理计划中没有提到?

标签: apache-sparkpysparkapache-spark-sql

解决方案


您将 Spark 指向一个文件。第二次访问同一个文件时,该文件的访问速度会更快。

如果您运行以下代码两次,情况相同(当然,Scala 使用 JVM 和 java.nio 和 java.io 除外)。

with open("src/main/resources/data/ipl.json") as f:
    t = f.read()
print(t)

第一次,必须初始化 I/O 操作。第二次,I/O 操作可以重用上次运行的部分内容。如果文件很小(就像您的情况一样),则整个文件将被缓存。


推荐阅读