【问题标题】:How to find range in Cassandra Primary key?如何在 Cassandra 主键中查找范围?
【发布时间】:2021-02-18 14:09:31
【问题描述】:

用例:在特定 id 范围内查找最大 counter

我想创建一个包含这些列的表:time_epoch intt_counter counter

频繁查询是:

select time_epoch, MAX t_counter where time_epoch >= ... and time_epoch < ...

这是在特定时间范围内查找计数器。计划将 time_epoch 作为主键。我无法查询数据。它总是要求ALLOW FILTERING。由于它是一个非常昂贵的功能,我们不想使用它。

如何为用例设计表和查询。

【问题讨论】:

    标签: cassandra primary-key cql performancecounter


    【解决方案1】:

    假设我们可以按天“存储”(分区)您的数据,假设一天内不会发生足够的写入以使分区过大。然后,我们可以按 DESCending 顺序按time_epoch 进行聚类。对于基于时间的数据,按降序存储数据通常最有意义(因为业务需求通常更关心最新数据)。

    因此,我会建立一个这样的表:

    CREATE TABLE event_counter (
        day bigint,
        time_epoch timestamp,
        t_counter counter,
        PRIMARY KEY(day,time_epoch))
    WITH CLUSTERING ORDER BY (time_epoch DESC);
    

    插入几行后,聚类顺序就很明显了:

    > SELECT * FROM event_counter ;
        WHERE day=20210219 
          AND time_epoch>='2021-02-18 18:00'
          AND time_epoch<'2021-02-19 8:00';
    
     day      | time_epoch                      | t_counter
    ----------+---------------------------------+-----------
     20210219 | 2021-02-19 14:09:21.625000+0000 |         1
     20210219 | 2021-02-19 14:08:32.913000+0000 |         2
     20210219 | 2021-02-19 14:08:28.985000+0000 |         1
     20210219 | 2021-02-19 14:08:05.389000+0000 |         1
    
    (4 rows)
    

    现在在该范围内选择 MAX t_counter 应该可以工作:

    > SELECT day,max(t_counter) as max
    FROM event_counter
    WHERE day=20210219
      AND time_epoch>='2021-02-18 18:00'
      AND time_epoch<'2021-02-19 09:00';
    
     day      | max
    ----------+-----
     20210219 |   2
    

    【讨论】:

      【解决方案2】:

      不幸的是,没有更好的方法。想一想。

      如果您了解 cassandra 架构,那么您就会知道您的数据基于主键分布在多个节点上。从主键中过滤值的唯一方法是遍历每个节点,这基本上就是“允许过滤”所做的。

      【讨论】:

      • 感谢您的回复。但是添加某种分区键呢?并将 time_epoch 作为具有聚类顺序的私钥。
      猜你喜欢
      • 2022-09-23
      • 1970-01-01
      • 2020-06-03
      • 2014-09-18
      • 2018-10-02
      • 1970-01-01
      • 2012-01-09
      • 2016-07-21
      • 1970-01-01
      相关资源
      最近更新 更多