2016-07-04 53 views
0

我有一個寬列模式的表。隨着時間的推移,我將數據保存到行中,模式將有效更改。在時間= t1時,我可能在時間= t2時有列a,b,c,我可能有a,b和d。HBase - 獲取單元格,使時間戳在行中是最新的,而不需要過濾客戶端

每當我從表中獲得時,我只想要具有最新時間戳的單元格用於整行。所以在t2,我會排除列c的單元格。

如果我將maxversions設置爲1,我可以得到行中每個單元格的最新值,但我不希望這樣。相反,我只想要來自上次交易的單元格。

爲了加快事情,當從事務到事務的列有很大差異時,我想做這個過濾服務器端。我曾計劃使用DependentColumnFilter和一個名爲ts的列。我想過濾單元格,使它們的時間戳與列ts的時間戳相匹配 - 是否可以在不過濾客戶端的情況下進行?

+0

「我曾計劃使用DependentColumnFilter和一個名爲ts的列。」如何使用該過濾器實現目標?你計劃插入'ts'列的每一行? –

+0

是的,基本上添加一個列,我可以從中導出交易的時間戳。如果每次我寫,我加它,那麼這應該沒問題。但是,該過濾器會從依賴列中構建時間戳的哈希集,因此可以返回幾個。我得到的想法(我不想使用自定義過濾器,因爲我需要讓另一個部門爲我安裝jar)與您的答案完全相同。 – richardstartin

回答

1

自定義過濾器可以做這個工作:

public class GetLatestColumnsFilter extends TimestampsFilter { 
    private static final Log log = LogFactory.getLog(GetLatestColumnsFilter.class); 
    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(); 
    } 

} 

There是一個例子,如果你想看看。

相關問題