如何删除hbase中基于rowkey的所有列的最新版本

sq1bmfud  于 2021-06-10  发布在  Hbase
关注(0)|答案(2)|浏览(449)

我需要从hbase中删除数据。我想根据hbase中的行键删除每个单元格的最新版本。我想到了一种方法,用给定的rowkey获取每列的列名和最新时间戳…..然后用每列及其时间戳迭代地执行delete操作。
但是我不能得到列名,所以我不能这样做。
如果您有任何想法或工作代码,请与我们分享?

o4tp2gmn

o4tp2gmn1#

这是我做过的一个自定义过滤器, 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();
    }

}
dly7yett

dly7yett2#

从hbase 0.94版官方指南中,您可以看到:
通过创建墓碑标记删除工作。例如,假设我们要删除一行。为此,您可以指定一个版本,或者默认使用currenttimemillis。这意味着“删除版本小于或等于此版本的所有单元格”。hbase从不就地修改数据,例如,delete不会立即删除(或标记为已删除)存储文件中与delete条件相对应的条目。相反,写一个所谓的墓碑,它将掩盖删除的值[17]。如果删除行时指定的版本大于行中任何值的版本,则可以考虑删除整行。
所以我不认为遵循标准的删除过程有什么问题。
但是,如果只想删除单元格的最新版本,可以使用 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();
}

不过,我不能保证这会奏效。官方的指南很模糊,我可能误解了任何东西。如果我确实误解了,请提醒我,我将删除此答案。
在这里,我为scan类提供了informationsettimestamp方法,为delete类提供了settimestamp方法

相关问题