2013-10-15 38 views
1

我的系統中有數百萬用戶{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而被刪除時,我不能自動更新計數器。

任何反饋將不勝感激。

回答

1

這似乎從你的描述,你並不需要實時信息,因爲你已經有一個單獨的進程產生你想要的結果。鑑於此,我認爲有一個外部聚合器(可能類似SparkStorm)可能會生成統計信息並將它們寫回到Cassandra。您也可以使用Hadoop MapReduce作業來完成此操作。

相關問題