【问题标题】:Hive performance optimization - CTEsHive 性能优化 - CTE
【发布时间】:2018-04-03 00:11:00
【问题描述】:

请求您深入了解如何调整 Hive CTE 以提高性能。我有一个看起来像这样的查询。编辑:请注意以下两个语句具有不同的映射条件,因此两个 WHERE 条件不能简单地与以下 cmets 中建议的 OR 条件组合。

WITH complex_query AS (
... big nasty HQL statement ...
)
SELECT complex_mapping_case FROM complex_query
WHERE condition_1
UNION ALL 
SELECT different_mapping_case FROM complex_query
WHERE condition_2
UNION ALL 
.... many more times....

Hive 是智能地执行一次 CTE 查询并将结果存储在内存中(或磁盘上),还是针对每个 WHERE 条件多次执行 CTE?

您认为将其作为 CTE 执行,还是将其实现为具有最佳索引、分桶和排序的阶段表更好?谢谢!

【问题讨论】:

  • 我认为最好的方法是将其保存为临时表。据我所知,每次引用 cte 名称时都会调用 cte 定义。
  • 如果性能是您的目标,Spark 将比 HQL 快很多...只是一个想法。

标签: sql hive common-table-expression


【解决方案1】:

我的理解是 union all 将多次运行该查询。

如果你使用它应该会更有效地执行

select * from cte
where condition_1 OR condition_2

而不是

select * from cte
where condition_1
  union all
select * from cte
where condition_2

如果您必须多次从 cte 中选择,我的理解是它每次都从磁盘读取。

我的理论(仅基于我有限的经验)是临时表的性能提升取决于您拥有多少内存和服务器设置

【讨论】:

    【解决方案2】:

    评论太长了。

    您为什么使用union all?为什么不直接使用or

    WITH complex_query AS (
    ... big nasty HQL statement ...
    )
    SELECT *
    FROM complex_query
    WHERE condition_1 OR condition_2 . . .
    

    【讨论】:

    • 对不起,我的例子过于简单......它比这更复杂。这些选择中的每一个都有不同的映射逻辑——例如,在点击流中使用正则表达式的源属性——每个场景的条件都非常不同。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2020-04-02
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多