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

我有以下问题: 在我的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之间

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)
);