spark2.2:sparksql是否使用以前执行的查询的内存结果?

raogr8fs  于 2021-06-27  发布在  Hive
关注(0)|答案(0)|浏览(191)

我有一个配置单元数据库,我的示例中的所有表都是Parquet格式的配置单元表。
假设这是我的应用程序的前两个sparksql查询(为了这个问题简化了模式):

1) val df1 = spark.sql("select * from T1 where T1.col1 = 'a'")
2) val df2 = spark.sql("select * from T1 where T1.col2 = 'b'")

当我执行一个动作时,我会根据顺序得到不同的时间:

df1.count()
Time taken: 18062 ms
df2.count()
Time taken: 7037 ms

(在另一个spark应用程序/外壳上)

df2.count()
Time taken: 20330 ms
df1.count()
Time taken: 4131 ms

我试图解释的一种方法是,第二个Dataframe可以利用上一次执行留下的内存信息,因为两个Dataframe访问同一个表。
然而,前几天我在两张不同的table上尝试了类似的方法,t1和t2:

1) val df3 = spark.sql("select * from T1 where T1.col1 = 'c'")
2) val df4 = spark.sql("select * from T2 where T2.col1 = 'd'")

得到:

df3.count()
Time taken: 18062 ms
df4.count()
Time taken: 712 ms

(在另一个spark应用程序/外壳上)

df4.count()
Time taken: 11447 ms
df3.count()
Time taken: 15042 ms

因此,似乎最后执行的Dataframe总是比第一次执行的Dataframe获得更好的执行时间。
1) 尤其是在访问两个不同表的情况下,这怎么可能呢?我该怎么解释?
2) 如果这不是由于内存中数据的重用,那么有没有办法消除第一次执行的开销?
3) 如果我必须报告执行时间,报告第一次或第二次执行的时间会更公平吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题