我必须尽快从Geomesa数据存储中删除大量功能(约1亿条记录)。我尝试使用:
String cql = DATE_TIME_FIELD + " BEFORE " +
strCurrentDateTime + ") AND " + "(" + TIMING_FIELD + " > 0)";
Filter filter = CQL.toFilter(cql);
featureStore.removeFeatures(filter)
然而,它的工作速度太慢了。DATE_TIME_FIELD和TIMING_FIELD都有索引。还有别的办法吗?
谢谢!
GeoMesa利用的分布式数据库通常会针对插入进行优化。删除大量记录将导致一些次要和主要的压缩。
使问题更加复杂的是,每个索引为每个记录写入额外的条目,这增加了要删除的内容的数量。
在想要删除整个表/功能类型的情况下,这通常是可以的
如果频繁出现删除数百万条记录的情况,则可能会为底层数据存储编写批量删除帮助程序。(例如,使用具有特定配置的GeoMesa文件系统,这种删除可能是微不足道的。)
我建议并行化删除,就像并行化摄取代码一样。对于删除,您需要将CQL过滤器分解为离散的部分,例如(在伪代码中)dtg between now/1 hour ago
、dtg between 1 hour ago/2 hours ago
等。
删除比插入慢,原因如下:
- 它们需要一个额外的查询来查找要删除的数据
- 它们通常不可并行,因此GeoMesa不提供开箱即用的并行删除操作
- 它们通常会触发底层数据库中的一些维护(例如Accumulo压缩)
并行删除将有助于前两项,但对数据库维护没有帮助。因此,您的数据库可能仍会在负载下苦苦挣扎。
您还应该确保在DATE_TIME_FIELD
和TIMING_FIELD
之间使用更具区别性的索引。您可以通过如下所述设置基数提示来做到这一点:
http://www.geomesa.org/documentation/user/datastores/index_basics.html#cardinality-提示