Cassandra:查询where子句,其中包含greather-或小于(<;和>;)

Cassandra:查询where子句,其中包含greather-或小于(<;和>;),cassandra,where-clause,cql,Cassandra,Where Clause,Cql,我正在使用Cassandra 1.1.2,我正在尝试将RDBMS应用程序转换为Cassandra。在我的RDBMS应用程序中,我有一个名为table1的表: | Col1 | Col2 | Col3 | Col4 | Col1:字符串(主键) Col2:字符串(主键) Col3:Bigint(索引) Col4:Bigint 这个表统计了超过2亿条记录。最常用的查询类似于: Select * from table where col3 < 100 and col3 > 50; 我将

我正在使用Cassandra 1.1.2,我正在尝试将RDBMS应用程序转换为Cassandra。在我的RDBMS应用程序中,我有一个名为table1的表:

| Col1 | Col2 | Col3 | Col4 |
  • Col1:字符串(主键)
  • Col2:字符串(主键)
  • Col3:Bigint(索引)
  • Col4:Bigint
  • 这个表统计了超过2亿条记录。最常用的查询类似于:

    Select * from table where col3 < 100 and col3 > 50;
    
    我将主键更改为一个额外的列(我在应用程序中计算键)。 导入一些记录后,我尝试执行以下cql:

    select * from table1 where col3 < 100 and col3 > 50;
    
    查询从col3=67的表1中选择col1、col2、col3、col4


    谷歌表示,没有办法执行这种查询。是这样吗?有没有关于如何创建这样一个查询的建议?

    Cassandra索引实际上不支持顺序访问;请参阅,以快速了解它们的用途。但不要绝望;使用Cassandra(和许多其他NoSQL系统)的更经典的方法是去规范化,去规范化,去规范化

    在您的情况下,使用经典的bucket range模式可能是一个好主意,它允许您使用推荐的RandomPartitioner,并使行在集群中均匀分布,同时仍然允许顺序访问值。本例中的想法是,将第二个动态列族映射(带扣和有序)
    col3
    值映射回相关的
    primary_键
    值。例如,如果您的
    col3
    值范围为0到10^9,并且分布相当均匀,您可能希望将它们放在1000个范围为10^6的存储桶中(最佳粒度级别将取决于您需要的查询类型、数据类型、查询往返时间等)。cql3的模式示例:

    CREATE TABLE indexotron (
        rangestart int,
        col3val int,
        table1key varchar,
        PRIMARY KEY (rangestart, col3val, table1key)
    );
    
    当插入到
    表1
    中时,应在
    indexotron
    中插入相应的行,并使用
    rangestart=int(col3val/1000000)
    。然后,当您需要使用col3>X枚举
    table1
    中的所有行时,您需要查询多达1000个
    indexotron
    存储桶,但将对其中的所有
    col3val
    进行排序。查找所有
    表1.col3<4021
    主键
    值的示例查询:

    SELECT * FROM indexotron WHERE rangestart = 0 ORDER BY col3val;
    SELECT * FROM indexotron WHERE rangestart = 1000 ORDER BY col3val;
    SELECT * FROM indexotron WHERE rangestart = 2000 ORDER BY col3val;
    SELECT * FROM indexotron WHERE rangestart = 3000 ORDER BY col3val;
    SELECT * FROM indexotron WHERE rangestart = 4000 AND col3val < 4021 ORDER BY col3val;
    
    从indexotron中选择*,其中rangestart=0按col3val排序;
    从indexotron中选择*,其中rangestart=1000 ORDER BY col3val;
    从indexotron中选择*,其中rangestart=2000 ORDER BY col3val;
    从indexotron中选择*,其中rangestart=3000 ORDER BY col3val;
    从indexotron中选择*,其中rangestart=4000,col3val<4021,按col3val排序;
    
    如果col3始终是已知的小值/范围,则您可以使用一个更简单的表,该表也映射回初始表,例如:

     create table table2 (col3val int, table1key varchar,
                          primary key (col3val, table1key));
    
    和使用

     insert into table2 (col3val, table1key) values (55, 'foreign_key');
     insert into table2 (col3val, table1key) values (55, 'foreign_key3');
     select * from table2 where col3val = 51;
     select * from table2 where col3val = 52;
     ...
    

    如果你没有太大的射程,也许可以。(您也可以使用二级索引获得相同的效果,但二级索引并不被强烈推荐?)。理论上它也可以“在客户端本地”

    “Cassandra方法”似乎是有一些像“userid”这样的键,您使用它作为“所有查询”的第一部分,因此您可能需要重新考虑您的数据模型,然后您可以有像表1中的
    select*这样的查询,其中userid='X'和col3val>3
    ,它可以(假设col3val上有一个集群键)

     create table table2 (col3val int, table1key varchar,
                          primary key (col3val, table1key));
    
     insert into table2 (col3val, table1key) values (55, 'foreign_key');
     insert into table2 (col3val, table1key) values (55, 'foreign_key3');
     select * from table2 where col3val = 51;
     select * from table2 where col3val = 52;
     ...
    
     select * from table2 where col3val  in (51, 52, ...);