【问题标题】:How to Query range in Cassandra如何在 Cassandra 中查询范围
【发布时间】:2020-06-03 20:46:50
【问题描述】:

我正在尝试在 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;

【问题讨论】:

    标签: database cassandra nosql cql


    【解决方案1】:

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

    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)
    

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

    【讨论】:

      猜你喜欢
      • 2012-01-09
      • 2014-09-18
      • 2018-10-02
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      相关资源
      最近更新 更多