从非常大的Cassandra表中删除大量行

从非常大的Cassandra表中删除大量行,cassandra,Cassandra,我有一个表Foo,有4列a、B、C、D。分区键是a。集群键是B、C、D 我想扫描整个表,找到D在集合(X,Y,Z)中的所有行 然后我想删除这些行,但我不想“杀死”Cassandra(因为压缩),我希望删除这些行时中断或风险最小 我该怎么做?你这里有个大问题。实际上,如果不扫描所有分区,就无法找到行。真正的问题是C*将允许您使用分区键限制查询,然后使用集群键按照它们在主键表声明中出现的顺序限制查询。所以如果你的PK是这样的: PRIMARY KEY (A, B, C, D) 然后你需要先按A过滤

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

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

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


我该怎么做?

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

PRIMARY KEY (A, B, C, D)
然后你需要先按A过滤,然后按B,C过滤,最后按d过滤

也就是说,对于查找行的部分,如果您只需要运行一次,那么

  • 可以扫描所有表并在应用程序逻辑中比较D
  • 如果知道A的值,可以并行查询每个分区,然后在应用程序中比较D
  • 您可以附加一个辅助索引,并尝试从那里利用速度
  • 请注意,根据您有多少个节点(3实际上不是一个选项,二级索引不可缩放)

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


    关于删除您的行,我认为在不触发压缩的情况下是无法做到的,它们是C*的一部分,您必须接受它们。如果您真的不能容忍墓碑式创建和/或压缩,唯一的替代方法是删除C*集群中的行,这通常意味着考虑一个不需要删除的新数据模型

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

    PRIMARY KEY (A, B, C, D)
    
    然后你需要先按A过滤,然后按B,C过滤,最后按d过滤

    也就是说,对于查找行的部分,如果您只需要运行一次,那么

  • 可以扫描所有表并在应用程序逻辑中比较D
  • 如果知道A的值,可以并行查询每个分区,然后在应用程序中比较D
  • 您可以附加一个辅助索引,并尝试从那里利用速度
  • 请注意,根据您有多少个节点(3实际上不是一个选项,二级索引不可缩放)

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


    关于删除您的行,我认为在不触发压缩的情况下是无法做到的,它们是C*的一部分,您必须接受它们。如果您真的不能容忍墓碑式创建和/或压缩,唯一的替代方法是删除C*集群中的行,这通常意味着考虑一个不需要删除的新数据模型

    我不需要做很多次。这是一次性清理的一部分。对我来说,只需创建另一个表,然后将过滤后的数据移动到那里并删除原始表可能更为理想。我从我的管理员那里听说,“太多”的墓碑创建对他们来说是非常有问题的。然后,你应该利用这种情况,通过创建多个适合于满足所有需要执行的查询的表来反规范化所有数据。这将是一场巨大的胜利。我不需要多次这样做。这是一次性清理的一部分。对我来说,只需创建另一个表,然后将过滤后的数据移动到那里并删除原始表可能更为理想。我从我的管理员那里听说,“太多”的墓碑创建对他们来说是非常有问题的。然后,你应该利用这种情况,通过创建多个适合于满足所有需要执行的查询的表来反规范化所有数据。这将是一个巨大的胜利。可能想检查一下删除压缩策略,不是直接的C*OSS的一部分,但可能不需要所有的读取就可以解决这个问题。可能想检查一下删除压缩策略,它不是C*OSS的一部分,但可以在不需要所有读取的情况下解决问题。