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 中第一次创建临时表时缓存结果吗?或者它会等待任何收集应用于它?
在 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。
总而言之,您的两种方法在缓存方面是等效的,并且在运行代码块后将立即缓存数据。
| 归档时间: |
|
| 查看次数: |
1206 次 |
| 最近记录: |