我使用一些简单的概率公式创建推荐器。我使用Hive在我的Hadoop集群中使用Million Song Dataset大数据集(189M行和3列)。以下是初始数据集的示例:
million_song - 初始数据集 user song play_count
c3fb2 SOXOQ 18
c3fb2 SOZVC 1
6041e SOBHN 3
6041e SOBXT 5
但首先我从初始数据集创建了一个表,其中显示了一个示例:
million_both - 加上同一用户收听的两首歌曲的出现次数 driver_song_id also_song_id play_count
SOXOQ SOBXT 1642
SOBHN SOBXT 2168
SOBXT SOZVC 1742
得到所有不同的用户(我希望这个值显示在最终输出的第五列的所有行中)
select count(distinct users) from million_song;
# 139,738,054
我试图将这两个表一起添加到上面,问题是我无法获得正确的count_n_users,对于表中的每一行,它应该是相同的#。这是我的代码:
select a.driver_song_id, a.also_song_id, a.play_count,
count(distinct b.user), sum(distinct b.user) as count_n_users
from (select driver_song_id, also_song_id, play_count from million_both) as a
join (select user, song, play_count from expp_team.million_song) as b
on a.driver_song_id = b.song
group by a.driver_song_id, a.also_song_id, a.play_count;
问题我无法获得正确的count_n_users,因为它现在已经夸大了这个值。
这就是我希望输出的样子:
driver_song_id also_song_id play_count c(b.user) count_n_users
SOXOQ SOBXT 1643 463 139,738,054
SOBHN SOBXT 2168 483 139,738,054
SOBXT SOZVC 1742 725 139,738,054
答案 0 :(得分:0)
如果查询当前正在返回除该列之外的所有正确输出,并且该列在结果集的所有行上应具有相同的值,并且可以通过运行仅计算所有不同用户的查询来返回该查询您可以在million_song
表中添加cross join
,其中包含抓取该总计数的查询。这可以避免group by
的问题,而这正是您可能遇到的问题。
select a.driver_song_id,
a.also_song_id,
a.play_count,
count(distinct b.user),
c.count_n_users
from (select driver_song_id,
also_song_id,
play_count
from million_both) as a
join (select user,
song,
play_count
from expp_team.million_song) as b
on a.driver_song_id = b.song
cross join (select count(distinct users) as count_n_users from million_song) c
group by a.driver_song_id,
a.also_song_id,
a.play_count;