我有一個要求從Hbase刪除數據。我想根據Hbase中的行鍵刪除每個單元格的最新版本。 我想到了一種方法來獲得每列的列名和最新的時間戳與給定的rowkey .....然後迭代地執行刪除操作與每列和它的時間戳。如何刪除最近版本的所有列基於rowkey在Hbase
但我無法獲得列名,所以我無法做到。
請分享如果您有任何想法或工作代碼?
我有一個要求從Hbase刪除數據。我想根據Hbase中的行鍵刪除每個單元格的最新版本。 我想到了一種方法來獲得每列的列名和最新的時間戳與給定的rowkey .....然後迭代地執行刪除操作與每列和它的時間戳。如何刪除最近版本的所有列基於rowkey在Hbase
但我無法獲得列名,所以我無法做到。
請分享如果您有任何想法或工作代碼?
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();
}
}
從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
感謝尼基爾的答案。我沒有在這裏控制時間戳,所以我認爲假設每個單元格有不同的時間戳是安全的。我將嘗試使用您已共享並將更新的代碼段。 –