2015-04-04 7 views
4

Я стараюсь писать улей Sql, как этотHive: Более чистый способ выбора AS и GROUP BY

SELECT count(1), substr(date, 1, 4) as year 
FROM *** 
GROUP BY year 

Но улей не может распознать имя псевдонима 'год', он жалуется, что: FAILED: SemanticException [Ошибка 10004]: Строка 1:79 Недопустимый псевдоним таблицы или номер столбца 'год'

В одном решении (Hive: SELECT AS and GROUP BY) предлагается использовать «GROUP BY substr (date, 1, 4)».

Это работает! Однако в некоторых случаях значение, которое я хочу группу может быть получены из нескольких строк ульи коды функции, это очень некрасиво писать код как

SELECT count(1), func1(func2(..........................)) AS something 
FROM *** 
GROUP BY func1(func2(..........................)) 

Есть ли чистый путь в улей, чтобы сделать это? Какие-либо предложения?

ответ

5

Задание позиции в группе By решит вашу проблему. Этот номер позиции в группе By работает даже тогда, когда SET hive.groupby.orderby.position.alias = false; (Улей 0,12)

SELECT count(1), substr(date, 1, 4) as year 
FROM *** 
GROUP BY 2; 
+0

Удивительный. Я искал это – Sanket

+0

, это сработало для меня, но только когда свойство установлено в true – mustache1up

0

Одно решение, которое приходит на ум ставится GROUP BY на внешний запрос:

SELECT count(*) , year FROM 
(
    SELECT substr(date, 1, 4) as year FORM *** 
) inner 
GROUP BY year 

GL!

+0

Как насчет эффективности? Кажется, что Hive сначала генерирует временную таблицу с одинаковым размером, а затем выполняет операцию агрегации? – twds

+0

Вы на 100% прав, это может повлиять на неблагоприятную производительность. Но это похоже только на то, чтобы опустить использование функции в «Группе за». Вопрос в том, может ли куст оценивать значение функции дважды в вашем обычном запросе? Я предполагаю, что это оценивает его только один раз. В этом случае ваш исходный запрос кажется оптимальным. – www

3

В Hive 0.11.0 и более поздние столбцы могут быть указаны положением, если для hive.groupby.orderby.position.alias установлено значение true (по умолчанию это значение false). Таким образом, установка set hive.groupby.orderby.position.alias=true; в вашем .hql (или .hiverc для постоянного решения) сделает трюк, а затем вы можете ввести group by 2 для приведенного выше примера. hive language manual

Смежные вопросы