gpt4 book ai didi

Cassandra:使用包含大于或小于(< 和 >)的 where 子句进行查询

转载 作者:行者123 更新时间:2023-12-04 11:56:27 35 4
gpt4 key购买 nike

我正在使用 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 中,我使用以下语句来创建表:
    create table table1 (primary_key varchar, col1 varchar, 
    col2 varchar, col3 bigint, col4 bigint, primary key (primary_key));

    create index on table1(col3);

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

    这个结果是:
    Bad Request: No indexed columns present in by-columns clause with Equal operator

    查询 从 table1 中选择 col1,col2,col3,col4,其中 col3 = 67 作品

    谷歌表示没有办法执行这种查询。那正确吗?任何建议如何创建这样的查询?

    最佳答案

    Cassandra 索引实际上并不支持顺序访问;见 http://www.datastax.com/docs/1.1/ddl/indexes快速解释它们的用处。但不要绝望;使用 Cassandra(和许多其他 NoSQL 系统)的更经典的方法是反规范化、反规范化、反规范化。

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

    CREATE TABLE indexotron (
    rangestart int,
    col3val int,
    table1key varchar,
    PRIMARY KEY (rangestart, col3val, table1key)
    );

    插入时 table1 ,您应该在 indexotron 中插入相应的行, 与 rangestart = int(col3val / 1000000) .然后当您需要枚举 table1 中的所有行时col3 > X,最多需要查询1000个桶 indexotron ,但所有的 col3val内的 s 将被排序。查找所有 table1.primary_key 的示例查询 table1.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;

    关于Cassandra:使用包含大于或小于(< 和 >)的 where 子句进行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11348158/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com