>我想知道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""");
希望这有帮助。