Hive通过查询获取组中的前n个记录

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)

  • 我只是花了几个小时来完成这项工作,但它没有用.错误是你首先排名,然后做DISTRIBUTE BY和SORT BY.相反,您应该在外部查询中应用rank,并在内部查询中使用DISTRIBUTE BY和SORT BY.例如,SELECT page-id,user-id,单击FROM(SELECT page-id,user-id,rank(user-id)作为排名,单击FROM(SELECT*FROM mytable DISTRIBUTE BY page-id,user-id SORT BY page-id,user-id,点击DESC)a)b WHERE rank <5 ORDER BY page-id,rank; (10认同)
  • 确认@HimanshuGahlot是正确的.答案有*BUG*!您必须在外部查询中使用rank()并在内部查询中使用DISTRIBUTE/SORT BY! (2认同)