Spark SQL中缓存机制的区别

mar*_*e20 2 apache-spark apache-spark-sql pyspark

我正在尝试了解 Spark SQL 中的各种缓存机制。下面的代码片段有什么区别吗:

方法一:

cache table test_cache AS
select a, b, c
from x
inner join y
on x.a = y.a;
Run Code Online (Sandbox Code Playgroud)

方法二:

create temporary view test_cache AS
select a, b, c
from x
inner join y
on x.a = y.a;

cache table test_cache;
Run Code Online (Sandbox Code Playgroud)

由于 Spark 中的计算是惰性的,Spark 会在方法 2 中第一次创建临时表时缓存结果吗?或者它会等待任何收集应用于它?

Dav*_*rba 5

在 Spark SQL 中,如果直接使用 SQL 或使用 DataFrame DSL,缓存会有所不同。使用DSL,缓存是惰性的,所以调用后

my_df.cache()
Run Code Online (Sandbox Code Playgroud)

数据不会直接缓存在内存中,而是仅将有关缓存的信息添加到查询计划中,并且在对 DataFrame 调用某些操作后数据将被缓存。

另一方面,如您在示例中所做的那样直接使用 SQL,默认情况下缓存是急切的。因此,在方法 1 中,作业将立即运行,并且数据将被放入内存中。在方法 2 中,作业将在调用带有缓存的查询后运行:

cache table test_cache;
Run Code Online (Sandbox Code Playgroud)

同样使用 SQL,也可以通过显式使用关键字来使缓存变得惰性lazy

cache lazy table test_cache;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,作业不会立即运行,并且在对表调用某些操作后数据将被放入内存中test_cache

总而言之,您的两种方法在缓存方面是等效的,并且在运行代码块后将立即缓存数据。