Прежде всего, ваш дизайн rowkey должен быть идеальным, на основе которого вы можете определить свой шаблон доступа для запроса.
1) Получить хорошо, если вы знаете, какие rowkeys вы можете заранее Гости могут воспользоваться
В этом случае вы можете использовать метод, как показано ниже, он возвращает массив результата.
/**
* Method getDetailRecords.
*
* @param listOfRowKeys List<String>
* @return Result[]
* @throws IOException
*/
private Result[] getDetailRecords(final List<String> listOfRowKeys) throws IOException {
final HTableInterface table = HBaseConnection.getHTable(TBL_DETAIL);
final List<Get> listOFGets = new ArrayList<Get>();
Result[] results = null;
try {
for (final String rowkey : listOfRowKeys) {// prepare batch of get with row keys
// System.err.println("get 'yourtablename', '" + saltIndexPrefix + rowkey + "'");
final Get get = new Get(Bytes.toBytes(saltedRowKey(rowkey)));
get.addColumn(COLUMN_FAMILY, Bytes.toBytes(yourcolumnname));
listOFGets.add(get);
}
results = table.get(listOFGets);
} finally {
table.close();
}
return results;
}
2)
В моем опыте с производительностью Hbase сканирования является немного низкий, если мы не имеют совершенную конструкцию RowKey. Я рекомендую, если вы выбираете сканирование для вышеупомянутого сценария.
FuzzyRowFilter(see hbase-the-definitive) This is really useful in our case Мы использовали объемные клиентов, как карта-свертка, а также автономные клиенты HBase
Этот фильтр действует на ключи строк, но в нечеткой манере. Ему нужен список ключей строк, который должен быть возвращен, плюс сопровождающий массив byte [], который означает важность каждого байта в ключе строки. Конструктор как таковые:
FuzzyRowFilter(List<Pair<byte[], byte[]>> fuzzyKeysData)
fuzzyKeysData определяет упомянутое значение ключевого байта строки, принимая одну из двух значений:
0 Указует, что байты в той же позиции в строке ключ должен соответствовать как есть. 1 означает, что соответствующий байт строки строки не имеет значения и всегда принимается.
Пример: Частичная Строка Ключ соответствие Возможного примера сопоставление частичных ключей, но не слева направо, а где-то внутри ключа соединения. Предполагая формат ключа строки _, с частями фиксированной длины, где 4, равен 2, равен 4 и имеет длину 2 байта. Теперь приложение запрашивает всех пользователей, которые выполнили определенное действие (закодировано как 99) в январе любого года. Тогда пара для ряда ключевых и нечетких данных будет следующим: «?»
ряд ключ «???? ???? _ 01», где является произвольным символом, так как он игнорируется. нечеткие данные = "\ x01 \ x01 \ x01 \ x01 \ x00 \ x00 \ x00 \ x00 \ x01 \ x01 \ x01 \ x01 \ x00 \ x00 \ x00" Другими словами, массив нечетких данных указывает фильтру на найти все строки, соответствующие «???? ???? _ 01", где "?" примет любой символ.
Преимущество этого фильтра в том, что он может, вероятно, вычислить следующий соответствующий ключ строки, когда дело доходит до конца соответствующего. Он реализует метод getNextCellHint(), чтобы помочь серверам в быстрой пересылке в следующий ряд строк, которые могут совпадать. Это ускоряет сканирование, особенно когда пропущенные диапазоны довольно велики. В примере 4-12 используется фильтр для захвата определенных строк из набора тестовых данных.
Пример фильтрации по префиксом колонке
List<Pair<byte[], byte[]>> keys = new ArrayList<Pair<byte[], byte[]>>();
keys.add(new Pair<byte[], byte[]>(
Bytes.toBytes("row-?5"), new byte[] { 0, 0, 0, 0, 1, 0 }));
Filter filter = new FuzzyRowFilter(keys);
Scan scan = new Scan()
.addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes("col-5"))
.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
System.out.println(result);
}
scanner.close();
В примере кода также добавляет колонку фильтрации для сканирования, только, чтобы держать выход коротко:
Добавление строк в таблице ... Результаты сканирования :
keyvalues={row-05/colfam1:col-01/1/Put/vlen=9/seqid=0,
row-05/colfam1:col-02/2/Put/vlen=9/seqid=0,
...
row-05/colfam1:col-09/9/Put/vlen=9/seqid=0,
row-05/colfam1:col-10/10/Put/vlen=9/seqid=0}
keyvalues={row-15/colfam1:col-01/1/Put/vlen=9/seqid=0,
row-15/colfam1:col-02/2/Put/vlen=9/seqid=0,
...
row-15/colfam1:col-09/9/Put/vlen=9/seqid=0,
row-15/colfam1:col-10/10/Put/vlen=9/seqid=0}
Проводка тестового кода добавляет 20 строк в таблицу с именем row-01 to row-20. Мы хотим получить все строки, соответствующие строке шаблона-5, другими словами, все строки, которые заканчиваются на номере 5. Вышеприведенный результат подтверждает правильный результат.
Большое спасибо за ответ. Я написал метод, который просматривает столбец 'HOST' и возвращает список строк всех соответствующих' ROWKEYs' с 'host = x'. Это занимает 3 секунды. Затем я написал метод, который перебирает все эти «ROWKEYs» и «ПОЛУЧИТ» все их «СОБЫТИЯ». Это занимает около 120 секунд. Как это может быть «O (1)» для каждого «GET»? –
Под 'n' я имею в виду количество строк. Также я использую Rowkeys по умолчанию, а не свой собственный столбец –
@GregPeckory OK, теперь я «получаю это». Поэтому я обновил свой ответ, чтобы предложить: используйте конкатенированный Rowkey, который состоит из « ROWKEY». В этом случае вы можете выполнить сканирование диапазона на «», «», который будет возвращать ** все ** записей для этого узла в одном 'get'. –
javadba