Hive中的WHERE子句之后是否应用了GROUP BY子句?
Is the GROUP BY clause applied after the WHERE clause in Hive?
假设我有以下 SQL:
select user_group, count(*)
from table
where user_group is not null
group by user_group
进一步假设99%的数据为空值user_group。
这会丢弃 GROUP BY 之前的空行,还是一个糟糕的 reducer 最终会丢弃 99% 的行?
希望是前者。那会更有意义。
如果您说出 Hive 版本会发生什么,可加分。我们正在使用 0.11 并迁移到 0.13。
如果您能指出任何可证实的文件,可加分。
此查询在 GROUP BY 操作之前丢弃具有 NULL 的行。
希望这篇 link 有用:-
序列
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 子句。在您的情况下,这非常简单,因为只有一个 table,并且无需担心任何复杂的连接。在带有连接的查询中,这些是在第一步中评估的。组合连接以决定检索哪些行,ON 子句条件是决定从每个 table 连接哪些行的标准。 FROM 子句的结果是一个中间结果。您可以将其视为临时 table,由满足所有连接条件的组合行组成。 (在您的情况下,临时 table 并未实际构建,因为优化器知道它可以直接访问您的 table 而无需加入任何其他人。)
下一步是 WHERE 子句。在带有 WHERE 子句的查询中,中间结果中的每一行都根据 WHERE 条件进行评估,然后丢弃或保留。所以 null 将在进入 Group by clause
之前被丢弃
接下来是 GROUP BY。如果有 GROUP BY 子句,中间结果现在被分成几组,一组对应 GROUP BY 子句中列中值的每个组合。
现在是 HAVING 子句。 HAVING 子句在每个组上运行一次,组中不满足 HAVING 子句的所有行都将被淘汰。
接下来是 SELECT。根据 GROUP BY 和 HAVING 子句生成的新中间结果的行,SELECT 现在组装它需要的列。
最后,最后一步是 ORDER BY 子句。
假设我有以下 SQL:
select user_group, count(*)
from table
where user_group is not null
group by user_group
进一步假设99%的数据为空值user_group。
这会丢弃 GROUP BY 之前的空行,还是一个糟糕的 reducer 最终会丢弃 99% 的行?
希望是前者。那会更有意义。
如果您说出 Hive 版本会发生什么,可加分。我们正在使用 0.11 并迁移到 0.13。
如果您能指出任何可证实的文件,可加分。
此查询在 GROUP BY 操作之前丢弃具有 NULL 的行。 希望这篇 link 有用:-
序列
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 子句。在您的情况下,这非常简单,因为只有一个 table,并且无需担心任何复杂的连接。在带有连接的查询中,这些是在第一步中评估的。组合连接以决定检索哪些行,ON 子句条件是决定从每个 table 连接哪些行的标准。 FROM 子句的结果是一个中间结果。您可以将其视为临时 table,由满足所有连接条件的组合行组成。 (在您的情况下,临时 table 并未实际构建,因为优化器知道它可以直接访问您的 table 而无需加入任何其他人。)
下一步是 WHERE 子句。在带有 WHERE 子句的查询中,中间结果中的每一行都根据 WHERE 条件进行评估,然后丢弃或保留。所以 null 将在进入 Group by clause
之前被丢弃接下来是 GROUP BY。如果有 GROUP BY 子句,中间结果现在被分成几组,一组对应 GROUP BY 子句中列中值的每个组合。
现在是 HAVING 子句。 HAVING 子句在每个组上运行一次,组中不满足 HAVING 子句的所有行都将被淘汰。
接下来是 SELECT。根据 GROUP BY 和 HAVING 子句生成的新中间结果的行,SELECT 现在组装它需要的列。
最后,最后一步是 ORDER BY 子句。