HBase SingleColumnValueFilter не работает в avg-методе AggregationClient - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь получить среднее значение некоторого квалификатора, который записан как тип BigDecimal в HBase для ключевых строк с определенным префиксом.

 @Test(timeout = 300000)
    public void testAvgWithFilter() throws Throwable {
    AggregationClient aClient = new AggregationClient(conf);
    Scan scan = new Scan();
    scan.addColumn(TEST_FAMILY, TEST_QUALIFIER);
    Filter f = new PrefixFilter(Bytes.toBytes("foo:bar"));
    scan.setFilter(f);
    final ColumnInterpreter<Double, Double, EmptyMsg, DoubleMsg, DoubleMsg>       ci = new DoubleColumnInterpreter();
    Double avg = null;
    avg = aClient.avg(TEST_TABLE, ci, scan);
    assertEquals(Double.NaN, avg, 0);
    }

Я использовал фрагмент в коде общего доступа на https://www.programcreek.com/java-api-examples/class=org.apache.hadoop.hbase.client.coprocessor.AggregationClient&method=avg.В моем случае я использую SingleColumnValueFilter вместо PrefixFilter, и когда я инициализирую метод avg, фильтр не работает.В случае использования метода rowCount, который также поддерживается, SingleColumnValueFilter учитывается, и весь запрос работает нормально.

Вот мой фрагмент:

AggregationClient aggClient = new AggregationClient(conf);
            Table table = connection.getTable(TableName.valueOf(Bytes.toBytes(tableName)));

          Scan scan = new Scan();
          scan.addFamily(Bytes.toBytes(columnFamily));
          scan.setRowPrefixFilter(Bytes.toBytes(rowKeyPrefix));


            FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);

            SingleColumnValueFilter filter1 = new SingleColumnValueFilter(
                    Bytes.toBytes(columnFamily),
                    Bytes.toBytes("columName"),
                    CompareOperator.EQUAL,
                    new BinaryComparator(Bytes.toBytes(searchValue1))
            );

            SingleColumnValueFilter filter2 = new SingleColumnValueFilter(
                    Bytes.toBytes(columnFamily),
                    Bytes.toBytes("columnName"),
                    CompareOperator.EQUAL,
                    new BinaryComparator(Bytes.toBytes(searchValue2))
            );


              SingleColumnValueFilter[] filters = {
                      filter1
                      filter2

              };

              for (Filter f : filters) {
                  filterList.addFilter(f);
              }

              scan.setFilter(filterList);

              scan.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes("sog"));


            final ColumnInterpreter<BigDecimal,
                    BigDecimal,
                    HBaseProtos.EmptyMsg,
                    HBaseProtos.BigDecimalMsg,
                    HBaseProtos.BigDecimalMsg> columnInterpreter =
                    new BigDecimalColumnInterpreter();


            Double avgx = null;
            avgx = aggClient.avg(table, ci, scan);

Почему фильтр не работает?Моя версия HBase - 2.0.0, Hadoop 2.7.4

...