我想創建一個掃描儀,它會給我帶有2個前綴過濾器的結果
例如,我希望所有行的鍵以字符串「x」開頭或以字符串「y」。
目前我知道的只有一個前綴以下方式來做到這一點:
設置多個前綴行篩選器到掃描儀hbase java
scan.setRowPrefixFilter(prefixFiltet)
我想創建一個掃描儀,它會給我帶有2個前綴過濾器的結果
例如,我希望所有行的鍵以字符串「x」開頭或以字符串「y」。
目前我知道的只有一個前綴以下方式來做到這一點:
設置多個前綴行篩選器到掃描儀hbase java
scan.setRowPrefixFilter(prefixFiltet)
在這種情況下,你不能使用setRowPrefixFilter
API,你必須使用更普遍setFilter
API,是這樣的:
scan.setFilter(
new FilterList(
FilterList.Operator.MUST_PASS_ONE,
new PrefixFilter('xx'),
new PrefixFilter('yy')
)
);
我剛剛試過,但它似乎並不您可以添加一個正則表達式的RowPrefixFilter,所以我猜解是使用兩個請求
scan.setRowPrefixFilter("x")
scan.setRowPrefixFilter("y")
這會得到你想要的行。
如果你這樣做,只會返回以「y」開頭的鍵,因爲你重寫了「x」。我的目標是獲得1個掃描對象,這將有兩個鍵的結果。 – MosheCh
糟糕,我忘了補充說你應該分別執行每次掃描。嘗試執行一個,存儲結果並添加第二個結果 –
我有實施一批集前綴過濾器,也許可以幫助你
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);
關於此解決方案性能的說明:您正在執行全表掃描並將所有行通過這些過濾器。一般來說,這是非常低效的。對於大型表格,只有少數使用'scan.setRowPrefixFilter(prefix)'進行多次掃描的前綴可能會更快。 –