我需要从hbase中删除数据。我想根据hbase中的行键删除每个单元格的最新版本。我想到了一种方法,用给定的rowkey获取每列的列名和最新时间戳…..然后用每列及其时间戳迭代地执行delete操作。但是我不能得到列名,所以我不能这样做。如果您有任何想法或工作代码,请与我们分享?
o4tp2gmn1#
这是我做过的一个自定义过滤器, GetLatestColumnsFilter ,它可以用来获取具有最新时间戳的列,我认为可以用来解决您的问题。
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(); } }
dly7yett2#
从hbase 0.94版官方指南中,您可以看到:通过创建墓碑标记删除工作。例如,假设我们要删除一行。为此,您可以指定一个版本,或者默认使用currenttimemillis。这意味着“删除版本小于或等于此版本的所有单元格”。hbase从不就地修改数据,例如,delete不会立即删除(或标记为已删除)存储文件中与delete条件相对应的条目。相反,写一个所谓的墓碑,它将掩盖删除的值[17]。如果删除行时指定的版本大于行中任何值的版本,则可以考虑删除整行。所以我不认为遵循标准的删除过程有什么问题。但是,如果只想删除单元格的最新版本,可以使用 setTimestamp 扫描类的方法。所以,你可以做的是:
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方法
2条答案
按热度按时间o4tp2gmn1#
这是我做过的一个自定义过滤器,
GetLatestColumnsFilter
,它可以用来获取具有最新时间戳的列,我认为可以用来解决您的问题。dly7yett2#
从hbase 0.94版官方指南中,您可以看到:
通过创建墓碑标记删除工作。例如,假设我们要删除一行。为此,您可以指定一个版本,或者默认使用currenttimemillis。这意味着“删除版本小于或等于此版本的所有单元格”。hbase从不就地修改数据,例如,delete不会立即删除(或标记为已删除)存储文件中与delete条件相对应的条目。相反,写一个所谓的墓碑,它将掩盖删除的值[17]。如果删除行时指定的版本大于行中任何值的版本,则可以考虑删除整行。
所以我不认为遵循标准的删除过程有什么问题。
但是,如果只想删除单元格的最新版本,可以使用
setTimestamp
扫描类的方法。所以,你可以做的是:但是,如果你的时间戳在不同的单元格中是不一样的,这将不适用于所有的单元格。这可能会。
不过,我不能保证这会奏效。官方的指南很模糊,我可能误解了任何东西。如果我确实误解了,请提醒我,我将删除此答案。
在这里,我为scan类提供了informationsettimestamp方法,为delete类提供了settimestamp方法