是否可以在 Hive 中的常量列上进行分组?

Posted

技术标签:

【中文标题】是否可以在 Hive 中的常量列上进行分组?【英文标题】:Is it possible to group by on a constant column in Hive? 【发布时间】:2017-04-17 07:08:02 【问题描述】:

我在标准非聚合表列 key1 和 key2 上运行 Hive 查询,如下所示。但我正在根据 where 条件向每个正在联合编辑的表添加一个常量类型列。

CREATE TABLE IF NOT EXISTS T_FINAL AS SELECT DISTINCT union_tbles.key1 AS key1, union_tbles.key2 AS key2, union_tbles.cnt AS cnt, union_tbles.type AS type FROM (
SELECT key1 AS key1, key2 AS key2, COUNT(val) AS cnt, 'x1' AS type FROM T_SUB1 WHERE key1 IN ('X1') GROUP BY key1, key2
UNION ALL
SELECT key1 AS key1, key2 AS key2, COUNT(val) AS cnt, 'x2' AS type FROM T_SUB1 WHERE key1 IN ('X2') GROUP BY key1, key2
) union_tbles

是否可以将常量列类型添加为分组列,如下所示? 当我尝试在 group-by 中添加常量列类型时,我在 Hive 中收到 Invalid column alias 错误。任何建议如何在 Hive 中执行此操作?

CREATE TABLE IF NOT EXISTS T_FINAL AS SELECT DISTINCT union_tbles.key1 AS key1, union_tbles.key2 AS key2, union_tbles.cnt AS cnt, union_tbles.type AS type FROM (
SELECT key1 AS key1, key2 AS key2, COUNT(val) AS cnt, 'x1' AS type FROM T_SUB1 WHERE key1 IN ('X1') GROUP BY key1, key2, type
UNION ALL
SELECT key1 AS key1, key2 AS key2, COUNT(val) AS cnt, 'x2' AS type FROM T_SUB1 WHERE key1 IN ('X2') GROUP BY key1, key2, type
) union_tbles

【问题讨论】:

"SELECT DISTINCT"? 为什么是“UNION ALL”呢? 我正在对一系列 UNION 运行 JOIN。我以两种方式运行它 - SELECT DISTINCT ( ... UNION ALL ... UNION ALL ... etc ) 和 SELECT FROM ( ... UNION DISTINCT ... UNION DISTINCT )。第一种方式的作业数为 15,而第二种方式为 25。仅添加 UNION DISTINCT 即可显着增加作业数。每个作业使用 9068 个映射器和 1009 个减速器。所以它所花费的时间非常长。所以我想减少工作的数量。 但你首先不需要distinct(group by 后不能有重复项)也不需要union all。它可以使用单个select 编写。您正在尝试从其基础调整写得不好的内容。 附言。 select distinct from?是不是缺少一些列? 【参考方案1】:

Hive 无法识别 GROUP BY 子句中的别名。 无论如何,绝对不需要按常量分组。 常量不必在 GROUP BY 子句中才能被选中。

with t as (select 1 as x)
select    x
         ,count(*)
         ,1+1
         ,'Hello'
         ,current_date()
from      t
group by  x

+---+-----+-----+-------+------------+
| x | _c1 | _c2 |  _c3  |    _c4     |
+---+-----+-----+-------+------------+
| 1 |   1 |   2 | Hello | 2017-04-17 |
+---+-----+-----+-------+------------+

【讨论】:

以上是关于是否可以在 Hive 中的常量列上进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

ActiveReport使用总结

是否可以强制 GCC 在 .rodata 中填充字符串常量

将过滤后的行乘以熊猫中的常量

如何在一个列上进行分组,在另一个列上聚合数组并创建一个由分组列作为键的 JSON 对象

PostgreSQL 选择 r.* by MIN() 并在两列上进行分组

Hive 中分析查询的限制