当前位置: 首页 > 知识库问答 >
问题:

Cassandra:查询包含greather-或小于()的where子句

段干祺
2023-03-14

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

| Col1 | Col2 | Col3 | Col4 |
  1. Col1:字符串(主键)

此表对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

查询从col3=67的表1中选择col1、col2、col3、col4

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

共有2个答案

潘哲
2023-03-14

如果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;
 ...

 select * from table2 where col3val  in (51, 52, ...);

如果没有太大的范围,也许可以。(你也可以用你的二级索引得到同样的效果,但二级索引并不被强烈推荐?)。理论上也可以“在客户端本地”将其并行化。

似乎“Cassandra方式”是有一些像“userid”这样的键,您将其用作“所有查询”的第一部分,因此您可能需要重新考虑您的数据模型,然后您可以使用像这样的查询从表1中选择*,其中userid='X'和col3val

东方和志
2023-03-14

Cassandra索引实际上不支持顺序访问;请参阅http://www.datastax.com/docs/1.1/ddl/indexes以快速解释它们的有用之处。但不要绝望;使用Cassandra(和许多其他非关系型数据库系统)的更经典方法是去规范化、去规范化、去规范化。

在您的情况下,使用经典的桶范围模式可能是一个好主意,它允许您使用推荐的RAnywhere分区器并保持您的行在集群中良好分布,同时仍然允许对您的值进行顺序访问。在这种情况下,您将制作第二个动态列族映射(带扣和有序)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)。然后当您需要用col3枚举table1中的所有行时

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;
 类似资料:
  • 问题内容: 当表开始增长时,我担心WHERE子句中IN的性能。有没有人对这种查询有更好的策略?子查询返回的记录数比TradeLine表中的记录数增长得慢得多。TradeLine表本身以每天10个的速度增长。 谢谢你。 编辑:我使用了将子查询从WHERE移到FROM的想法。我对有助于此新查询的所有答案投了赞成票。 问题答案: 子句中的子查询不依赖于外部查询中的任何内容。您可以安全地将其移到子句中;一

  • 问题内容: 我最近才刚开始使用SQLAlchemy,但仍无法解决某些概念。 归结为基本元素,我有两个这样的表(通过Flask-SQLAlchemy): 我将如何查询用户列表及其最新帖子(不包括无帖子的用户)。如果我使用的是SQL,则可以执行以下操作: 因此,我确切地知道“期望的” SQL可以达到我想要的效果,但是不知道如何在SQLAlchemy中“正确地”表达它。 编辑:如果很重要,我使用的是SQ

  • 在cassandra cqlsh中select with where子句工作良好 com.netflix.astyanax.connectionpool.exceptions网站。BadRequestException:BadRequest异常:[host=10.65.240.89(10.65.240.89):9160,latency=237(342),attachs.AbstractOperat

  • 问题内容: 将SELECT查询放在UPDATE查询的WHERE子句中时出现错误。 我的查询是这样的: AND错误将显示如下: “无法在FROM子句中指定目标表’m’进行更新” 问题答案: 实际上,您可以通过将其包装在子查询中来更新它(从而为结果创建临时表) 或使用 JOIN

  • 我想查询表的完整分区。我的复合分区键由组成和是字符串,是整数。 我需要将hour_of_timestamp字段添加到我的分区键,因为在摄取数据时存在热点。 现在我想知道查询数据的完整分区的最有效方法是什么?根据这个博客,使用会在协调器节点上造成大量开销。 使用TOKEN函数并用两个TOKEN查询分区是否更好?如<代码> SELECT * from my table WHERE TOKEN(id,d

  • 我有一些问题与WordPress和WP_Query。我想让帖子按meta_query和/或类别过滤,但我有以下问题:第一种类型的帖子有一个名为“类型”的自定义字段,必须用“练习”来填充,帖子必须在一个名为“级别”的类别中(这将在之前设置)。第二类帖子只有名为“类型”的自定义字段,必须用“测试”来填充。 我不知道如何把这两个条件凑在一起。正因为如此,我试图将它分成两个查询,然后合并它,就像这样: 这