我使用Scala中的JDBC从Hive获取数据。在Hive中,我有一个包含以下格式的20行的简单表:
user_id,movie_title,评分,日期
要按电影分组用户,我会做3个嵌套选择请求:
1) select distinct user_id
2) for each user_id:
select distinct movie_title //select all movies that user saw
3) for each movie_title:
select distinct user_id //select all users who saw this movie
在20行的本地Hive表上,这些嵌套查询工作26分钟! Hive在一分钟后首先返回user_id
!问题:
1)为什么Hive这么慢?
2)有什么方法可以优化3个嵌套选择?
答案 0 :(得分:0)
Hive使用MapReduce框架来处理查询。您运行的每个MapReduce作业都附加了相当数量的常量开销。您的每个查询(由于您的嵌套都是相当数量的)将不得不启动MapReduce作业,无论您拥有多少数据,这都需要时间。
较新版本的Hive响应速度更快,但仍不适合此类选择。
您最好的办法是尝试使用group by
或类似内容来尽量减少查询次数。
答案 1 :(得分:0)
通过根据选择的不同查询将记录插入其中来创建两个表。首先包含不同的用户,电影评级为user_rated = user,second,movie_rated = movie。这样,可以连接这两个表以通过结果获得所需的组。