2012-09-17 54 views
1

我有一个要求在Hive查询中的where子句中执行嵌套选择。示例代码片段如下所示;在Hive中使用where子句编写一个嵌套的select语句

SELECT *
从表A
其中TA_timestamp>(从表B中选择TIMESTMP其中id =“hourDim”)

这是可能的还是我在这里做得不对,因为我运行时得到一个错误上面的脚本?!

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

这可以通过配置单元实现吗?

回答

5

子查询一个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.val 
    FROM a LEFT SEMI JOIN b ON (a.KEY = b.KEY) 
+1

从Hive 0.13开始,WHERE子句支持某些类型的子查询。这些查询可以将查询结果视为IN和NOT IN语句的常量。请参阅我的答案链接了解更多详情。 – YABADABADOU

0

望着业务需求的潜在问题,它发生,你可能会使用小时你的分区表蜂房得到更有效的结果。如果可以写入数据以将此因子用作分区键,那么更新摘要的查询将快得多,并且所需资源更少。

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