代码之家  ›  专栏  ›  技术社区  ›  MiamiBeach

ApacheSpark:“使用as”vs“缓存”

  •  0
  • MiamiBeach  · 技术社区  · 5 年前

    “With as”SQL子句,也称为CTE,被认为是提高查询可读性的便捷方法。据我所知,在经典的SQL中,CTE结果不会被缓存,每个CTE只是被相关的SQL替换,并且 不是结果集 相关SQL的定义。

    鉴于我的Spark SQL中有一个CTE:

    with myCTE as (select * from someTable)
    

    CTE的结果集不会被缓存,每次我都会从中选择——Spark会再次读取该表。对的

    0 回复  |  直到 5 年前
        1
  •  1
  •   leftjoin    5 年前

    您可以控制CTE是否在蜂箱中具体化,并将其缓存在Spark中。

    在hive中,CTE的结果可以在主查询执行之前具体化,默认情况下,此功能已禁用,请使用以下配置参数:

    set hive.optimize.cte.materialize.threshold=1; 
    

    如果对CTE子句的引用数超过此阈值,配置单元将在执行主查询块之前将其具体化。 -1 将禁用此功能。

    在Spark SQL中,您可以 cache table 并在其他查询中多次使用它。