我要求删除Hbase中的数据。我想根据Hbase中的行键删除每个单元格的最新版本。 我想到了一种方法来获取每列的列名和最新时间戳与给定的rowkey .....然后迭代地执行每个列及其时间戳的删除操作。
但是我无法获得列名,所以我无法做到。
如果您有任何想法或工作代码,请分享一下吗?
答案 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 class和 setTimestamp method for Delete class