如何在cassandra中查询范围

e5nqia27  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(381)

我试图在cassandra表上查询一个整数并得到错误 Only EQ and IN relation are supported on the partition key(unless you use the token()function) 我的表是在下面的查询中设置的。请注意,我没有设置表,当前也无法更改它。

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;
j0pj023g

j0pj023g1#

它看起来像是您的编辑后查询:

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

…工作正常。如果您指定 accName (分区键)和 accContext (第一个聚类键),您完全可以对整数运行范围查询,假设它是下一个聚类键。但是,如果你要消除 accContext 从您的查询来看,这将失败,因为您没有为cassandra提供足够的信息来有效地检索所需的数据。

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

因此,这是您在使用有效解决方案编辑之前的查询。当然,您也看到了这样一个错误,即分区键上的范围查询只适用于 token 功能。
为什么?
您可能听说过cassandra需要一种“基于查询”的数据建模方法。这是因为所有数据通常不驻留在单个节点上。跨节点查询非常昂贵。通过强制分区键上的范围查询 token 提供用于将查询限制到负责特定令牌范围的节点的工具。在您的情况下,这是有效的:

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

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

(1 rows)

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

相关问题