Hadoop Hive:如何从tableX m1,tableX m2中选择?

时间:2014-04-28 10:52:58

标签: sql hadoop hive

如何编写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

2 个答案:

答案 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开始)用于聚合具有重复项的集合。