我正在尝试了解 Spark SQL 中的各种缓存机制。下面的代码片段有什么区别吗:
方法一:
cache table test_cache AS
select a, b, c
from x
inner join y
on x.a = y.a;
方法2:
create temporary view test_cache AS
select a, b, c
from x
inner join y
on x.a = y.a;
cache table test_cache;
由于 Spark 中的计算是惰性的,Spark 会在方法 2 中第一次创建临时表时缓存结果吗?或者它会等待应用任何收集吗?
最佳答案
在 Spark SQL 中,如果直接使用 SQL 或使用 DataFrame DSL,缓存会有所不同。使用DSL,缓存是惰性的,所以调用后
my_df.cache()
数据不会直接缓存在内存中,而是仅将有关缓存的信息添加到查询计划中,并且在对 DataFrame 调用某些操作后数据将被缓存。
另一方面,像在示例中那样直接使用 SQL,默认情况下会立即进行缓存。因此,在方法 1 中,作业将立即运行,并且数据将被放入内存中。在方法 2 中,作业将在调用带有缓存的查询后运行:
cache table test_cache;
同样使用 SQL,也可以通过显式使用 lazy
关键字来设置惰性缓存:
cache lazy table test_cache;
在这种情况下,作业不会立即运行,并且在针对表 test_cache
调用某些操作后,数据将被放入内存中。
总而言之,您的两种方法在缓存方面是等效的,并且在运行代码块后将立即缓存数据。
关于apache-spark - Spark SQL中缓存机制的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57419003/