在这种情况下我应该使用子查询吗?

h9vpoimq  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(382)

我使用的是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;
33qvvth1

33qvvth11#

第二个查询(包括子查询)的性能可能更高。这是基于hive的explain计划的解释,并运行这些查询几次。
查询1的解释计划(不带子查询)包含以下部分:

Group By Operator [GBY_2]
                     aggregations:["count(user_id)"]
                     keys:CASE (type) WHEN ('a') THEN ('A') WHEN ('b') THEN ('B') ELSE ('C') END (type: string)

另一方面,查询2的同一部分(以及子查询)有以下内容:

Group By Operator [GBY_3]
                     aggregations:["count(_col1)"]
                     keys:_col0 (type: string)

根据计划,查询2所做的工作似乎稍微少了一些。
还对虚拟数据运行了一个测试,得到了这些执行时间。

Query 1: (1st time) 6.43 s, (2nd time) 5.92 s, (3rd time): 4.30s
Query 2: (1st time) 0.82 s, (2nd time) 1.29 s, (3rd time): 1.03s

在所有情况下,查询2完成得更快。

dwbf0jvd

dwbf0jvd2#

case语句在您的案例中是无害的,但是如果您要使用子查询,它可能会增加时间
你可以继续

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
;
5tmbdcev

5tmbdcev3#

进行聚合的开销包括读取大量的数据。然后对其进行排序或散列以将键组合在一起。然后引擎需要处理数据并计算计数。
是否 case 表达式被调用一次或两次在所有数据移动的上下文中都是毫无意义的。别担心。如果有额外的工作,那么与查询所需的所有其他工作相比,这是微不足道的。
我还认为hive支持 GROUP BY ,但我可能弄错了。

相关问题