如何在 Spark SQL 中的 WITH 子句中缓存子查询结果
Posted
技术标签:
【中文标题】如何在 Spark SQL 中的 WITH 子句中缓存子查询结果【英文标题】:How to cache subquery result in WITH clause in Spark SQL 【发布时间】:2019-02-17 21:30:26 【问题描述】:我想知道 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的查询结果,以便后续查询可以从缓存的结果中受益。
附:我知道您可以使用给定的查询创建和缓存一个表,然后在子查询中引用它。但是,在这种特定情况下,我无法创建任何表或视图。
【问题讨论】:
Mark your UDF as nondeterministic? 这有什么帮助? 我的回答有帮助吗? 【参考方案1】:这是不可能的。 WITH 结果在执行后不能持久化或替换到新的 Spark SQL 调用中。
【讨论】:
【参考方案2】:WITH 子句允许您为临时结果集命名,以便在单个查询中多次重复使用它。我相信他要求的是物化视图。
【讨论】:
请提供一个例子,我将撤回我的答案并予以纠正。【参考方案3】:这可以通过执行几个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 中的 WITH 子句中缓存子查询结果的主要内容,如果未能解决你的问题,请参考以下文章
哪个更快? Spark SQL with Where 子句或在 Spark SQL 之后在 Dataframe 中使用过滤器