假设我有以下SQL:
select user_group, count(*)
from table
where user_group is not null
group by user_group
Run Code Online (Sandbox Code Playgroud)
进一步假设99%的数据具有null user_group.
这会在GROUP BY之前丢弃带有null的行,还是会丢弃一个差的reducer以及之后丢弃的99%的行?
我希望它是前者.这会更有意义.
如果你说Hive版本会发生什么,奖励积分.我们使用0.11并迁移到0.13.
如果您可以指出任何确认的文档,则可以获得奖励积分.
Kis*_*ore 15
序列
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
Run Code Online (Sandbox Code Playgroud)
第一步始终是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子句.
| 归档时间: |
|
| 查看次数: |
5766 次 |
| 最近记录: |