为了获得一些度量的分布,我们在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位独特用户
,即天数与唯一身份用户数相比。
谢谢
答案 0 :(得分:0)
很多将取决于性能要求,一致性保证,系统数量等(几乎是标准)。也就是说,如果我愿意让它具有概率,我确实会有一个建议,而且你不需要它立即不断更新。正如您所提到的,HyperLogLog是一个很好的选择。
每个服务器都可以在内存中保留一个,当数据插入时,它会更新并定期(即每分钟一次)推送到cassandra ...或其他商店。由于HyperLogLog的性质,当您想要查询它时,您可以对服务器超级日志进行列切片并将它们组合起来。
ColumnFamilyHyperLogLogs: {
someMetricsCardinalityRow20130828: {
Server1: HyperLogLogBlob,
Server2: HyperLogLogBlob,
Server3: HyperLogLogBlob
}
}
我会推荐那些对我们有用的clearsprings库:
它具有转换为可用于序列化和反序列化的字节数组的功能,并具有可用于组合它们的方法。
或者,一些需要占用更多空间的东西就是你可以为每件东西设置一行,就像你说的是唯一用户一样。
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功能。您可以查看付费的选项,例如Acunu或Datastax Enterprise offerings。如果你正在寻找一个免费选项,那么像amplabs spark and shark这样的东西对于即席查询来说非常好,虽然我没有亲自将它们与Cassandra一起使用我知道它已经完成了。