1

我必须尽快从 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 都有索引。还有其他方法吗?

谢谢!

4

2 回答 2

1

通常,GeoMesa 利用的分布式数据库针对插入进行了优化。删除大量记录将导致大量次要和主要压缩。

使问题更加复杂的是,每个索引都会为每条记录写入额外的条目,这会增加要删除的内容的数量。

在想要删除整个表/特征类型的情况下,通常可以。

潜在地,如果删除数百万条记录会频繁出现,可以为底层数据存储编写批量删除帮助程序。(例如,使用具有某些配置的 GeoMesa 文件系统,这种删除可能是微不足道的。)

于 2017-11-04T22:35:39.913 回答
0

我建议并行化删除,就像并行化摄取代码一样。对于删除,您需要将 CQL 过滤器分解为离散的部分,例如(在伪代码中)dtg between now/1 hour agodtg between 1 hour ago/2 hours ago等。

删除比插入慢,原因如下:

  1. 他们需要额外的查询来查找要删除的数据
  2. 它们通常不是可并行化的,因此 GeoMesa 不提供开箱即用的并行删除操作
  3. 它们通常会触发底层数据库中的一些维护(例如 Accumulo 压缩)

并行删除将有助于前两项,但对数据库维护没有帮助。因此,您的数据库可能最终仍会在负载下挣扎。

DATE_TIME_FIELD您还应该确保在和之间使用更具区分性的索引TIMING_FIELD。您可以通过设置基数提示来做到这一点,如下所述:

http://www.geomesa.org/documentation/user/datastores/index_basics.html#cardinality-hints

于 2017-11-27T14:08:42.657 回答