我有一个 Hive 表(没有主键),看起来类似于:
X Y
-------------
1 a
2 a
2 a
1 b
1 b
2 c
2 NULL
1 NULL
2 d
请注意,X
列可以是1和2以外的值。
如果我不想GROUP BY
,查询将是:
SELECT X, Y
FROM my_table
我想对列GROUP BY
执行Y
操作,其值不是NULL
。此外,我想保留NULL
的{{1}}值。所以结果表看起来像:
Y
注意,我不关心选择哪个X.
基于this question,我的查询将是:
X Y
-------------
1 a
1 b
2 c
2 NULL
1 NULL
2 d
但是,如果SELECT
IFNULL(Y, UUID()) AS unq_Y,
any(X) AS X
FROM my_table
GROUP BY unq_Y
为unq_Y
,则UUID()
将为Y
返回,查询结果为:
NULL
我该如何避免这种情况?
答案 0 :(得分:2)
事实证明,我可以将NULL
检查放在GROUP BY
条款中:
SELECT
any(Y) AS Y,
any(X) AS X
FROM my_table
GROUP BY COALESCE(Y, CAST(reflect("java.util.UUID", "randomUUID") AS STRING));
我的Hive版本不支持IFNULL()
,因此COALESCE()
是一个不错的选择。我的版本Hive也不支持UUID()
,因此我致电reflect()
以获取唯一ID。
答案 1 :(得分:0)
如果结果集的顺序不重要,那就很简单了。只需使用union all
,如下所示:
SELECT
X AS X,
Y AS unq_Y
FROM my_table
where y is not null
GROUP BY unq_Y
union all
SELECT
X AS X,
Y AS unq_Y
FROM my_table
where y is null
;
希望它有所帮助!