我认为您可以通过键入另一个不太精确的日期列来解决此问题。
对于月度用户,这样的事情会起作用:
CREATE TABLE mau(
month bigint,
d timestamp,
userid text,
PRIMARY KEY (month,d,userId));
然后您可以查询特定月份:
SELECT d, userid FROM may WHERE month=201603;
您还可以查询以下范围:
SELECT d, userid FROM mau WHERE month=201603
AND d>'2016-03-21 19:40:00+0000' AND d<'2016-03-21 19:50:00+0000';
d | userid
--------------------------+--------
2016-03-21 19:40:13+0000 | tron
2016-03-21 19:40:20+0000 | yori
2016-03-21 19:40:28+0000 | quorra
2016-03-21 19:40:36+0000 | paige
(4 rows)
month 是否适合您,取决于您希望每月访问多少行,以及这将使您接近 Cassandra 对每个分区 20 亿个单元的限制。考虑到这一点,最好也按day 进行分区,如下所示:
CREATE TABLE mau(
month bigint,
day bigint,
d timestamp,
userid text,
PRIMARY KEY ((month,day),d,userId));
当然,您将无法一次查询整个月。但是用这种方法搞乱,看看你是否能找到适合你的应用程序的 PRIMARY KEY 策略。
编辑 20160323
因此,为了计算“唯一”登录,我需要执行“选择计数(*)不同的用户 ID”或类似的操作。我对 Cassandra 中的 distinct 不是很熟悉,但我知道它适用于分区键。鉴于此架构中的分区键是三列 (month,d,userId) 的组合,是否允许单独对 userId 进行计数?
不,count 将无法通过iteslf 处理用户ID。首先,您不能跳过 PRIMARY KEY 组件。其次,使用 Cassandra,您需要采用基于查询的建模方法。如果您需要查询已登录的不同用户 ID,那么您需要新建一个表来支持它。
CREATE TABLE logins_by_user (
userid text,
d timestamp,
PRIMARY KEY(userid,d))
WITH CLUSTERING ORDER BY (d DESC);
假设我有和上面一样的数据,除了用户“tron”第二次登录:
SELECT * FROM logins_by_user ;
userid | d
--------+--------------------------
quorra | 2016-03-21 19:40:28+0000
paige | 2016-03-21 19:40:36+0000
tron | 2016-03-22 19:37:53+0000
tron | 2016-03-21 19:40:13+0000
yori | 2016-03-21 19:40:20+0000
(5 rows)
查询唯一的用户 ID 会产生:
SELECT DISTINCT userid FROM logins_by_user ;
userid
--------
quorra
paige
tron
yori
(4 rows)
不确定这是否正是您正在寻找的,但我希望这个想法能够引导您朝着正确的方向前进。