Hive Получение ошибки для группы по столбцу при использовании инструкций и агрегатов - PullRequest
0 голосов
/ 12 октября 2018

Я работаю над запросом в улье.В этом я использую агрегаты, такие как операторы sum и case и group by.Я изменил имена столбцов и имена таблиц, но моя логика та же, что и в моем проекте

select 
empname,
empsal, 
emphike,
sum(empsal) as tot_sal,
sum(emphike) as tot_hike,
case when tot_sal > 1000 then exp(tot_hike)
else 0
end as manager
from employee
group by 
empname,
empsal,
emphike

. В приведенном выше запросе я получаю сообщение об ошибке «Выражение не в группе по ключу« 1000 »»,Поэтому я немного изменил запрос и повторил попытку. Другой мой запрос -

select 
empname,
empsal, 
emphike,
sum(empsal) as tot_sal,
sum(emphike) as tot_hike,
case when sum(empsal) > 1000 then exp(sum(emphike))
else 0
end as manager
from employee
group by 
empname,
empsal,
emphike

. Для вышеприведенного запроса он выдает ошибку «Выражение не в группе по ключу« Менеджер »».Когда я добавляю менеджера в группу, он показывает неверный псевдоним.Пожалуйста, помогите мне здесь

1 Ответ

0 голосов
/ 12 октября 2018

Я вижу три вопроса в вашем запросе:

1.) Hive не может сгруппировать по переменной, которую вы определили в блоке выбора по имени, которое вы дали ему сразу.Для этого вам, вероятно, понадобится подзапрос.

2.) Hive склонен показывать ошибки, когда операции sum или count не находятся в конце запроса.

3.)Хотя я не знаю, какова ваша цель, я думаю, что ваш запрос не даст желаемого результата.Если вы сгруппируете по empsal, то не будет никакой разницы между empsal и sum(empsal) по дизайну.То же самое касается emphike и sum(emphike).

Я думаю, что следующий запрос может решить эти проблемы:

select
a.empname,
a.tot_sal, 
a.tot_hike,
if(a.tot_sal > 1000, exp(a.tot_hike), 0) as manager
from
(select 
empname,
sum(empsal) as tot_sal,
sum(emphike) as tot_hike,
from employee
group by 
empname
)a

Оператор if эквивалентен вашему выражению case,однако я нахожу это немного легче для чтения.

В этом примере вам не нужно группировать после подзапроса, потому что группировка выполняется в подзапросе a.

...