如何在Cassandra中查询范围

How to Query range in Cassandra

我正在尝试在 Cassandra table 上查询一个整数并得到错误 Only EQ and IN relation are supported on the partition key(unless you use the token()function) 我的 table is setup Is below with the query I 运行.请注意,我没有设置 table,目前我也无法更改它。

CREATE TABLE USERS(
accName text,
accContext text,
accNumber int,
accCount int,
accHost text,
PRIMARY KEY (accName,accContext,accNumber)
);

SELECT * FROM Users WHERE accName = 'tear' and accContext = 'db1' 
   and accNumber> 20200101 and accNumber<= 202002018;

您的 post-edit 查询看起来像:

SELECT * FROM Users
    WHERE accName = 'tear' and accContext = 'db1' 
    and accNumber> 20200101 and accNumber<= 202002018;

...工作正常。如果指定 accName(分区键)和 accContext(第一个聚类键),则绝对 可以 运行 对整数进行范围查询,假设它是 next 集群键。但是,如果您要从查询中删除 accContext这将失败,因为您没有为 Cassandra 提供足够的信息来有效检索所需数据。

SELECT * FROM Users WHERE accNumber> 20200101 and accNumber<= 202002018;

这是您在使用有效解决方案进行编辑之前的查询。当然,您看到了错误,指出分区键的范围查询仅适用于 token 函数。

这是为什么?

您可能听说过 Cassandra 需要 "query based" 数据建模方法。这是因为所有数据通常不驻留在单个节点上。 跨节点查询是昂贵的。通过 token 强制对分区键进行范围查询为您提供了将查询限制在负责特定令牌范围的节点的工具。在您的情况下,这有效:

aaron@cqlsh:Whosebug> SELECT token(accname),accname FROM Users
    WHERE token(accname) <= -6425313154088713591
      AND token(accname) >  -7367992452875979971;

 system.token(accname) | accname
-----------------------+---------
  -6611994791738996364 |    tear

(1 rows)

解构我在这里所做的,通过在我的 SELECT 中使用 token 函数,我可以看到字符串 "tear" 的标记是什么。接下来,我可以查询 system.peers 以查看哪个节点负责该令牌,以及了解目标节点负责的确切令牌范围。