【问题标题】:Hive SubQuery and Group BYHive 子查询和 Group BY
【发布时间】:2015-08-18 15:51:22
【问题描述】:

我有两张桌子

表1:

id
1
2
3

表 2:

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

我想要表 1 中存在的表 2 的每个 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>)
 ;

错误是:

在“di_device_id”附近的“WHERE”处缺少 EOF

【问题讨论】:

  • 如果要限制表 1 中存在的 id,则需要加入表 1

标签: group-by hive in-subquery


【解决方案1】:

有两个可能的问题。仅 Hive 0.13 及更高版本支持 WHERE 子句中的子查询。如果您使用的是这样的版本,那么您的问题只是您的 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
 ;

【讨论】:

  • 谢谢。这就是问题所在,我在 group by 之后使用了“where”。非常感谢。
【解决方案2】:

你有两个问题:-

  1. Where 在 group by 之前。在 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 的答案。我不打算重复答案。他的回答更完整!

【讨论】:

  • 谢谢。这就是问题所在,我在 group by 之后使用了“where”。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多