【发布时间】:2020-03-03 05:50:44
【问题描述】:
作为迁移作业的一部分,我正在尝试从表中提取数据。
架构如下:
CREATE TABLE IF NOT EXISTS ${keyspace}.entries (
username text,
entry_type int,
entry_id text,
PRIMARY KEY ((username, entry_type), entry_id)
);
为了查询表,我们需要分区键,即主键的第一部分。
因此,如果我们知道username 和entry_type,我们就可以查询该表。
在这种情况下,username 可以是任意值,但 entry_type 是 0-9 范围内的整数。
在提取时,我们为每个用户名迭代表 10 次,以确保我们尝试所有版本的 entry_type。
由于用户名列表已用完,我们再也找不到任何条目。但我们的nodetool tablestats 报告说,表中仍有数据,甚至数千兆字节。因此,我们假设该表不为空。
但我找不到检查表格以找出表格中剩余的用户名的方法。如果我可以检查它,我可以将表中留下的用户名添加到我们的提取作业中,最终我们可以耗尽表。但我不能像这样简单地查询表:
SELECT * FROM ${keyspace}.entries LIMIT 1
因为 cassandra 需要分区键才能进行有意义的查询。
我能做些什么来弄清楚我们的桌子上还剩下什么?
【问题讨论】:
-
在“提取过程”中,您是否删除了找到的条目?我试图了解您为什么不希望检索数据。如果您正在删除记录,您是否考虑 GC 宽限期(
gc_grace_seconds设置)这将在删除执行和实际从系统中删除记录之间产生延迟 -
是的,对于我们找到的每条记录,我们将它们插入到另一个表中,然后从相关表中删除它们。