Hbase FilterList as MUST_PASS_ONE с двумя RowFilters возвращает все - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть семейство столбцов под названием odds_api с количеством строк с ключом строки: / bt = ?? / bm = ?? / mk = ?? / se = ??:

/bt=1/bm=MN/mk=344/se=23394/odds_api
/bt=1/bm=BY/mk=344/se=23394/odds_api
/bt=1/bm=SN/mk=344/se=23394/odds_api
/bt=1/bm=BB/mk=344/se=23394/odds_api
/bt=1/bm=SF/mk=344/se=23394/odds_api
/bt=1/bm=XY/mk=344/se=23394/odds_api

Iхочу фильтровать на основе списка значений bm или фильтра на основе bm = SF, BB, MN.

Для этого я создал список фильтров MUST_PASS_ONE от 1 до многих rowFilters (в зависимости от того, сколько значений запрашивает пользователь)

public ResultScanner scan(String id , List<String> bms) throws BigTableGetException {
    try{
        Table table = connection.getTable(TableName.valueOf(this.tableName));
        Scan scan = new Scan();
        scan.addFamily(Bytes.toBytes("odds_api"));
        FilterList mainFilterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);

        bms.stream()
                .forEach(bm -> {
                    mainFilterList.addFilter(new RowFilter(CompareOp.EQUAL, new RegexStringComparator("/bt="+id+"/bm="+bm+".*")));

                });
        System.out.println("this is the filter list " + mainFilterList.toString());

        scan.setFilter(mainFilterList);
        return table.getScanner(scan);
    }catch (IOException ex){
        throw new BigTableGetException("Failed to get rows in BigTable", ex);
    }
}

(я знаю - бессмысленный поток для forEach!)

Это прекрасно работает, когда указан только один bm, оператор печати:

this is the filter list FilterList OR (1/1): [RowFilter (EQUAL, /bt=1/bm=B4.*)]

однако, если указано более одного, возвращается все, оператор печати:

this is the filter list FilterList OR (2/2): [RowFilter (EQUAL, /bt=1/bm=B4.*), RowFilter (EQUAL, /bt=1/bm=PP.*)]

На самом деле, если я введу два или более «неправильных» значений bm, он все равно вернет!

Я прочитал: https://www.oreilly.com/library/view/hbase-the-definitive/9781449314682/ch04.html

Я также попытался переместитьсяbt =?отфильтруйте в отдельный фильтр MUST_PASS_ALL, а затем получите другой список фильтров строк для bm =?

this is the filter list FilterList AND (2/2): [FilterList AND (1/1): [RowFilter (EQUAL, .*bt=1)], FilterList OR (2/2): [RowFilter (EQUAL, .*/bm=B4.*), RowFilter (EQUAL, .*/bm=PP.*)]]

Те же проблемы.

Я, должно быть, упускаю что-то очевидное, любая помощь будет принята с благодарностью.

hbase версии:

<dependency>
    <groupId>com.google.cloud.bigtable</groupId>
    <artifactId>bigtable-hbase-1.x</artifactId>
    <version>1.4.0</version>
</dependency>

<dependency>
    <groupId>com.google.cloud.bigtable</groupId>
    <artifactId>bigtable-hbase-1.x-hadoop</artifactId>
    <version>1.4.0</version>
</dependency>

1 Ответ

0 голосов
/ 21 ноября 2018

Рассматривали ли вы использование одного регулярного выражения?"/bt=FOO/bm=(A|B|C|D).*" должно работать.

Также, пожалуйста, поднимите вопрос в https://github.com/GoogleCloudPlatform/cloud-bigtable-client. Кажется, где-то есть ошибкав коде клиента.

...