Я пытаюсь получить среднее значение некоторого квалификатора, который записан как тип 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