我有一个配置单元数据库,我的示例中的所有表都是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) 如果我必须报告执行时间,报告第一次或第二次执行的时间会更公平吗?
暂无答案!
目前还没有任何答案,快来回答吧!