【问题标题】:Delete lots of rows from a very large Cassandra Table从一个非常大的 Cassandra 表中删除很多行
【发布时间】:2017-03-16 08:56:00
【问题描述】:

我有一个表 Foo,它有 4 列 A、B、C、D。分区键是 A。集群键是 B、C、D。

我想扫描整个表并找到 D 在集合中的所有行 (X, Y, Z)。

然后我想删除这些行,但我不想“杀死”Cassandra(因为压缩),我希望以最小的中断或风险删除这些行。

我该怎么做?

【问题讨论】:

标签: cassandra


【解决方案1】:

你这里有一个大问题。实际上,如果不实际扫描所有分区,您真的无法找到行。真正的问题是 C* 将允许您使用分区键限制查询,然后按照它们出现在 PRIMARY KEY 表声明中的顺序使用集群键。所以如果你的PK是这样的:

PRIMARY KEY (A, B, C, D)

那么您需要先按 A 过滤,然后按 B、C 过滤,最后再按 D 过滤。

话虽如此,对于查找行,如果这是您只需运行一次的部分,那么您

  1. 可以扫描您的所有表并在您的应用逻辑中比较 D。
  2. 如果您知道 A 的值,您可以并行查询每个分区,然后在您的应用程序中比较 D
  3. 您可以附加二级索引并尝试从那里利用速度。

请注意,根据您拥有的节点数量,3 确实不是一个选项,二级索引无法扩展)

如果您需要多次执行此类任务,我建议您创建另一个满足此查询的表,例如PRIMARY KEY (D),然后您只需扫描三个分区,这将非常快。

关于删除你的行,我认为没有触发压缩是没有办法的,它们是 C* 的一部分,你必须忍受它们。如果您真的不能容忍创建墓碑和/或压缩,唯一的选择是从 C* 集群中删除行,这通常意味着考虑一个不需要的新数据模型删除。

【讨论】:

  • 我不必多次这样做。这是一次性清理的一部分。对我来说,创建另一个表,然后将过滤后的数据移到那里并删除原始表可能更适合我。我从我的管理员那里听说过“太多”的墓碑创建对他们来说是个很大的问题。
  • 您应该利用这种情况,并通过创建多个表来非规范化所有数据以满足您需要执行的所有查询.这将是一场巨大的胜利。
猜你喜欢
  • 2020-12-06
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
相关资源
最近更新 更多