带有比较运算符的`where`子查询

时间:2014-07-08 11:27:10

标签: hive partitioning hiveql

假设我有一个由dt字段分区的大表。我想在特定日期之后查询此表中的数据。 E.g。

select * from mytab where dt >= 20140701;

棘手的部分是日期不是常量,但来自子查询。所以基本上我想要这样的东西:

select * from mytab where dt >= (select min(dt) from activedates);

Hive不能这样做,但是,在子查询上给我ParseException(来自docs,我猜它还没有支持)。

那么如何基于动态子查询限制我的查询?

请注意,性能是关键点。所以越快越好,即使它看起来更丑。

另请注意,我们还没有切换到Hive 0.13,因此首选没有in查询的解决方案。

1 个答案:

答案 0 :(得分:6)

Hive在构建执行计划时决定分区修剪,因此在执行之前必须具有max(dt)的值。

目前实现此类目标的唯一方法是将查询分为两部分,当第一部分为select min(dt) from activedates时,其结果将被放入变量中。
第二个查询将是:select * from mytab where dt >=${hiveconf:var}

现在这有点棘手 您可以执行第一个查询到OS变量,如下所示:

a=`hive -S -e "select min(dt) from activedates"`

然后像这样运行2nnd查询:

hive -hiveconf var=$a -e "select * from mytab where dt >=${hiveconf:var}"

或事件只是:

hive -e "select * from mytab where dt >=$a"

或者,如果您使用其他一些脚本语言,则可以替换代码中的变量。

相关问题