Cassandra中的不同用户
我有以下问题: 在我的Cassandra数据库中,我有几个用户发送的消息。 “我的消息”表具有以下结构:Cassandra中的不同用户,cassandra,Cassandra,我有以下问题: 在我的Cassandra数据库中,我有几个用户发送的消息。 “我的消息”表具有以下结构: CREATE TABLE messages ( recipient bigint, sender bigint, created_at text, content text, PRIMARY KEY((recipient, sender),created_at) ); 我需要计算一个用户在一天内发送的邮件数。例如,在2017-01-01和2017-01-05之间 sen
CREATE TABLE messages (
recipient bigint,
sender bigint,
created_at text,
content text,
PRIMARY KEY((recipient, sender),created_at)
);
我需要计算一个用户在一天内发送的邮件数。例如,在2017-01-01和2017-01-05之间
sender | created_at
1 2017-01-01
1 2017-01-01
2 2017-01-01
3 2017-01-02
3 2017-01-02
4 2017-01-03
4 2017-01-04
5 2017-01-04
我会有结果的
2017-01-01 = 2
2017-01-02 = 1
2017-01-03 = 1
2017-01-04 = 2
好吧,cassandra不允许类似SQL的聚合。您需要预先计算并保存到另一个数据库中,或者在扫描/查询结果时进行计数
另一个选择是将cassandra与hadoop集成&做一些map reduce,但这对于您在这里尝试的东西来说似乎是一种过度的杀伤力 好吧,cassandra不允许类似SQL的聚合。您需要预先计算并保存到另一个数据库中,或者在扫描/查询结果时进行计数
另一个选择是将cassandra与hadoop集成&做一些map reduce,但这对于您在这里尝试的东西来说似乎是一种过度的杀伤力 据我所见,您不能对表结构执行此操作,因为分区键包含
收件人。要说的是,你根本不应该数数,因为这很难
但是,如果您坚持数数这些键,我建议您采用两种方法:
创建一个新的计数器表
此表将允许您直接获取要查找的值。它允许您选择适当的计数器“粒度”,也就是说,如果您想要逐日计数器,只需将时间戳存储在yyy-mm-dd
格式的ts
字段中即可。如果您希望按小时计算,请将其存储为yyyy-mm-dd HH:00
格式,等等。。。您需要确切的发送方
才能获取结果,并且可以通过指定主键的ts
组件进行范围查询。看一看关于如何使用它们的页面文档,注意这种方法的主要缺点是Cassandra可能会数到/数到,所以如果你需要学究式的数数,请注意你的步骤
创建一个新的消息表,也称为数据非规范化
每次在messages
表中插入一行时,您都会在此处插入一行,当您需要统计发送的邮件时,只需运行SELECT count(*)FROM messages\u by\u sender WHERE sender=?
来统计所有邮件,或SELECT count(*)FROM messages\u by\u sender WHERE sender=?并在>?并在<
指定一个范围。但是,如果每个发送方都有大量邮件,这将导致效率低下,因为计算Cassandra中的键需要分区扫描。从我看到的情况来看,您的表结构无法做到这一点,因为分区键包含接收方。要说的是,你根本不应该数数,因为这很难
但是,如果您坚持数数这些键,我建议您采用两种方法:
创建一个新的计数器表
此表将允许您直接获取要查找的值。它允许您选择适当的计数器“粒度”,也就是说,如果您想要逐日计数器,只需将时间戳存储在yyy-mm-dd
格式的ts
字段中即可。如果您希望按小时计算,请将其存储为yyyy-mm-dd HH:00
格式,等等。。。您需要确切的发送方
才能获取结果,并且可以通过指定主键的ts
组件进行范围查询。看一看关于如何使用它们的页面文档,注意这种方法的主要缺点是Cassandra可能会数到/数到,所以如果你需要学究式的数数,请注意你的步骤
创建一个新的消息表,也称为数据非规范化
每次在messages
表中插入一行时,您都会在此处插入一行,当您需要统计发送的邮件时,只需运行SELECT count(*)FROM messages\u by\u sender WHERE sender=?
来统计所有邮件,或SELECT count(*)FROM messages\u by\u sender WHERE sender=?并在>?并在<
指定一个范围。但是,如果每个发件人都有大量邮件,这将导致效率低下,因为在Cassandra中计算密钥需要分区扫描。感谢您的解决方案。这对我的问题非常有效。谢谢你的解决方案。它对我的问题非常有效。
CREATE TABLE counters_by_user (
sender bigint,
ts timestamp,
messages counter,
PRIMARY KEY (sender, ts)
)
CREATE TABLE messages_by_sender (
sender bigint,
created_at timestamp,
PRIMARY KEY (sender, created_at)
);