2012-11-20 10 views
4

확장자를 반환하는 UDF (GetUrlExt)가 있습니다. (예 : /abc/models/xyz/images/top.jpg의 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 

'BY GROUP'이없는 쿼리가 잘 작동 :

SELECT GetUrlExt(uristem) AS extn FROM LogTable; 

결과 : JPG JPG GIF PDF PDF GIF PDF pdf jpg

이제 GetUrlExt UDF의 결과에 'GROUP BY'가 필요합니다.
예상 결과 :
JPG 3 274.6
GIF이 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);