2016-08-22 2 views
1

Я хочу создать один сканер, который даст мне результат с двумя префиксными фильтрами
Например, я хочу, чтобы все строки, которые их ключ запускает со строкой «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); 
Смежные вопросы