我有一組用戶的狀態變化事件,為了簡單起見,我們假設為ACTIVATED(A)和DEACTIVATED(D)。
場景類似于例如youtube的高級訂閱,用戶可能會多次激活或停用他們的訂閱。因此,對于同一個用戶來說,這兩個事件可能會在多個時間點(例如:天、月)之間多次發生。
我想從事件歷史中計算出每個月處于激活狀態的用戶數量。
一個時間線的例子可以是
t: Time point (end of month) of聚合
u: One user
A: 已激活事件
D:已激活的事件
t: 一月 二月 三月 四月 五月
u1 A
u2 A D A
u3 A D A
預期的。 2 2 2 1 3
資料本身可在CSV/表格中獲得,列有用戶-id、事件型別-時間戳。對于上面的例子,原始資料將是:
user- id 事件-type time-stamp
u1 A 2020-Jan01
u2 A 2020-Jan15
u2 D 2020-Feb-05
u2 A 2020-5月-17。
u3 A 2020-Feb-04
u3 D 2020-Apr-10
u3 A 2020-5月-09。
注意,盡管我想在每個月末進行統計,但事件當然不會在同一時間發生。一個用戶也可能在同一個月里有多個事件。
絕對計數是沒有問題的,"計算最后一個事件為A的所有用戶"。
棘手的問題是如何計算個別月份的資料,在這些月份里我沒有變化的事件。例如,示例時間線中的三月。
我不能按月分組,因為在3月沒有發生任何事件,但我需要知道,在之前的時間點發生了激活或取消激活。
我可以想出兩種方法:
我可以想出兩種方法:
在某個回圈中對每個時間點進行計算,并增加磁區視窗。因此,"for tCursor in Jan to May do: count all users where last event in rang 'Jan - tCursor' is ACTIVATED"。
通過對每個用戶進行一些預處理回圈,在感興趣的時間粒度中用冗余事件填充歷史。然后我就可以避免反復增加的時間視窗了。
這兩種方法似乎都有些粗糙(盡管它們都能發揮作用)。
是否有一些好的替代方案?也許我應該注意到一些神奇的 Spark 函式?
很高興能在這里得到一些意見。我也不是100%確定應該在谷歌上搜索什么。我認為這個普遍的問題甚至可能有一個名稱,因為正如所說,所有具有稀疏事件的開/關訂閱服務都應該有同樣的問題。
謝謝
uj5u.com熱心網友回復:
你可以解除資料的透視,聚合,并使用視窗函式:
with t as (
select userid, 't1' as t,
(case when t1 = 'A'/span> then 1 else 1 end)
from t
where t1 in ('A'/span>, 'D'/span>)
unionall
select userid, 't2' as t。
(case when t2 = 'A'/span> then 1 else 1 end)
from t
where t2 in ('A'/span>, 'D'/span>)
unionall
. . . --需要重復所有的時間。
)
select t, sum(inc) as change_at_time。
sum(sum(inc)) over (order by t) as active_on_day
from t
group by t
order by t。
't1'是該列所代表的任何時間。 它可能真的是一個數字(你的問題沒有明確說明資料的表示方法)。
如果你只是擁有userid, time, 和'A'/'D'的行,而不是將這些值分散在許多列中,那么這個查詢將變得更簡單。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/328152.html
標籤:
