我正在尝试为时间序列建模 cassandra 数据集,其中我使用计数器列捕获给定用户在一分钟内的字节总和。使用 CQL3 我有这个创建表语法:
CREATE TABLE minute_usr (
min varchar,
usr varchar,
bytes counter,
PRIMARY KEY (min, usr)
)
我可以使用此查询更新列:
UPDATE minute_usr SET bytes = bytes + 200 WHERE usr = 'testuser' AND min = '1369448220';
但是我现在想在 usr = 'username' 的几分钟内取回 'bytes' 的值:
select min, bytes from minute_usr WHERE usr = 'testuser' AND min >= '1369448160' and min <= '1369448220';
我得到了错误:
错误请求:随机分区器的分区键仅支持 EQ 和 IN 关系(除非您使用 token() 函数)
我假设 CQL 在创建表时从“min”和“usr”中创建了一个复合键,从而允许我获得一系列复合键。cli 实际上告诉我关键实际上只是'min'的值:
[default@data_use] list minute_usr;
Using default limit of 100
Using default column limit of 100
RowKey: 1369448220
=> (column=testuser:, value=, timestamp=1371066133370000)
=> (counter=testuser:bytes, value=1400)
RowKey: 1369448160
=> (column=testuser:, value=, timestamp=1371066138506000)
=> (counter=testuser:bytes, value=1600)
我是否仅限于使用此数据模型对每个时间戳/用户名组合进行单独查询?
我还尝试使用用户名作为键的第一部分对数据进行建模,这允许我进行范围查询
CREATE TABLE usr_minute (
min varchar,
usr varchar,
bytes counter,
PRIMARY KEY (usr, min)
)
然后我可以对列名进行几分钟的范围查询,如下所示:
`select bytes from usr_minute WHERE usr = 'testuser' AND min >= '1369448160' and min <= '1369448220';`
但是我知道这些值现在存储在单行中,这在可以存储的列数方面存在限制,我想让这个数据集永远增长。
不知道如何进行。