У меня есть несколько таблиц HBase. Все они имеют разные ключи, но каждый ключ имеет 32-битный целочисленный идентификатор владельца как часть ключа. Для каждой таблицы это смещение разное, но я знаю эти смещения. Теперь я передан в коллекцию идентификаторов, и мне нужно вывести данные, относящиеся к переданным владельцам, в файл. т.е. Мне нужно сделать что-то эквивалентное следующему оператору SQL:
SELECT * FROM table WHERE substr(key_field, offset, length) IN (...);
Пытаясь добиться этого, я написал что-то вроде этого:
public class SubKeyComparator extends BinaryComparator {
private Set<Integer> idSet;
private int idLength = 4;
private int idOffset = 0;
// getters/setters are here
@Override
public int compareTo(byte[] value) {
return idSet.contains(Bytes.toInt(value, offset, length))? 0 : 1;
}
}
Оказалось, что он работает не так, как предполагалось. На самом деле он вообще не работает. Я открываю стол, и когда я пытаюсь получить
ResultScanner scanner = htable.getScanner(scan);
Он немного ждет, а затем выдает исключение org.apache.hadoop.hbase.client.RetriesExhaustedException, показывающее дюжину исключений java.io.EOFException в org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1231 )
Попытки найти решение в сети или понять, что не так в исходном коде HBase, не дали существенных результатов. Если я не вставляю свой фильтр в объект проверки, все работает нормально.
Если кто-то знает, что не так, или сделал что-то подобное, ваша помощь будет очень признательна.