Hive分区不使用动态变量

时间:2016-08-31 22:18:34

标签: hadoop mapreduce hive tez

如果我跑

set hivevar:a = 1;
select * from t1 where partition_variable=${a};

Hive只从适当的分区中提取记录。 或者如果我跑

set hivevar:b = 6;
set hivevar:c = 5;
set hivevar:a = ${b}-${c};
select * from t1 where partition_variable=${a};

partition_variable上的条件被视为谓词而不是分区,而hive会遍历表中的所有记录。

这显然是一个人为的例子,但在我的特定用例中,这是必要的。反正是否强迫配置单元用于分区?

提前致谢。

2 个答案:

答案 0 :(得分:0)

分区变量是发生分区的列。它适用于以下。

create table newpart
(productOfMonth string)
partitioned by (month int);


hive> select * from newpart;
OK
Cantaloupes 10 
Pumpkin     11

set hivevar:lastmonth = 11;
set hivevar:const = 1;
set hivevar:prevmonth = ${lastmonth}-${const};

hive> select * from newpart
    > where month = ${prevmonth};
OK
Cantaloupes 10

答案 1 :(得分:0)

我无法通过动态生成的hive变量使分区正常工作,但一个简单的解决方法是创建一个包含变量的表并加入它们而不是在where子句中使用它们。