如果时间间隔很小,则计算事件聚集的事件
counting events where events are bunched if there is a small time gap
我正在尝试使用 HIVE 计算我的数据集中出现了多少 'Uses'。
我的数据中有个人用户 ID 列、unix 纪元时间戳、事件名称和事件长度(以秒为单位)。
'Use' 被认为是用户触发事件的任何时候。问题是,如果一个用户触发了一个事件,然后在五分钟内触发了另一个事件,我将算作相同的 'Use'
我在数数时脑子里很难弄清楚如何计算这五分钟 window。我似乎无法像我在 SQL 中乱七八糟地那样在 HIVE 中做一堆 'create tables' 以避免太多子查询,因为我很容易迷失在这些中。
这似乎是一个标准问题,是否有处理此类物品的明智或明显的解决方案?
谢谢
在 Hive 中,您可以使用 lag()
查看在给定记录之前五分钟是否有另一条记录。如果没有,则将标志设置为1并计数:
select count(*)
from (select t.*,
lag(timestamp) over (partition by user order by timestamp) as prev_timestamp
from t
) t
where prev_timestamp is null or
(timestamp - prev_timestamp) > 5*60;
我正在尝试使用 HIVE 计算我的数据集中出现了多少 'Uses'。
我的数据中有个人用户 ID 列、unix 纪元时间戳、事件名称和事件长度(以秒为单位)。
'Use' 被认为是用户触发事件的任何时候。问题是,如果一个用户触发了一个事件,然后在五分钟内触发了另一个事件,我将算作相同的 'Use'
我在数数时脑子里很难弄清楚如何计算这五分钟 window。我似乎无法像我在 SQL 中乱七八糟地那样在 HIVE 中做一堆 'create tables' 以避免太多子查询,因为我很容易迷失在这些中。
这似乎是一个标准问题,是否有处理此类物品的明智或明显的解决方案?
谢谢
在 Hive 中,您可以使用 lag()
查看在给定记录之前五分钟是否有另一条记录。如果没有,则将标志设置为1并计数:
select count(*)
from (select t.*,
lag(timestamp) over (partition by user order by timestamp) as prev_timestamp
from t
) t
where prev_timestamp is null or
(timestamp - prev_timestamp) > 5*60;