2012-11-20 9 views
4

У меня есть UDF (GetUrlExt), который возвращает расширение. (например: jpg в /abc/models/xyz/images/top.jpg). данные, как показано ниже:Улей: UDF и GROUP BY

Date Time TimeTaken uristem 
9/5/2011 0:00:10 234 /abc/models/xyz/images/top.jpg 
9/5/2011 0:00:11 456 /abc/models/xyz/images/bottom.jpg 
9/5/2011 0:00:14 789 /abc/models/xyz/images/left.gif 
9/5/2011 0:00:16 234 /abc/models/xyz/images/top.pdf 
9/5/2011 0:00:18 734 /abc/models/xyz/images/top.pdf 
9/5/2011 0:00:19 654 /abc/models/xyz/images/right.gif 
9/5/2011 0:00:21 346 /abc/models/xyz/images/top.pdf 
9/5/2011 0:00:24 556 /abc/models/xyz/images/front.pdf 
9/5/2011 0:00:26 134 /abc/models/xyz/images/back.jpg 

Запрос без 'GROUP BY' работает отлично:

SELECT GetUrlExt(uristem) AS extn FROM LogTable; 

Результат: JPG JPG GIF PDF PDF GIF PDF pdf jpg

Теперь мне нужно «GROUP BY» по результатам GetUrlExt UDF.
Ожидаемый результат:
JPG 3 274,6
GIF 2 721,5
PDF 4 467,5

Но следующий запрос не работает:

SELECT GetUrlExt(uristem) AS extn, Count(*) AS PerCount, Avg(TimeTaken) AS AvgTime FROM LogTable GROUP BY extn; 

Любой вид помощи оценен по достоинству!

ответ

4

Pls использует подзапрос для группировки.

Куст не поддерживает группу по вычисленному значению напрямую.

SELECT a.extn, Count(*) AS PerCount, Avg(TimeTaken) AS AvgTime 
FROM 
(
    SELECT GetUrlExt(uristem) AS extn, TimeTaken 
    FROM LogTable 
) a 
GROUP BY a.extn; 
+0

Вы можете сгруппировать по расчетному значению, просто не в состоянии использовать псевдоним столбца, на котором функция [применяется] (https://cwiki.apache.org/Hive/languagemanual-udf.html#LanguageManualUDF-GROUPingandSORTingonf%2528column%2529). Таким образом, можно указать 'GROUP BY GetUrlExt (uristem)', но подзапрос, вероятно, лучше. – libjack

+0

Спасибо, оба работали с большой разницей в времени выполнения. – Seenu

0

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

SELECT GetUrlExt(uristem) AS extn, Count(*) AS PerCount, Avg(TimeTaken) AS AvgTime 
FROM LogTable 
GROUP BY GetUrlExt(uristem);