我使用的是ApacheHive,我有这样一个查询:
SELECT CASE type WHEN 'a' THEN 'A'
WHEN 'b' THEN 'B'
ELSE 'C'
END AS map_type
,COUNT(user_id) AS count
FROM user_types
GROUP BY CASE type WHEN 'a' THEN 'A'
WHEN 'b' THEN 'B'
ELSE 'C'
END
;
如您所见,我需要按 map_type
字段,以复杂方式计算。对我来说 CASE WHEN
零件 SELECT
以及 GROUP BY
计算两次?如果我使用下面这样的子查询,效率会更高吗?
SELECT map_type
,COUNT(user_id) AS count
FROM (
SELECT CASE type WHEN 'a' THEN 'A'
WHEN 'b' THEN 'B'
ELSE 'C'
END AS map_type
,user_id
FROM user_types
) a
GROUP BY map_type;
3条答案
按热度按时间33qvvth11#
第二个查询(包括子查询)的性能可能更高。这是基于hive的explain计划的解释,并运行这些查询几次。
查询1的解释计划(不带子查询)包含以下部分:
另一方面,查询2的同一部分(以及子查询)有以下内容:
根据计划,查询2所做的工作似乎稍微少了一些。
还对虚拟数据运行了一个测试,得到了这些执行时间。
在所有情况下,查询2完成得更快。
dwbf0jvd2#
case语句在您的案例中是无害的,但是如果您要使用子查询,它可能会增加时间
你可以继续
5tmbdcev3#
进行聚合的开销包括读取大量的数据。然后对其进行排序或散列以将键组合在一起。然后引擎需要处理数据并计算计数。
是否
case
表达式被调用一次或两次在所有数据移动的上下文中都是毫无意义的。别担心。如果有额外的工作,那么与查询所需的所有其他工作相比,这是微不足道的。我还认为hive支持
GROUP BY
,但我可能弄错了。