cassandra - 从 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);
由于key1
和key2
是分区键,我不能简单地删除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 的一些限制,因为不可能拥有确切数量的密钥。
我的问题:
- 如何获取所有表?
- 2147483647 是一些(可配置的)限制吗?为什么?
另一种策略是创建一个新表,使用 TTL 并写入两个表,直到两年过去。但如果可以的话,我想避免这种情况。
解决方案
我在 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 的约束
推荐阅读
- chart.js - chart.js 标签文本字体大小和数字文本字体大小太小
- python - 从 matlab 移植到 python 的遗传算法似乎没有进化
- java - 尝试在 Android Studio 中的空对象引用上调用接口方法“java.lang.Object java.util.List.get(int)”
- python - 我必须创建嵌套循环还是可以使用 try 函数来创建?
- php - 如何将(合并的)下拉菜单值发送到数据库?
- javascript - JavaScript 中的对象创建和新对象
- css - 材质选择边框的颜色如何改变?
- android - 将日志写入流内的文件并在协程内收集
- python - 为什么这个 DataFrame 没有做我想做的事情?
- python-3.x - 将图像转换为图标会出错