在Hive中编写带有where子句的嵌套select语句

时间:2012-09-17 07:09:30

标签: hadoop hive hiveql

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

选择*
来自TableA
其中TA_timestamp> (从TableB中选择时间戳,其中id =“hourDim”)

这是可能的,还是我在这里做错了,因为我在运行上面的脚本时遇到错误?!

为了进一步阐述我想要做的事情,我发布了一个带有时间戳的cassandra键空间。定期(例如每小时)这个统计数据将使用配置单元进行汇总,一旦总结出数据将与相应的小时分开存储。因此,当查询第二次运行(和连续运行)时,查询应该仅对新数据运行(即 - 时间戳> previous_execution_timestamp)。我试图通过将最新执行的时间戳存储在单独的配置单元表中,然后使用该值来过滤掉原始统计数据。

使用配置单元可以实现这一点吗?!

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

当分区达到数百万的规模时,分区可能会失控,但这似乎是一个不会取消这种限制的情况。

答案 2 :(得分:0)

如果您输入:

选择* 来自TableA

在TA_timestamp所在的位置(从TableB中选择timestmp,其中id =“ hourDim”)
  • EXPLANATION:由于>,<,=需要在右边有一个确切的数字,而在这里我们得到多个只能由'IN'子句使用的值。