apache-spark - Spark SQL中缓存机制的区别

标签 apache-spark pyspark apache-spark-sql

我正在尝试了解 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/

相关文章:

scala - 带 Spark 的独立 HBase,HBaseTest.scala 出错

scala - sbt - 对象 apache 不是包 org 的成员

pyspark - 如何在 palantir foundry 中使用 transform_df 写回数据帧?

scala - 带有 Hive Warehouse Connector 的 Spark 应用程序在 Hive 表中错误地保存数组和映射字段

scala - 如何计算代币?

scala - 从 Kafka 进行流聚合时在 "deadlock"中运行

scala - 如何在不同大小的数组列中随机选择元素?

python - 使用 Pyspark 创建基于分组依据的新列

apache-spark - pyspark.sql.utils.IllegalArgumentException : u'Field "features" does not exist. '

python - 有没有办法将Spark-Sql与sqlalchemy连接