如何解决如何解决 aws Keyspaces 中的“范围删除请求限制在单个范围内可以删除的项目数量”问题?
我在 C# 中使用 Aws Keyspaces,首先我从表中选择以按分区键删除,然后尝试使用 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 行,而我正在尝试删除这些行 我收到一个错误:
我该如何解决这个问题?
解决方法
这是一个 known limitation of AWS Keyspaces。一种可能的解决方案是:
- 做
select transactionguid WHERE interfaceid = ? and environment = ? and transactionguid < ?
- 当您跨越千、两千等边界时,记住
transactionguid
对结果进行迭代。 - 在记住的边界上迭代执行
delete
附言为什么不使用更兼容的云 Cassandra,比如 DataStax Astra 或类似的东西? AWS Keyspaces 不是真正的 Cassandra,因此您始终需要自己处理限制。
,使用亚马逊密钥空间,you can delete up to 1,000 rows within a range in a single operation。要删除单个分区中的 1,000 多行,最好按较小的范围拆分操作或迭代主键。
- 首先尝试按分区删除 - 如果大多数分区少于 1,000 行,最好尝试按分区删除。如果分区包含超过 1,000 行,请尝试通过聚类列删除。
- 按聚类列删除——如果您的模型包含多个聚类列,您可以使用列层次结构删除多行。聚类列是嵌套结构,您可以通过对顶级列进行操作来删除许多项。
- 按单行删除 - 遍历项目并按其完整主键(分区列和集群列)删除每一行。
- 还要考虑将行拆分到多个分区上。在 NoSQL 中,最好跨表分区分配吞吐量。这会在物理资源之间均匀分布数据和访问,从而提供最佳吞吐量。
还要考虑以下有关删除繁重工作负载的事项。
- 使用 Amazon Keyspaces,CQL 分区可以包含几乎无限数量的行。这允许您扩展比传统 Cassandra 指导 100 MB 更“宽”的分区。随着时间的推移,时间序列或平台的数据量超过 GB 的情况并不少见。
- 使用 Amazon Keyspaces,当您删除繁重的工作负载时,无需考虑压缩策略或逻辑删除。您可以随意删除,而不会影响读取性能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。