Cassandra ByteOrderedPartitioner

Cassandra ByteOrderedPartitioner,cassandra,cql,Cassandra,Cql,我想对结构如下的表执行一些范围查询: CREATE TABLE table( num int, val1 int, val2 float, val3 text, ... PRIMARY KEY(num) ) 范围查询应如下所示: SELECT num, val1, val2 FROM table WHERE num>100 AND num<1000; 从num>100和num的表中选择num、val1、val2 我做错了什么 您正在使用字节顺序分区器。它的使用被认为是卡桑德拉反

我想对结构如下的表执行一些范围查询:

CREATE TABLE table(

num int,
val1 int,
val2 float,
val3 text,
...
PRIMARY KEY(num)
)
范围查询应如下所示:

SELECT num, val1, val2 FROM table WHERE num>100 AND num<1000;
从num>100和num的表中选择num、val1、val2
我做错了什么

您正在使用字节顺序分区器。它的使用被认为是卡桑德拉反模式…有一段时间了。马特·丹尼斯(Matt Dennis)有一份报告,其中包含一张关于国际收支平衡表的幻灯片:

因此,尽管上面的幻灯片是幽默的,但严肃地说,不要使用字节顺序分区器。它仍然包含在Cassanra中,因此那些在2011年使用过它的人有一个升级路径不应使用BOP构建新集群。您应该使用(默认)3分区器

至于如何解决你与Murruil3 partitioner的问题,你上面链接的问题/答案参考了Patrick McFadin的文章。在那篇文章中,演示了三种建模模式。他们应该能够帮助您提出适当的数据模型。基本上,您可以使用集群键对数据进行排序,然后使用范围查询读取数据……但不能使用当前的分区键

CREATE TABLE tableorderedbynum(
 num int,
 val1 int,
 val2 float,
 val3 text,
 someotherkey text,
...
PRIMARY KEY((someotherkey),num)
);
检查数据模型,看看是否可以找到另一个键来帮助划分数据。然后,如果您使用另一个键作为分区键,使用num作为集群键创建一个查询表(如上所述);然后,此范围查询将起作用:

SELECT num, val1, val2 
FROM tableorderedbynum WHERE someotherkey='yourvalue' AND num>100 AND num<1000;
选择num、val1、val2

从tableorderedbynum中,someotherkey='yourvalue'和num>100以及num使用字节顺序分区器在Cassandra中无疑是一种反模式,但如果您仍然想继续使用它,则可以使用令牌函数通过分区键实现上述范围查询功能

SELECT num, val1, val2 FROM tableorderedbynum WHERE someotherkey = 'yourvalue' AND 
token(num) > token(100) AND token(num) < token(1000);
从tableorderedbynum中选择num、val1、val2,其中someotherkey='yourvalue'和
令牌(num)>令牌(100)和令牌(num)<令牌(1000);

请注意,当使用随机分区器或3分区器时,类似的查询将无法提供所需的结果,因为令牌不是按顺序生成的,而是随机的

没有足够的+1来回答这个问题哦不…一个不够。“我做错了什么?”[释义]“你做错了。”太棒了。这个答案和链接的幻灯片没有提供使用BOP错误的具体原因。