如何在Spark SQL中缓存WITH子句中的子查询结果



>我想知道Spark SQL是否支持WITH子句中定义的查询的缓存结果。 Spark SQL 查询如下所示:

with base_view as
(
select some_columns from some_table
WHERE 
expensive_udf(some_column) = true
)
... multiple query join based on this view

虽然此查询适用于 Spark SQL,但我注意到 UDF 多次应用于同一数据集。 在此用例中,UDF 非常昂贵。因此,我想缓存base_view的查询结果,以便后续查询将从缓存结果中受益。

附言我知道您可以使用给定的查询创建和缓存一个表,然后在子查询中引用它。但是,在这种特定情况下,我无法创建任何表或视图。

这是不可能的。WITH 结果在执行后无法持久化,也无法替换到新的 Spark SQL 调用中。

WITH 子句允许您为临时结果集指定名称,以便在单个查询中多次重用它。 我相信他所要求的是一种物化的观点。

这可以通过执行几个sql查询来完成。

-- first cache sql
spark.sql("
CACHE TABLE base_view as
select some_columns
from some_table
WHERE 
expensive_udf(some_column) = true")
-- then use
spark.sql("
... multiple query join based on this view
")

不确定您是否仍然对该解决方案感兴趣,但以下是实现相同功能的解决方法:-

spark.sql("""
| create temp view my_view
| as
| WITH base_view as
| (
| select some_columns 
| from some_table
| WHERE 
| expensive_udf(some_column) = true
| )
| SELECT *
| from base_view 
""");
spark.sql("""CACHE TABLE my_view""");

现在,您可以使用my_view临时视图连接到其他表,如下所示-

spark.sql("""
| select mv.col1, t2.col2, t3.col3
| from my_view mv
| join tab2 t2
| on mv.col2 = t2.col2 
| join tab3 t3
| on mv.col3 = t3.col3 
""");

记得在使用后uncache视图-

spark.sql("""UNCACHE TABLE my_view""");

希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新