卡桑德拉的独特计数器

时间:2013-08-28 19:42:24

标签: cassandra

为了获得一些度量的分布,我们在Cassandra中使用计数器,即类似于mysql中的group by。但如果我想要一个衡量标准的独特分布 - 我该怎么做?

假设我需要每天分发访问网页的用户 - 计数器非常方便。钥匙将是白天,价值将是一个柜台。但是对于同一个网页 - 如果我需要我需要独特的用户分发,我怎样才能实现使用Cassandra?

我可以通过各种方式实现它 - 写入前读取,离线处理等。 我也听说过位图/超级日志记录计数器等。什么是最容易和最简单的解决方案,我可以在Cassandra中使用它来获得每日独特的用户分布。我每天都有数百万的活动。

示例:

在25/08/2013说 - 这是我的网页点击 - user1,user2,user1,user3

2013年8月26日 - user1,user2

2013年8月27日 - user2,user3,user4

2013年8月28日 - user1,user2,user1,user3

我的输出应该是

  

25/08/2013 - 3位独特用户

     

26/08/2013 - 2位独特用户

     

27/08/2013 - 3位独特用户

     

28/08/2013 - 3位独特用户

,即天数与唯一身份用户数相比。

谢谢

3 个答案:

答案 0 :(得分:0)

很多将取决于性能要求,一致性保证,系统数量等(几乎是标准)。也就是说,如果我愿意让它具有概率,我确实会有一个建议,而且你不需要它立即不断更新。正如您所提到的,HyperLogLog是一个很好的选择。

每个服务器都可以在内存中保留一个,当数据插入时,它会更新并定期(即每分钟一次)推送到cassandra ...或其他商店。由于HyperLogLog的性质,当您想要查询它时,您可以对服务器超级日志进行列切片并将它们组合起来。

ColumnFamilyHyperLogLogs: {
  someMetricsCardinalityRow20130828: {
    Server1: HyperLogLogBlob,
    Server2: HyperLogLogBlob,
    Server3: HyperLogLogBlob
  }
}

我会推荐那些对我们有用的clearsprings库:

https://github.com/clearspring/stream-lib/blob/master/src/main/java/com/clearspring/analytics/stream/cardinality/HyperLogLog.java

它具有转换为可用于序列化和反序列化的字节数组的功能,并具有可用于组合它们的方法。

或者,一些需要占用更多空间的东西就是你可以为每件东西设置一行,就像你说的是唯一用户一样。

ColumnFamilyName {
  uniqueUserOn20130828: {
   "user1" : null,
   "user2" : null,
   ...
  }
}

然后你可以在行上调用一个计数,它会给你确切的唯一用户数。这更直接,更容易实现,但它需要更多的空间,但有了额外的好处,你可以看看那天用户实际上是什么。使用CQL3和设置

可能非常容易

答案 1 :(得分:0)

Cassandra没有任何特定内容,但如果这些数据建模如下

date       user_id

25Aug2013    1
25Aug2013    2
25Aug2013    1
25Aug2013    3

26Aug2013    1
26Aug2013    2

27Aug2013    2
27Aug2013    3
27Aug2013    4

28Aug2013    1
28Aug2013    2
28Aug2013    1
28Aug2013    3

您可以通过

按日或按月或任何其他日期格式获取唯一身份用户
select count(DISTINCT user_id), date from <table_name> where date_trunc(date, 'month') =8 order by user_id, format(date, 'DDMMYYY) DESC/ASC

日期格式是可选的。您应该可以在没有该查询的情况下跨表查询,然后添加适当的过滤器。

答案 2 :(得分:0)

的表定义
CREATE TABLE user_day(
  day TEXT,
  user_id TEXT,
  user_count COUNTER,
  PRIMARY KEY (day,user_id));

更新如下:

UPDATE user_day SET user_count = user_count + 1  WHERE day = '20130829' AND user_id = 'USER-1';
UPDATE user_day SET user_count = user_count + 1  WHERE day = '20130829' AND user_id = 'USER-1';
UPDATE user_day SET user_count = user_count + 1  WHERE day = '20130829' AND user_id = 'USER-2';
UPDATE user_day SET user_count = user_count + 1  WHERE day = '20130829' AND user_id = 'USER-2';
UPDATE user_day SET user_count = user_count + 1  WHERE day = '20130829' AND user_id = 'USER-1';
UPDATE user_day SET user_count = user_count + 1  WHERE day = '20130829' AND user_id = 'USER-3';

然后会同时给出:

SELECT * FROM user_day;

 day      | user_id | user_count
----------+---------+------------
 20130829 |  USER-1 |          4
 20130829 |  USER-2 |          2
 20130829 |  USER-3 |          1

和:

SELECT COUNT(*) FROM user_day WHERE day = '20130829';


 count
-------
     3

WRT评论,你要找的是一个由Cassandra不支持的GROUP BY功能。您可以查看付费的选项,例如AcunuDatastax Enterprise offerings。如果你正在寻找一个免费选项,那么像amplabs spark and shark这样的东西对于即席查询来说非常好,虽然我没有亲自将它们与Cassandra一起使用我知道它已经完成了。