2012-10-12 17 views

回答

9

我想你正在尋找HBase中的SingleColumnValueFilter。正如在API

提到爲了防止發出的整行,如果在一行上未找到列中,篩選對象使用setFilterIfMissing(boolean)。否則,如果找到該列,則只有該值通過時纔會發射整行。如果該值失敗,該行將被過濾掉。

SingleColumnValueFilter希望值有X列「compareop的」的東西,說把此行如果ColumnX ==「X」 或 把此行如果ColumnX!=「前哨值ColumnX能從不採取「和setFilterIfMissing(true),這樣如果ColumnX有一些值,它就會返回。

我希望這會推動你朝着正確的方向前進。

+0

非常感謝。它幫助了很多。 upvoted – Sanket

1

您可以使用SkipFilter以及ColumnPrefixFilter。 ColumnPrefixFilter獲取列存在的鍵(一個HBase行將只有一個列,如果它有一個值)Skip過濾器會給你第一個過濾器上的「Not」,因此該行將被省略

+0

請注意,這隻會傳遞行中_all_行中的列通過前綴過濾器 –

0

Ankit Arnon user1573269

的唯一途徑,我可以得到它的工作,就像下面

所以 - 我有一個表列的規則1,規則2,規則3等。 行可以只有rule1列或rule1和rule2或rule1和rule2和rule3等。說 - 我想提取其中只有rule1的行。 現在這意味着,我將不得不跳過其中有rule2的行。

Scan getRules = new Scan(); 
    ColumnPrefixFilter rule1Filter = new ColumnPrefixFilter(Bytes.toBytes("rule1")); 
    SingleColumnValueFilter skipRule2Value = new  SingleColumnValueFilter(Bytes.toBytes("rules"),Bytes.toBytes("rule2"), 
    CompareOp.EQUAL,Bytes.toBytes("0")); 
    SkipFilter skipRule2 = new SkipFilter(skipRule2Value); 
    getRules.setFilter(rule1Filter); 
    getRules.setFilter(skipRule2); 
    ResultScanner scanner = htable.getScanner(getRules); 

雖然這工作,我不是很滿意的解決方案。它需要時間讓hbase弄清楚。我原以爲應該有一個更簡單的方法,不需要檢查價值。 Arnon,你的方法不起作用,因爲SkipFilter會跳過那些DONOT滿足條件的東西。因此,從ColumnPrefixFilter構造它會使需求失敗。