假设我有以下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。
如果您可以指出任何确认的文档,则可获得积分。
答案 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)
此查询在GROUP BY操作之前丢弃带NULL的行。 希望这个链接有用: -