Hive 带有比较运算符的“where”中的子查询

Hive 带有比较运算符的“where”中的子查询,hive,partitioning,hiveql,Hive,Partitioning,Hiveql,假设我有一个由dt字段划分的大表。我想查询此表中特定日期之后的数据。例如 select * from mytab where dt >= 20140701; 棘手的是,日期不是一个常数,但来自子查询。所以基本上我想要这样的东西: select * from mytab where dt >= (select min(dt) from activedates); 然而,Hive无法做到这一点,在子查询上给了我ParseException(从文档中我猜它还不受支持) 那么,如何限制基

假设我有一个由
dt
字段划分的大表。我想查询此表中特定日期之后的数据。例如

select * from mytab where dt >= 20140701;
棘手的是,日期不是一个常数,但来自子查询。所以基本上我想要这样的东西:

select * from mytab where dt >= (select min(dt) from activedates);
然而,Hive无法做到这一点,在子查询上给了我
ParseException
(从文档中我猜它还不受支持)

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

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


还要注意,我们还没有切换到Hive 0.13,因此在查询中没有
的解决方案是首选

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

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

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

a=`hive -S -e "select min(dt) from activedates"`
hive -hiveconf var=$a -e "select * from mytab where dt >=${hiveconf:var}"
然后按如下方式运行第2个查询:

a=`hive -S -e "select min(dt) from activedates"`
hive -hiveconf var=$a -e "select * from mytab where dt >=${hiveconf:var}"
或者只是:

hive -e "select * from mytab where dt >=$a"
或者,如果使用其他脚本语言,可以替换代码中的变量