0

我需要在 Hive 查询的 where 子句中进行嵌套选择。示例代码片段如下;

select *
from TableA
where TA_timestamp > (select timestmp from TableB where id="hourDim")

这是可能的还是我在这里做错了什么,因为在运行上述脚本时出现错误?!

为了进一步详细说明我正在尝试做的事情,有一个 cassandra 密钥空间,我发布了带有时间戳的统计信息。定期(例如每小时)此统计信息将使用 hive 进行汇总,一旦汇总,数据将与相应的小时分开存储。因此,当查询第二次(和连续运行)运行时,查询应该只在新数据上运行(即-timestamp > previous_execution_timestamp)。我试图通过将最新执行的时间戳存储在单独的配置单元表中来做到这一点,然后使用该值过滤掉原始统计信息。

这可以使用蜂巢来实现吗?!

4

3 回答 3

5

Hive 不支持WHERE子句中的子查询: https ://cwiki.apache.org/confluence/display/Hive/LanguageManual+SubQueries

但是,您通常可以使用JOIN语句来获得相同的结果: https ://karmasphere.com/hive-queries-on-table-data#join_syntax

例如,这个查询:

   SELECT a.KEY, a.value
   FROM a
   WHERE a.KEY IN
   (SELECT b.KEY FROM B);

可以改写为:

   SELECT a.KEY, a.val
   FROM a LEFT SEMI JOIN b ON (a.KEY = b.KEY)
于 2012-09-20T14:15:53.457 回答
0

查看您问题背后的业务需求,您可能会通过使用小时对 Hive 表进行分区来获得更有效的结果。如果可以写入数据以使用此因子作为分区键,那么更新摘要的查询将更快并且需要更少的资源。

当分区达到数百万的规模时,它们可能会失控,但这似乎是一个不会嘲笑这种限制的案例。

于 2015-02-28T17:17:33.540 回答
0

如果您输入,它将起作用:

select * from TableA where TA_timestamp in (select timestmp from TableB where id="hourDim")

  • 解释:因为 > , < , = 右边需要一个精确的数字,而这里我们得到多个值,只能用 'IN' 子句获取。
于 2019-04-30T12:11:46.017 回答