2016-09-15 164 views
0

我有一個要求從Hbase刪除數據。我想根據Hbase中的行鍵刪除每個單元格的最新版本。 我想到了一種方法來獲得每列的列名和最新的時間戳與給定的rowkey .....然後迭代地執行刪除操作與每列和它的時間戳。如何刪除最近版本的所有列基於rowkey在Hbase

但我無法獲得列名,所以我無法做到。

請分享如果您有任何想法或工作代碼?

回答

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(); 
    } 

} 
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

+1

感謝尼基爾的答案。我沒有在這裏控制時間戳,所以我認爲假設每個單元格有不同的時間戳是安全的。我將嘗試使用您已共享並將更新的代碼段。 –