不同时间段不同计数时的不同结果

Posted

技术标签:

【中文标题】不同时间段不同计数时的不同结果【英文标题】:Different results when distinct count by different time periods 【发布时间】:2018-10-13 18:15:49 【问题描述】:

我正在尝试计算唯一身份访问者的数量。我首先按总检查它,而没有按任何时间框架将其分开。

主表(大数据表示例):

+-----------+----+-------+
|theDateTime|vD  | vis   |
+----------------+-------+
|2018-10-03 |123 |abc    |
|2018-10-04 |123 |abc    |
|2018-10-04 |123 |pqr    |
|2018-10-05 |123 |xyz    |
+-----------+----+-------+

上述的总不同计数将为 3,但当我按天分组时,abc 被计数两次。先是3号,然后是2号。我只想计算第一个。

我的总计查询:

select
  d.eId AS vD
  , COUNT(DISTINCT visitorId) AS vis
 from decisions  
 WHERE d.eId = 123 
 AND timestamp BETWEEN unix_timestamp('2018-10-03 00:00:00')*1000 AND 
 unix_timestamp('2018-10-06 12:17:00')*1000
 GROUP BY d.eId
 ORDER BY vId

我的结果:

+----+---------+
| vD | vis     |
+----+---------+
|123 | 3       |
+----+---------+

我的每日查询:

select DISTINCT
cast(from_unixtime(timestamp DIV 1000) AS date) AS theDateTime
, d.eId AS vD
, COUNT(DISTINCT visitorId) AS vis
from decisions  
WHERE timestamp BETWEEN unix_timestamp('2018-10-03 00:00:00')*1000 AND 
unix_timestamp('2018-10-06 12:17:00')*1000
AND d.eId IN (11550123588)
GROUP BY cast(from_unixtime(timestamp DIV 1000) AS date), 
d.vD
ORDER BY vD, theDateTime  

我的结果:

+-----------+----+-------+
|theDateTime|vD  | vis   |
+----------------+-------+
|2018-10-03 |123 |   1   |
|2018-10-04 |123 |   2   |
|2018-10-05 |123 |   1   |
+-----------+----+-------+

总共是 1122585。比总和还多

我知道这是因为以防万一访客在不同的日子重复,当我按天分组时,他会被计算两次。如果他已经在第 1 天计算,我有没有办法在第 2 天不计算访客?

请帮忙!

【问题讨论】:

你的数据是什么样的? @sramalingam24 我已经添加了。 【参考方案1】:

如果我理解正确的话,您只需要不同的数据视图。

val df = Seq(("2018-10-03",123,"abc"),
("2018-10-04",123,"abc"),
("2018-10-05",123,"pqr"),
("2018-10-06",123,"xyz")).toDF("theDateTime","vD","vis").withColumn("theDateTime", $"theDateTime".cast("timestamp"));

df.show

import org.apache.spark.sql.functions._
val df1 = df.groupBy("vis").pivot("vD").agg(min("theDateTime")).sort($"123")
df1.show

+---+-------------------+
|vis|                123|
+---+-------------------+
|abc|2018-10-03 00:00:00|
|pqr|2018-10-05 00:00:00|
|xyz|2018-10-06 00:00:00|
+---+-------------------+

现在,如果您按“123”分组,您将能够获得每天的唯一计数。 这有帮助吗?

【讨论】:

【参考方案2】:

如果我理解正确,您可以在 SQL 中使用子查询来执行此操作:

select min_dt, count(distinct visitorId) AS vis
from (select eid, vis, min(thedatetime) as min_dt
      from decisions d
      where d.eid = 123 and . . .
      group by vis, eid
     ) d
group by min_dt

【讨论】:

以上是关于不同时间段不同计数时的不同结果的主要内容,如果未能解决你的问题,请参考以下文章

测量 .AsParallel() 时的不同结果

Grails distinct projection 获取不同项目的结果计数

在使用子句时计数不同

如何在同一张表上计算不同结果的计数[重复]

两个语句返回两个不同结果时的MYSQL存储过程优化

UDF - 自动运行时的结果与遍历时的结果不同