在Scala程序中,我使用JDBC从SQL DB(Hive)中的20行的简单表中获取数据。 表格包含用户评分的电影标题,其中包含以下格式的行:
user_id,movie_title,评分,日期。
我首先启动枚举用户的JDBC游标。接下来,使用JDBC光标2,为每个用户找到他评价的电影片名。接下来,JDBC游标3,对于当前用户评定的每个标题,我找到其他用户也评价了这个标题。结果,我获得了一组用户,其中每个用户与启动该组的第一个用户评定至少一个类似的标题。我需要在数据集中存在所有这些组。
因此,要按电影对用户进行分组,我会做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行的本地表上,这些嵌套查询工作26分钟!程序在一分钟后首先返回user_id
!
假设真正的应用程序必须处理10 ^ 6个用户,在这种情况下有没有办法优化3个嵌套选择?
答案 0 :(得分:0)
没有看到确切的代码很难评估为什么这么长时间。鉴于你有20行你必须有一些根本错误的东西。
然而,作为一般建议,我建议回顾一下解决方案,并考虑是否无法使用单个SQL查询运行(而不是运行数百个查询),这将使您受益于索引并为您节省大量的网络流量。
假设您有以下表Movies(user_id: NUMERIC, movie_title: VARCHAR(50), rating: NUMERIC, date: DATE)
尝试沿着这些行运行某些内容(尚未对其进行测试,因此可能需要稍微调整一下):
SELECT DISTINCT m1.user_id, m2.user_id
FROM Movies m1, Movies m2
WHERE m1.user_id != m2.user_id
AND m1.movie_title = m2.movie_title
获得结果后,您可以先在{/ 1}}中将它们分组到Java / Scala代码中,然后将其加载到类似Multimap的数据结构中。