Hive 窗口按日期回顾

问题描述 投票:0回答:1

我有下表

日期 姓名
2024-02-01 卢克
2024-02-01 爱丽丝
2024-02-01 约翰
2024-02-01 约翰
2024-02-02 马克
2024-02-02 爱丽丝
2024-02-02 马克
2024-02-03 约翰
2024-02-03 约翰
2024-02-03 爱丽丝
2024-02-04 约翰
2024-02-04 爱丽丝
2024-02-04 詹姆斯
2024-02-05 詹姆斯
2024-02-05 爱丽丝
2024-02-05 约翰
2024-02-06 马克
2024-02-06 爱丽丝
2024-02-06 马克
2024-02-06 爱丽丝
2024-02-07 约翰
2024-02-07 爱丽丝

我需要计算每个日期的不同名称的数量,回顾窗口为 3 天。这就是我想到的:

select distinct(
         date_key, 
         count(*) over (
           partition by date_key 
           order by unix_timestamp(date_key, 'yyyy-MM-dd')
           range between 259200 preceding and current row   -- 259200 is 3 days in seconds
       )
from my_schema.names_table

然而,这就是我得到的结果

{"col1":"2024-02-01","col2":4}
{"col1":"2024-02-02","col2":3}
{"col1":"2024-02-06","col2":4}
{"col1":"2024-02-07","col2":2}
{"col1":"2024-02-03","col2":3}
{"col1":"2024-02-04","col2":3}
{"col1":"2024-02-05","col2":3}

我不仅无法将其放入自己的列中,而且数字也是错误的,因为结果应该是这样的

日期 独特的名字
1/2/24 3
2/2/24 4
3/2/24 4
4/2/24 4
5/2/24 3
6/2/24 4
7/2/24 4

非常感谢任何帮助!

apache-spark apache-spark-sql hive
1个回答
0
投票

创建一个子查询,为应计入最终结果的每个名称/日期组合返回一行(在下面的代码中称为

relevant_dates
)。

然后按日期对中间结果进行分组,并计算每组中的不同名称:

WITH relevant_dates AS 
  (SELECT Name, explode(sequence(Date, date_add(Date, 2))) AS Date 
    FROM names_table)
SELECT 
  Date, 
  collect_set(Name) AS names, 
  size(collect_set(Name)) AS unique_names 
FROM 
  relevant_dates 
GROUP BY Date 
ORDER BY Date

输出:

+----------+--------------------------+------------+
|Date      |names                     |unique_names|
+----------+--------------------------+------------+
|2024-02-01|[Alice, Luke, John]       |3           |
|2024-02-02|[Mark, Alice, Luke, John] |4           |
|2024-02-03|[Mark, Alice, Luke, John] |4           |
|2024-02-04|[Mark, Alice, James, John]|4           |
|2024-02-05|[Alice, James, John]      |3           |
|2024-02-06|[Mark, Alice, James, John]|4           |
|2024-02-07|[Mark, Alice, James, John]|4           |
|2024-02-08|[Mark, Alice, John]       |3           |
|2024-02-09|[Alice, John]             |2           |
+----------+--------------------------+------------+
© www.soinside.com 2019 - 2024. All rights reserved.