首页 > 解决方案 > 从 Cassandra 获取超过 2147483647 条记录

问题描述

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

表结构是这样的:

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 的一些限制,因为不可能拥有确切数量的密钥。

我的问题:

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

标签: cassandra

解决方案


我在 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 的约束


推荐阅读