2016-08-31 10 views
1

Если я бегомHive разделения не работает с динамическими переменными

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 трактуется как предикат, а не раздел, а улей проходит через все записи в таблице.

Это, очевидно, надуманный пример, но в моем конкретном случае это необходимо. Есть ли способ заставить куст использовать это для разделения?

Заранее благодарен.

ответ

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 
+0

'partition_variable' - это столбец, в котором происходит разбиение. Проблема заключается не в том, работает она или нет, но и вернет правильный ответ. Проблема заключается в том, что он использует 'partition_variable' как предикат, а не только для просмотра правого раздела. Таким образом, он просматривает почти 10000x количество записей, в которых он нуждается. –

+0

Можете ли вы предоставить план объяснений? –

0

Я никогда не был в состоянии получить разделение, чтобы правильно работать с динамически генерируемых улья переменных, но простое решение было создать таблицу, содержащую переменные и присоединиться на них, а не использовать их в ИНЕКЕ.