GROUP BY子句是否在Hive中的WHERE子句之后应用?

时间:2015-05-27 05:02:54

标签: hive hiveql

假设我有以下SQL:

select user_group, count(*)
from table
where user_group is not null
group by user_group

进一步假设99%的数据具有null user_group。

这会在GROUP BY之前丢弃带有null的行,还是会丢弃一个差的reducer,最后会丢弃99%的行?

我希望它是前者。这会更有意义。

如果你说Hive版本将会发生什么,那么

奖励积分。我们使用0.11并迁移到0.13。

如果您可以指出任何确认的文档,则可获得积分。

2 个答案:

答案 0 :(得分:14)

序列

FROM & JOINs determine & filter rows
WHERE more filters on the rows
GROUP BY combines those rows into groups
HAVING filters groups
SELECT
ORDER BY arranges the remaining rows/groups

第一步始终是FROM子句。在你的情况下,这是非常简单的,因为只有一个表,并没有任何复杂的连接担心。在具有连接的查询中,将在第一步中评估这些连接。组合连接以决定要检索哪些行,ON子句条件是决定从每个表连接哪些行的标准。 FROM子句的结果是中间结果。您可以将此视为临时表,由满足所有连接条件的组合行组成。 (在您的情况下,临时表实际上并未构建,因为优化器知道它可以直接访问您的表而无需加入任何其他表。)

下一步是WHERE子句。在具有WHERE子句的查询中,中间结果中的每一行都根据WHERE条件进行计算,并被丢弃或保留。因此,在转到Group by子句

之前,将丢弃null

接下来是GROUP BY。如果存在GROUP BY子句,则中间结果现在被分组为组,GROUP BY子句中的每个值组合都有一个组。

现在出现了HAVING子句。 HAVING子句在每个组上运行一次,并且消除了不满足HAVING子句的组中的所有行。

接下来是SELECT。从GROUP BY和HAVING子句生成的新中间结果的行中,SELECT现在可以组装所需的列。

最后,最后一步是ORDER BY子句。

答案 1 :(得分:0)