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"
或者,如果使用其他脚本语言,可以替换代码中的变量