如何编写Hive SQL查询,对于包含两个字段id, val
的表,将返回id-s组,其中组中的所有id-s都具有同一个val
?
以下查询:
SELECT DISTINCT m1.id,
m2.id
FROM tableX m1,
tableX m2
WHERE m1.id <> m2.id
AND m1.val = m2.val;
失败了:
FAILED: ParseException line 1:42
cannot recognize input near 'm1' ','
'match' in table source
答案 0 :(得分:0)
使用聚合,而不是联接:
SELECT m.val
FROM tableX m
GROUP BY m.val
HAVING MIN(m.id) = MAX(m.id);
HAVING
子句也可以是:
HAVING COUNT(DISTINCT id) = 1
但COUNT(DISTINCT)
通常比MIN()
/ MAX()
计算密集程度更高。
答案 1 :(得分:0)
如果您只想查看这些群组,只需写下:
select id, val
from tableX
order by val;
如果您需要将这些组分隔为不同的对象,则可以使用以下内容:
select val, collect_set(id)
from tableX
group by val;
或(如果val不重要)
select collect_set(id)
from tableX
group by val;
这些查询将生成没有重复项的id数组。 collect_list
(从hive 0.13开始)用于聚合具有重复项的集合。