Hive:UDF 和 GROUP BY
Posted
技术标签:
【中文标题】Hive:UDF 和 GROUP BY【英文标题】:Hive: UDF and GROUP BY 【发布时间】:2012-11-20 09:35:53 【问题描述】:我有一个返回扩展名的 UDF (GetUrlExt)。 (例如:/abc/models/xyz/images/top.jpg 中的 jpg)。 数据如下图:
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
现在我需要对 GetUrlExt UDF 的结果使用“GROUP BY”。 预期结果: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;
感谢任何形式的帮助!
【问题讨论】:
【参考方案1】:请使用子查询进行分组。
Hive 不支持直接按计算值分组。
SELECT a.extn, Count(*) AS PerCount, Avg(TimeTaken) AS AvgTime
FROM
(
SELECT GetUrlExt(uristem) AS extn, TimeTaken
FROM LogTable
) a
GROUP BY a.extn;
【讨论】:
您可以按计算值分组,只是无法使用函数为applied 的列别名。所以可以指定GROUP BY GetUrlExt(uristem)
,但子查询可能更好。
谢谢,两者在执行时间上没有太大差异。【参考方案2】:
您可以启用 group by 别名,或者您需要 group by 中的整个语句
SELECT GetUrlExt(uristem) AS extn, Count(*) AS PerCount, Avg(TimeTaken) AS AvgTime
FROM LogTable
GROUP BY GetUrlExt(uristem);
【讨论】:
以上是关于Hive:UDF 和 GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章
Hive:Hive UDF 中 CREATE FUNCTION 和 CREATE TEMPORARY FUNCTION 之间的区别