2014-12-04 74 views
0

我无法找到一种通过Hive中的有效查询来实现以下功能的方法。意向是根据加权平均得到一年内发布的最受好评的电影。在配置单元的select子句中的子查询

要更清楚这是我应该能够在单个查询配置单元中执行的操作。

var allMoviesRated = select count(movieid)where year(from_unixtime(unixtime))= 1997;

选择movieid,AVG(等级),计数(movieid),AVG(等级)/ allMoviesRated从 加权(选择movieid,等级,年(FROM_UNIXTIME(unixtime)),如从u_data年其中u_data_new.year = 1997 )由加权desc限制10的movieid顺序组成的u_data_new组;

+0

我一直在使用加入做到了。可能是一个昂贵的操作,但它的工作。 – Tejes 2014-12-05 01:47:13

回答

0

可悲..我觉得有一种方法可以在单个查询中使用子查询来计算所有评级的电影。

您可以编写一个执行2个查询的脚本 第一个查询获取allMoviesRated并存储在脚本变量中。 第二个查询是你的排名查询到这个值使用hiveconf

因此你的脚本可以像

your script.bash or python------------start-------- 
var allMoviesRated = os.cmd (hive -S "use db; select count(distinct movieid);") 
ranking = os.cmd (hive -S -hiveconf NUM_MOVIES = allMoviesRated -f ranking_query.hql) 
your script.bash or python------------end-------- 

ranking_query.hql其中通过:

select movieid, avg(rating), count(movieid), avg(rating)/${hiveconf:NUM_MOVIES }as weighted 
from (
    select movieid, rating, year(from_unixtime(unixtime)) as year 
    from u_data where u_data_new.year = 1997) u_data_new 
group by movieid order by weighted desc limit 10; 
+0

感谢您的努力。 – Tejes 2014-12-05 01:50:37