蜂巢在每个组中最受欢迎

时间:2019-08-11 17:50:49

标签: sql hive group-by max hiveql

我有三个桌子

int index = Interger.ParseInt(request.getParameter("index"));

if(index <= 0){
   datalist = datalist(0, 19>datalist.size()? datalist.size() : 19);
}else{

   if(clicked_on_next){

      datalist = datalist(index, index+19>datalist.size()? datalist.size() : index+19 );

   }else{

      datalist = datalist(index - 40, index-20>datalist.size()? datalist.size() : index-20 );

   }

}

我必须找到     以下年龄组中最受欢迎的作者:     少于10年     10至18岁     19至35岁     36至45岁     46岁以上     其中最受欢迎的作者是获得最高评分> = 6

的作者

我尝试了以下代码。

BX-Books.csv
ISBN, Book-Title, Book-Author, Year-Of-Publication, Publisher
BX-Book-Ratings.csv
User-ID ISBN Book-Rating
BX-Users.csv
User-ID Location Age

但这只是给我最高的评价。

任何人都可以告诉我如何解决此问题,因为我已经使用了三个子查询,但我知道这很丑陋

我想要每个年龄段的最高人群。

1 个答案:

答案 0 :(得分:2)

查询的主要问题是cassandra.yaml中缺少的partition by和子查询中的row_number()。此外,您应该算账本,而不是对收视率求和:

limit

我还介绍了表别名,以便查询更易于读写。

我不记得Hive是否在select aa.* from (select author, age_range, count(*) as num_books row_number() over (partition by age_range order by count(*) desc) as seqnum from (select (case when u.age < 10 then 'Under 10' when u.age between 10 and 18 then '10-18' when u.age between 19 and 35 then '29-35' when u.age between 36 and 45 then '36-45' when u.age > 45 then '46 and above' end) as age_range, b.book_author, b.book_rating from bx_books b join bx_books_ratings br on b.ISBN = br.ISBN join bx_user u on u.user_id = br.user_id where br.book_rating >= 6 ) b group by book_author, age_range ) aa where seqnum = 1; 子句中允许列别名。如果是这样,则可以轻松删除一级子查询。