Hive 配置单元:查找不包括重复项的运行总数
嗨,我手头有一个非常奇怪的问题,我找不到解决办法。我有一个表UserViews,其中包含以下列:Hive 配置单元:查找不包括重复项的运行总数,hive,cumulative-sum,Hive,Cumulative Sum,嗨,我手头有一个非常奇怪的问题,我找不到解决办法。我有一个表UserViews,其中包含以下列: Progdate(String) UserName(String) 表中的虚拟数据: Progdate UserName 20161119 A 20161119 B 20161119 C 20161119 B 20161120 D 20161120 E 20161120 A 20161121 B 20161121 A 20161121
Progdate(String)
UserName(String)
表中的虚拟数据:
Progdate UserName
20161119 A
20161119 B
20161119 C
20161119 B
20161120 D
20161120 E
20161120 A
20161121 B
20161121 A
20161121 B
20161121 F
20161121 G
每次用户查看程序时,表中都有一个条目。例如,在11月19日,用户A观看了该节目一次,因此只有一个条目。用户B观看了两次该节目,因此该用户在11月19日有两个条目,以此类推
Select Progdate, count(distinct UserName) UniqueUsersByDate
from UserViews
group by Progdate;
以上查询将为我提供观看该节目的所有独特用户的日期统计
Progdate UniqueUsersByDate
20161119 3
20161120 3
20161121 4
以下查询:
Select Progdate, UniqueUsersByDate, Sum(UniqueUsersByDate) over(Order By Progdate) RunningTotalNewUsers
from
(
Select Progdate, count(distinct UserName) UniqueUsersByDate
from
UserViews
group by Progdate SORT BY Progdate
) UV;
将给我以下结果:
Progdate UniqueUsersByDate RunningTotalNewUsers
20161119 3 3
20161120 3 6
20161121 4 10
但是我想要的是第一次看这个节目的所有用户的总数。表示如果用户A在20161119上观看了该节目,然后又在20161120上观看了该节目,则该用户的计数不应在20161120的运行总数中重复。因此,我想从上表中得到的结果是:
Progdate UniqueUsersByDate RunningTotalNewUsers
20161119 3 3
20161120 3 5
20161121 4 7
我只在HIVE HQL中寻找解决方案。非常感谢您对这个问题的任何意见
谢谢
select Progdate
,UniqueUsersByDate
,sum(Users1stOcc) over
(
order by Progdate
) as RunningTotalNewUsers
from (select Progdate
,count (distinct UserName) as UniqueUsersByDate
,count (case when rn = 1 then 1 end) as Users1stOcc
from (select Progdate
,UserName
,row_number() over
(
partition by UserName
order by Progdate
) as rn
from UserViews
) uv
group by Progdate
) uv
;
附言。
从理论上讲,聚合和SUM分析函数的使用不需要额外的子查询,但解析器似乎存在一个问题bug/特性。
请注意,附加的子查询不一定表示附加的执行阶段,例如select*from select*from select*from select*from select*from select*from TTT;并选择*from t将具有相同的执行计划。是否以非ISO格式将日期存储为字符串或其他形式?数据库已创建。我没有任何发言权:我只需要处理现有的问题。顺便说一句,这只是实际表格的缩小版本。实际表有大约50多列。我刚刚发布了相关的一次,让它变得简单。您设计的查询给出了预期的答案。这个查询很复杂,我需要一些时间来消化和理解。一些解释会有助于理解。不过,谢谢你的帮助。
+-------------+--------------------+-----------------------+
| progdate | uniqueusersbydate | runningtotalnewusers |
+-------------+--------------------+-----------------------+
| 2016-11-19 | 3 | 3 |
| 2016-11-20 | 3 | 5 |
| 2016-11-21 | 4 | 7 |
+-------------+--------------------+-----------------------+