我的系統中有數百萬用戶{U1,U2,...},並且可能有與任何用戶關聯的事件E(U,t)時刻:E(Ui,ti)。我將事件信息存儲在列族中。使用Cassandra根據時間窗口對事件進行計數
UserId1:
TimeUUID:""
TimeUUID:""
UserId2:
TimeUUID:""
TimeUUID:""
etc ...
鑑於當前時間T,我想找到兩個用戶:最高的事件計數一小時,兩小時之內。基本上,我想知道最有意思的用戶提供了一定的時間限制。
我的解決方案將涉及創建兩個列族,一個名爲Tminus1
,另一個名爲Tminus2
。這些列族具有相同的數據寫入,但TTL(生存時間)不同:一個是1小時,另一個是2小時。
三是運行所有的時間和計算列各兩個表中的行和一個名爲「EventStats」新表只有兩行寫結果的工作:
max1hour:
5609837: user376484, TTL = 1 hour
4577374: user293760, TTL = 1 hour
....
max2hour:
4837301: user933734, TTL = 2 hour
0043746: user948348, TTL = 2 hour
....
(列這裏命名計數。這裏有一個問題是,如果兩個用戶具有相同的數會發生什麼......)
當服務想知道中獎的用戶,它只是讀取相應行的第一列。
我對這個解決方案的問題(即使它是可行的)是它太麻煩了。也許我不熟悉一些其他Cassandra工具,它們可以以更加優雅的方式解決這個問題。此外,我希望能夠在12小時內,5小時內動態地引入和更改更多統計度量,例如最高的偶數計數器......這將需要創建一個類似於Tminus1
等的新的列族。
我打算使用標準的Cassandra計數器可以避免寫一個計數作業,但我不認爲當某些列由於TTL而被刪除時,我不能自動更新計數器。
任何反饋將不勝感激。