我使用scala的jdbc从hive获取数据。在hive中,我有一个包含20行的简单表,格式如下:
用户id、电影标题、分级、日期
要按电影对用户进行分组,我执行3个嵌套的select请求:
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行的本地配置单元表上,这些嵌套查询工作26分钟!Hive先返回 user_id
一分钟后!问题:
1) 为什么Hive这么慢?
2) 有没有办法优化3个嵌套选择?
2条答案
按热度按时间bzzcjhmw1#
hive使用mapreduce框架来处理查询。您运行的每个mapreduce作业都有相当数量的固定开销。您的每一个查询(这是一个相当大的数量,因为您的嵌套)都将不得不启动一个mapreduce作业,而且无论您有多少数据,这都需要时间。
新版本的HiveReact更快,但仍然不适合这种类型的选择。
最好的办法是使用
group by
或者类似的东西。ghhkc1vu2#
通过基于select distinct查询向表中插入记录来创建两个表。第一个包含不同的用户,电影分级,其中用户\分级=用户,第二个,电影\分级=电影。这样,这两个表就可以通过连接得到所需的groupby结果。