我最近在cassandra中创建了一个键空间和一个列族。我有以下
CREATE TABLE reports (
id timeuuid PRIMARY KEY,
report varchar
)
我想根据一段时间选择报告。所以我的查询是以下内容;
select dateOf(id), id
from keyspace.reports
where token(id) > token(maxTimeuuid('2013-07-16 16:10:48+0300'));
它返回;
dateOf(id) | id
--------------------------+--------------------------------------
2013-07-16 16:10:37+0300 | 1b3f6d00-ee19-11e2-8734-8d331d938752
2013-07-16 16:10:13+0300 | 0d4b20e0-ee19-11e2-bbb3-e3eef18ad51b
2013-07-16 16:10:37+0300 | 1b275870-ee19-11e2-b3f3-af3e3057c60f
2013-07-16 16:10:48+0300 | 21f9a390-ee19-11e2-89a2-97143e6cae9e
所以,这是错的。
当我尝试使用以下cql时;
select dateOf(id), id from keyspace.reports
where token(id) > token(minTimeuuid('2013-07-16 16:12:48+0300'));
dateOf(id) | id
--------------------------+--------------------------------------
2013-07-16 16:10:37+0300 | 1b3f6d00-ee19-11e2-8734-8d331d938752
2013-07-16 16:10:13+0300 | 0d4b20e0-ee19-11e2-bbb3-e3eef18ad51b
2013-07-16 16:10:37+0300 | 1b275870-ee19-11e2-b3f3-af3e3057c60f
2013-07-16 16:10:48+0300 | 21f9a390-ee19-11e2-89a2-97143e6cae9e
select dateOf(id), id from keyspace.reports
where token(id) > token(minTimeuuid('2013-07-16 16:13:48+0300'));
dateOf(id) | id
--------------------------+--------------------------------------
2013-07-16 16:10:37+0300 | 1b275870-ee19-11e2-b3f3-af3e3057c60f
2013-07-16 16:10:48+0300 | 21f9a390-ee19-11e2-89a2-97143e6cae9e
是随机的吗?为什么不提供有意义的产出?
cassandra的最佳解决方案是什么?
答案 0 :(得分:3)
您正在使用令牌功能,它在您的上下文中非常有用(使用mintimeuuid和maxtimeuuid查询时间)并且正在生成随机且不正确的输出:
TOKEN函数可与分区键列上的条件运算符一起使用以进行查询。查询根据其分区键的标记而不是其值来选择行。密钥的标记取决于正在使用的分区程序。 RandomPartitioner和Murmur3Partitioner不会产生有意义的订单。
如果您希望根据两个日期之间的所有记录进行检索,那么将数据建模为一个宽行可能更有意义,每列有一个记录,而不是每行一个记录,例如,创建表: / p>
CREATE TABLE reports (
reportname text,
id timeuuid,
report text,
PRIMARY KEY (reportname, id)
)
,填充数据:
insert into reports2(reportname,id,report) VALUES ('report', 1b3f6d00-ee19-11e2-8734-8d331d938752, 'a');
insert into reports2(reportname,id,report) VALUES ('report', 0d4b20e0-ee19-11e2-bbb3-e3eef18ad51b, 'b');
insert into reports2(reportname,id,report) VALUES ('report', 1b275870-ee19-11e2-b3f3-af3e3057c60f, 'c');
insert into reports2(reportname,id,report) VALUES ('report', 21f9a390-ee19-11e2-89a2-97143e6cae9e, 'd');
,并查询(没有令牌调用!):
select dateOf(id),id from reports2 where reportname='report' and id>maxtimeuuid('2013-07-16 16:10:48+0300');
,返回预期结果:
dateOf(id) | id
--------------------------+--------------------------------------
2013-07-16 14:10:48+0100 | 21f9a390-ee19-11e2-89a2-97143e6cae9e
这样做的缺点是您的所有报告都在一行中,当然您现在可以存储大量不同的报告(此处以reportname键入)。要在2013年8月获得名为mynewreport
的所有报告,您可以使用以下方式进行查询:
select dateOf(id),id from reports2 where reportname='mynewreport' and id>=mintimeuuid('2013-08-01+0300') and id<mintimeuuid('2013-09-01+0300');