从 Cassandra 获取超过 2147483647 条记录

Fetch more than 2147483647 record from Cassandra

我继承了一个 Cassandra 数据库,里面有多年的数据。我的任务是删除所有超过 2 年的记录。我不知道 table 包含多少行,但是很多。

table结构是这样的:

CREATE TABLE IF NOT EXISTS my_table (
  key1 bigint,
  key2 text,
  "timestamp" timestamp,
  some more columns,
  PRIMARY KEY ((key1, key2), "timestamp")
) WITH CLUSTERING ORDER BY ("timestamp" DESC);

由于 key1key2 是分区键,我不能简单地删除 timestamp < 2 年的所有内容。您需要为每个分区键执行此操作。

所以我继续在 Java 中基于手册中描述的异步分页模式创建了一个小工具:https://docs.datastax.com/en/developer/java-driver/4.11/manual/core/paging/

我做了一个 SELECT DISTINCT key1, key2 from my_table;,遍历键,删除那些超过 2 年的键的行,获取下一页并重复。

几个小时后,该工具完成并报告它已经修改了 2147483647 个分区键的行。那正好是 2^32-1,有符号的 32 位整数的最大值。这可能是 Cassandra 中的一些限制,因为不可能有那么多的密钥。

我的问题:

另一个策略是开始一个新的 table,使用 TTL 并写入两个 table,直到两年过去。但如果可以的话,我想避免这种情况。

我在 ScyllaDB 工作 - Scylla 是一个兼容 Cassandra 的数据库。

Cassandra 分页确实存在限制 - https://issues.apache.org/jira/browse/CASSANDRA-14683 并且尚未修复。

您可以尝试做的是使用返回的最后一个令牌并从该状态继续分页

select distinct token (key1,key2), key1,key2 from my_table ;

然后当分页结束时,您将更改查询并使用最后返回的标记(作为示例)

select distinct token (key1,key2), key1,key2 from my_table where token(key1,key2) >= -3748018335291956378;

(你需要用 >= 重复,因为多对可能映射到同一个标记)

PS:Scylla 提升了这个限制 (https://github.com/scylladb/scylla/issues/5101) 所以我们受 2^64 -1

的约束