1

我将 Aws Keyspaces 与 c# 一起使用,首先我从表中选择以按分区键删除,然后尝试使用 where 子句从表中删除许多行:

 var daysToDelete = DateTimeOffset.UtcNow.AddDays(-1);
     foreach (var result in selectResult)
                {
                    Cql deleteQuery = new Cql("WHERE interfaceid = ? and environment = ? and transactionguid < ?", 
                    result .InterfaceId,
                    result .Environment,
                    TimeUuid.Min(daysToDelete)).WithOptions(o => o.SetPageSize(100));
                    mapper.Delete<Transaction>(deleteQuery);
                }

它大约有 3k - 6k 行,当我试图删除这些行时,我得到一个错误:

“范围删除请求受限于单个范围内可删除的项目数量”

我该如何解决这个问题?

4

2 回答 2

1

使用 Amazon Keyspaces,您可以在一次操作中删除一个范围内的多达 1,000 行。要在单个分区中删除超过 1,000 行,最好将操作分解为较小的范围或迭代主键。

  • 首先尝试按分区删除 - 如果大多数分区少于 1,000 行,则最好尝试按分区删除。如果分区包含超过 1,000 行,请尝试按集群列删除。
  • 按聚类列删除 - 如果您的模型包含多个聚类列,您可以使用列层次结构删除多行。聚类列是一种嵌套结构,可以通过对顶级列进行操作来删除很多项。
  • 按单个行删除 - 遍历项目并按其完整主键(分区列和集群列)删除每一行。
  • 还可以考虑将行拆分为多个分区。在 NoSQL 中,最好在表分区之间分配吞吐量。这可以跨物理资源均匀分布数据和访问,从而提供最佳吞吐量。

还要考虑以下有关删除繁重工作负载的问题。

  • 使用 Amazon Keyspaces,CQL 分区可以包含几乎无限数量的行。这使您可以比传统的 Cassandra 指导的 100 MB 扩展“更宽”的分区。随着时间的推移,时间序列或壁架超过 GB 数据增长的情况并不少见。
  • 使用 Amazon Keyspaces,当您删除繁重的工作负载时,无需考虑压缩策略或墓碑。您可以在不影响读取性能的情况下随意删除。
于 2021-08-09T22:30:40.830 回答
1

这是 AWS Keyspaces 的一个已知限制。一种可能的解决方案可能是:

  • select transactionguid WHERE interfaceid = ? and environment = ? and transactionguid < ?
  • 迭代结果,记住transactionguid当你越过千、两千等的边界时。
  • 迭代记住的边界执行delete

PS 为什么不使用更兼容的云 Cassandra,比如 DataStax Astra 或类似的东西?AWS Keyspaces 不是真正的 Cassandra,因此您始终需要自己处理限制。

于 2021-04-01T15:16:39.167 回答