SQL / HQL计数总计无效加入

时间:2015-04-25 15:49:10

标签: sql hadoop hive hql

我使用一些简单的概率公式创建推荐器。我使用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

1 个答案:

答案 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;