假设我有一个由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
查询的解决方案。
答案 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"
或者,如果您使用其他一些脚本语言,则可以替换代码中的变量。