如何在 Cassandra 主键中查找范围?
How to find range in Cassandra Primary key?
用例:查找特定 id
范围内的最大值 counter
值
我想用这些列创建一个 table:time_epoch int
、t_counter counter
经常查询的是:
select time_epoch, MAX t_counter where time_epoch >= ... and time_epoch < ...
这是为了找到特定时间范围内的计数器。计划将 time_epoch 作为主键。我无法查询数据。它总是要求 ALLOW FILTERING
。由于它是一个非常昂贵的功能,我们不想使用它。
如何设计table和查询用例。
遗憾的是没有更好的方法。想想看。
如果您了解 cassandra 架构,那么您就会知道您的数据基于主键分布在多个节点上。从主键过滤值的唯一方法是遍历每个节点,这基本上就是“允许过滤”完成的。
假设我们可以按天“存储”(分区)您的数据,假设一天内不会发生足够的写入以使分区太大。然后,我们可以按降序 time_epoch
进行聚类。对于基于时间的数据,按降序存储数据通常最有意义(因为业务需求 通常 更关心最新数据)。
因此,我会像这样构建一个 table:
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)
现在选择该范围内的最大值 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
用例:查找特定 id
范围内的最大值 counter
值
我想用这些列创建一个 table:time_epoch int
、t_counter counter
经常查询的是:
select time_epoch, MAX t_counter where time_epoch >= ... and time_epoch < ...
这是为了找到特定时间范围内的计数器。计划将 time_epoch 作为主键。我无法查询数据。它总是要求 ALLOW FILTERING
。由于它是一个非常昂贵的功能,我们不想使用它。
如何设计table和查询用例。
遗憾的是没有更好的方法。想想看。
如果您了解 cassandra 架构,那么您就会知道您的数据基于主键分布在多个节点上。从主键过滤值的唯一方法是遍历每个节点,这基本上就是“允许过滤”完成的。
假设我们可以按天“存储”(分区)您的数据,假设一天内不会发生足够的写入以使分区太大。然后,我们可以按降序 time_epoch
进行聚类。对于基于时间的数据,按降序存储数据通常最有意义(因为业务需求 通常 更关心最新数据)。
因此,我会像这样构建一个 table:
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)
现在选择该范围内的最大值 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