2016-08-22 60 views
1

我想創建一個掃描儀,它會給我帶有2個前綴過濾器的結果
例如,我希望所有行的鍵以字符串「x」開頭或以字符串「y」。
目前我知道的只有一個前綴以下方式來做到這一點:
設置多個前綴行篩選器到掃描儀hbase java

scan.setRowPrefixFilter(prefixFiltet) 

回答

2

在這種情況下,你不能使用setRowPrefixFilter API,你必須使用更普遍setFilter API,是這樣的:

scan.setFilter(
    new FilterList(
    FilterList.Operator.MUST_PASS_ONE, 
    new PrefixFilter('xx'), 
    new PrefixFilter('yy') 
) 
); 
+1

關於此解決方案性能的說明:您正在執行全表掃描並將所有行通過這些過濾器。一般來說,這是非常低效的。對於大型表格,只有少數使用'scan.setRowPrefixFilter(prefix)'進行多次掃描的前綴可能會更快。 –

2

我剛剛試過,但它似乎並不您可以添加一個正則表達式的RowPrefixFilter,所以我猜解是使用兩個請求

scan.setRowPrefixFilter("x") 
scan.setRowPrefixFilter("y") 

這會得到你想要的行。

+0

如果你這樣做,只會返回以「y」開頭的鍵,因爲你重寫了「x」。我的目標是獲得1個掃描對象,這將有兩個鍵的結果。 – MosheCh

+0

糟糕,我忘了補充說你應該分別執行每次掃描。嘗試執行一個,存儲結果並添加第二個結果 –

1

我有實施一批集前綴過濾器,也許可以幫助你

List<String> bindCodes = new ArrayList<>(); 
    bindCodes.add("CM0001"); 
    bindCodes.add("CE7563"); 
    bindCodes.add("DR6785"); 

    Scan scan = new Scan(); 
    scan.setCaching(50);//set get batch numbers 
    //set Column 
    scan.addColumn(HTableColumnEnum.GPS_CF_1.getCfName().getBytes(), LOCATION_CREATE_DATE_ARRAY); 
    //set Family 
    scan.addFamily(HTableColumnEnum.GPS_CF_1.getCfName().getBytes()); 

    //create filterList 
    FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE); 
    //put mulit prefix row key 
    bindCodes.forEach(s -> { 
     filterList.addFilter(new PrefixFilter(Bytes.toBytes(s))); 
    }); 

    //set filterList to scan 
    scan.setFilter(filterList);