一般情况下,轨迹数据都是以“追加”的方式写入到数据库中的。但在一些场景中,也会有删除时空对象的需求,HBase Ganos支持按时间段、按时空范围、按时空对象ID三种删除方式。

根据时间段删除

HBase Ganos支持使用HBase TTL技术来删除过期的数据,目前支持直接在HBase Shell中修改时空索引表的TTL属性来实现。如果建立了多个索引表,那么需要对每张索引表均执行该操作。

比如现有时空索引表xxx_z3和属性索引表xxx_attr,对5分钟之前的数据进行删除,那么需要执行语句:
Alter 'xxx_z3',{NAME=>'d',TTL=>300}
Alter 'xxx_attr',{NAME=>'d',TTL=>300}

根据时空范围删除

根据时空范围删除的方式,可以删除z2/xz2、z3/xz3这两类时空索引表,无法删除其他索引表的信息。如果此时还存在属性索引表,那么有可能造成时空索引表和属性索引表之间数据的不一致。建议当只有时空索引表时使用该方式进行删除。步骤如下:
  1. 构造filter,通过filter可以筛选出删除的对象,这个filter和查询时候构造的filter机制是相同的。
  2. 使用geotools的SimpleFeatureStore.removerFeatures接口删除符合filter的对象。
/**
 * 删除符合filter范围的数据
 * @param schema :schema名称
 * @param filterString :字符串描述的filter,需要符合ECQL语法
 * @throws Exception
 */
public void removeByFilter(String schema, String filterString) throws Exception {
    SimpleFeatureStore fs = (SimpleFeatureStore) ds.getFeatureSource(schema);
    //如果filterString为空,表示全部删除
    if (StringUtils.isEmpty(filterString)){
        fs.removeFeatures(Filter.INCLUDE);
        return;
    }
    Filter filterToDelete = ECQL.toFilter(filterString);
    fs.removeFeatures(filterToDelete);
}

根据空间对象ID删除

根据空间对象ID删除的方式,将会删除ID索引表中的数据,无法删除其他索引表的信息。如果只有一个ID索引表,那么可以用该方式进行删除。使用geotools中的SimpleFeatureStore.removeFeatures接口删除指定的ID对象。
public void removeById(String schema,String simpleFeatureId) throws Exception{
    //这里展示是通过FilterFactory2来构造filter
    FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2
    Filter filterToDelete = ff.id(ff.featureId(simpleFeatureId))
    SimpleFeatureStore fs = ds.getFeatureSource(schema);
    fs.removeFeatures(filterToDelete);
}