我的系统中有数百万用户{U1,U2,...},并且在任何时刻都可能有与任何用户关联的事件E(U,t):E(Ui,ti) 。我将事件信息存储在列族中。
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而删除某些列时我不能自动更新计数器。
非常感谢任何反馈。