【问题标题】:SQL/HQL Count Total Not Working on JoinSQL/HQL 计数总计不适用于连接
【发布时间】:2015-04-25 15:49:10
【问题描述】:

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

【问题讨论】:

  • 您能否编辑带有实际说明您期望输出的原因的示例数据?我不知道“将这两个表加在一起”是什么意思。例如,在您的第一行预期输出中,play_count 1,643 是多少?
  • count_n_users 应该返回什么?它与倒数第二列有何不同?
  • @Codo count_n_users 假设代表million_song(初始数据集)中的计数(不同用户)
  • @BrianDeMilia 我列出的最后一个输出是我所期望的。上面的 SQL 正确输出了前四列,但我无法得到第五列。
  • 然后你必须解释你如何从你提供的数据中得到你期望的结果。从您发布的内容中显然不清楚。 1642 + 18 不等于 1643。1642 + 5 不等于 1643。两者之和不等于 1643。显然,这个 1.397 亿的数字不能从您发布的任何内容中得出。

标签: sql hadoop hive hql


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多