Top*_*der 22 hive user-defined-functions rank
我在hive中有下表
用户ID,用户名,用户地址,点击次数,展示次数,页面ID,页面名称
我需要通过每个页面的点击次数找到前5位用户[user-id,用户名,用户地址] [page-id,page-name]
我知道我们需要先按[page-id,page-name]进行分组,然后在每个组中我想通过[clicks,impressions] desc排序,然后只排出前5位用户[user-id,user-name,user-地址]为每个页面,但我发现很难构建查询.
我们怎么能用HIve UDF做到这一点?
Hai*_*inh 15
修改了答案,修复了@Himanshu Gahlot提到的错误
SELECT page-id, user-id, clicks
FROM (
SELECT page-id, user-id, rank(page-id) as rank, clicks FROM (
SELECT page-id, user-id, clicks FROM mytable
DISTRIBUTE BY page-id
SORT BY page-id, clicks desc
) a ) b
WHERE rank < 5
ORDER BY page-id, rank
Run Code Online (Sandbox Code Playgroud)
请注意,rank()UDAF应用于page-id列,其新值用于重置或增加秩计数器(例如,每个page-id分区的重置计数器)
Eli*_*Eli 12
从Hive 0.11开始,您可以使用Hive的内置rank()函数并使用Hive的内置Analytics和Windowing函数使用更简单的语义.可悲的是,我找不到尽可能多的这些例子,但我们真的很有用.使用它们,内置了rank()和WhereWithRankCond,所以你可以这样做:
SELECT page-id, user-id, clicks
FROM (
SELECT page-id, user-id, rank()
over (PARTITION BY page-id ORDER BY clicks DESC) as rank, clicks
FROM my table
) ranked_mytable
WHERE ranked_mytable.rank < 5
ORDER BY page-id, rank
Run Code Online (Sandbox Code Playgroud)
不需要UDF,只有一个子查询!此外,所有等级逻辑都是本地化的.
你可以在这个Jira和这个人的博客上找到更多(虽然不够我喜欢)这些函数的例子.
小智 9
您可以使用此处描述的rank()UDF来执行此操作:http://ragrawal.wordpress.com/2011/11/18/extract-top-n-records-in-each-group-in-hadoophive/
SELECT page-id, user-id, clicks
FROM (
SELECT page-id, user-id, rank(user-id) as rank, clicks
FROM mytable
DISTRIBUTE BY page-id, user-id
SORT BY page-id, user-id, clicks desc
) a
WHERE rank < 5
ORDER BY page-id, rank
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
42525 次 |
最近记录: |