Hive 子查询和 Group BY

Hive SubQuery and Group BY

我有两个table

table1:

id
1
2
3

table 2:

id date
1   x1
4   x2
1   x3
3   x4
3   x5
1   x6
3   x5
6   x6
6   x5
3   x6

我想要 table 2 中存在于 table 1 中的每个 ID 的计数。

结果

id  count
1   3
2   0
3   4

我正在使用这个查询,但它给我错误:

SELECT tab2.id, count(tab2.id)
 FROM <mytable2> tab2
 GROUP BY tab2.id
 WHERE tab2.id IN (select id from <mytable1>)
 ;

错误是:

missing EOF at 'WHERE' near 'di_device_id'

有两个可能的问题。 WHERE 子句中的子查询仅在 Hive 0.13 及更高版本中受支持。如果您使用的是这样的版本,那么您的问题就是 WHERE 和 GROUP BY 的方式不对:

SELECT tab2.id, count(tab2.id)
 FROM <mytable2> tab2
 WHERE tab2.id IN (select id from <mytable1>)
 GROUP BY tab2.id
 ;

如果您使用的是旧版本的 Hive,那么您需要使用 JOIN:

SELECT tab2.id, count(tab2.id)
 FROM <mytable2> tab2 INNER JOIN <mytable1> tab1 ON (tab2.id = tab1.id)
 GROUP BY tab2.id
 ;

你有两个问题:-

  1. Where 在分组依据之前。在 SQL 语法中,您使用 having 在分组依据后进行过滤!
  2. Hive 不支持 Where 子句中的所有类型的嵌套查询。看这里:Hive Subqueries

但是你的子查询类型是可以的。试试这个:-

SELECT tab2.id, count(tab2.id)
 FROM <mytable2> tab2
 WHERE tab2.id IN (select id from <mytable1>)
 GROUP BY tab2.id;

它会按照您的意思做完全相同的事情。

编辑:我刚刚检查了@MattinBit 的回答。我无意重复答案。他的回答更完整!