如何根据Hbase中的rowkey删除所有列的最新版本

时间:2016-09-15 20:10:05

标签: hbase

我要求删除Hbase中的数据。我想根据Hbase中的行键删除每个单元格的最新版本。 我想到了一种方法来获取每列的列名和最新时间​​戳与给定的rowkey .....然后迭代地执行每个列及其时间戳的删除操作。

但是我无法获得列名,所以我无法做到。

如果您有任何想法或工作代码,请分享一下吗?

2 个答案:

答案 0 :(得分:0)

Here是我制作过的自定义过滤器GetLatestColumnsFilter,可用于获取具有最新时间戳的列,我认为可以用来解决您的问题。

public class GetLatestColumnsFilter extends TimestampsFilter {
    private long max;

    public GetLatestColumnsFilter() {
        super(new ArrayList<>());
        max = -1;
    }

    @Override
    public ReturnCode filterKeyValue(Cell v) {
        if (-1 == max) {
            max = Long.valueOf(v.getTimestamp());
        } else if (max != Long.valueOf(v.getTimestamp())) {
            return ReturnCode.SKIP;
        }
        return ReturnCode.INCLUDE;
    }

    public static GetLatestColumnsFilter parseFrom(byte[] pbBytes) throws DeserializationException {
        return new GetLatestColumnsFilter();
    }

}

答案 1 :(得分:0)

HBase official guide for version 0.94,您可以看到:

  

通过创建墓碑标记来删除工作。例如,我们假设   我们想删除一行。为此,您可以指定版本,否则   默认情况下,使用currentTimeMillis。这意味着“删除   版本小于或等于此版本的所有单元格“。   HBase从不修改数据,因此例如删除不会   立即删除(或标记为已删除)存储中的条目   与删除条件对应的文件。相反,一个所谓的   编写了墓碑,它将掩盖已删除的值[17]。如果   删除行时指定的版本大于版本   在行中的任何值,然后您可以考虑完整的行   删除。

所以我没有看到遵循标准删除程序的问题。

但是,如果您只想删除单元格的最新版本,可以使用Scan类的setTimestamp方法。所以,你能做的是:

List<Delete> deletes = new ArrayList<>();
Scan scan = new Scan();
scan.setTimestamp(latestVersionTimeStamp); //latestVersionTimeStamp is a long variable
//set your filters here
ResultScanner rscanner = table.getScanner(scan);
for(Result rs : rscanner){
    deletes.add(new Delete(rs.getRow()));
}
try{
    table.delete(deletes);
}
catch(Exception e){
    e.printStackTrace();
}

但是,如果您的时间戳在单元格中不相同,则不适用于所有这些时间戳。这可能会。

List<Delete> deletes = new ArrayList<>();
ArrayList<long> timestamps =  new ArrayList<>();//your list of timestamps
Delete d;
Scan scan = new Scan();
//set your filters here
ResultScanner rscanner = table.getScanner(scan);
for(Pair<Result, long> item : zip(rscanner, timestamps)){
    d=new Delete(item.getLeft().getRow())
    d.setTimestamp(item.getRight());
    deletes.add(d);
}
try{
    table.delete(deletes);
}
catch(Exception e){
    e.printStackTrace();
}
但是,我并不保证这会起作用。官方指南很模糊,我可能误解了任何东西。如果我确实误解了,请提醒我,我会删除这个答案。

我在哪里获取了我的信息 setTimestamp method for Scan classsetTimestamp method for Delete class