SQL/HQL 计数总计无法加入

SQL/HQL Count Total Not Working on Join

我正在使用一些简单的概率公式创建推荐系统。我正在使用 Hive 将 Million Song Dataset 大型数据集(189M 行和 3 列)与我的 Hadoop 集群一起使用。这是初始数据集的示例:

million_song - 初始数据集
 user   song    play_count
 c3fb2  SOXOQ   18
 c3fb2  SOZVC   1
 6041e  SOBHN   3
 6041e  SOBXT   5

但首先我从初始数据集创建了一个 table,这里显示了一个示例:

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
我正在尝试将上面的这两个 table 加在一起,问题是我无法获得正确的 count_n_users,table 中的每一行都应该是相同的 # .这是我的代码:
 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

如果查询当前返回除该列之外的所有正确输出,并且该列在结果集的所有行上都应具有相同的值,并且可以通过 运行 查询返回只计算来自 million_song table 的所有不同用户,您可以添加一个 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;