Hbase обратное сканирование - PullRequest
1 голос
/ 04 июля 2019

Мои ключи данных хранятся в формате trade<date><index>

trade1907030001
trade1907030002
trade1907040001
trade1907040002
trade1907050001
trade1907050002

Как правильно реализовать «обратное» сканирование, чтобы выполнять итерацию по всем сделкам за день или от конкретной строки до конца дня или даже между двумя точными сделками?

Scan scan = new Scan();
scan.setReversed(true);
scan.setStartRow(Bytes.unsignedCopyAndIncrement(Bytes.toBytes(trade + day)));
scan.setStopRow(Bytes.toBytes(trade + day));

Имея в виду, что согласно документу начало строки является включающим, а конец строки - исключительным, мы пропустим самую старую сделку дня. Если строка на самом деле является сделкой строки сделки, мы не должны увеличивать ключ, в противном случае будет выбрана следующая сделка. Это стало условным. Как я могу заставить его работать надежно в разных ситуациях?

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Вы можете использовать:

Scan scan = new Scan();
scan.setReversed(true);
scan.setRowPrefixFilter(Bytes.toBytes(trade + day));

, который автоматически заботится о том, чтобы первая и последняя сделки не игнорировались.

Источник: https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Scan.html#setRowPrefixFilter-byte:A-

0 голосов
/ 05 июля 2019

Вот как на самом деле работает сканирование (протестировано в hbase shell v1.2.0-cdh5.13.3):

trade171020S00001                                          column=inp:data_as_of_date, timestamp=1511793438335, value=20171020
trade171018B00001                                          column=inp:data_as_of_date, timestamp=1511793438335, value=20171020
trade171020S00001                                          column=inp:data_as_of_date, timestamp=1511793438335, value=20171020
trade171113B00001                                          column=inp:data_as_of_date, timestamp=1511993729979, value=20171114
trade171114S00001                                          column=inp:data_as_of_date, timestamp=1511993729979, value=20171114

scan 'namespace:table', {COLUMNS=>['inp:data_as_of_date'], STARTROW=>'trade171018B00001', ENDROW=>'trade171113B00001'}
ROW                                                                  COLUMN+CELL
trade171018B00001                                          column=inp:data_as_of_date, timestamp=1511793438335, value=20171020
trade171020S00001                                          column=inp:data_as_of_date, timestamp=1511793438335, value=20171020

scan 'namespace:table', {COLUMNS=>['inp:data_as_of_date'], STARTROW=>'trade171113B00001', ENDROW=>'trade171018B00001', REVERSED=>true}
ROW                                                                  COLUMN+CELL
trade171113B00001                                          column=inp:data_as_of_date, timestamp=1511993729979, value=20171114
trade171020S00001                                          column=inp:data_as_of_date, timestamp=1511793438335, value=20171020

scan 'namespace:table', {COLUMNS=>['inp:data_as_of_date'], STARTROW=>'trade171018', ENDROW=>'trade171113'}
ROW                                                                  COLUMN+CELL
trade171018B00001                                          column=inp:data_as_of_date, timestamp=1511793438335, value=20171020
trade171020S00001                                          column=inp:data_as_of_date, timestamp=1511793438335, value=20171020

scan 'namespace:table', {COLUMNS=>['inp:data_as_of_date'], STARTROW=>'trade171113', ENDROW=>'trade171018', REVERSED=>true}
ROW                                                                  COLUMN+CELL
trade171020S00001                                          column=inp:data_as_of_date, timestamp=1511793438335, value=20171020
trade171018B00001                                          column=inp:data_as_of_date, timestamp=1511793438335, value=20171020

scan 'namespace:table', {COLUMNS=>['inp:data_as_of_date'], ROWPREFIXFILTER=>'trade171113'}
ROW                                                                  COLUMN+CELL
trade171113B00001                                          column=inp:data_as_of_date, timestamp=1511993729979, value=20171114

scan 'namespace:table', {COLUMNS=>['inp:data_as_of_date'], ROWPREFIXFILTER=>'trade171113', REVERSED=>true}
ROW                                                                  COLUMN+CELL
0 row(s) in 0.2300 seconds

Если начальная строка и конечная строка короче, чем ключи строки таблицы , следующие будут работать как положено

Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes(trade + day));
scan.setStopRow(Bytes.unsignedCopyAndIncrement(Bytes.toBytes(trade + day)));

Scan scan = new Scan();
scan.setReversed(true);
scan.setStartRow(Bytes.unsignedCopyAndIncrement(Bytes.toBytes(trade + day)));
scan.setStopRow(Bytes.toBytes(trade + day));

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

Scan scan = new Scan();
scan.setStartRow(createKey("S", productSymbolId, YYMMDD.print(fromDate)));
scan.setStopRow(createNextKey("S", productSymbolId, YYMMDD.print(toDate)));

Scan scan = new Scan();
scan.setReversed(true);
scan.setStartRow(createKeyBeforeNext("A", stripSpaces(accountId), YYMMDD.print(toDate)));
scan.setStopRow(createKeyBefore("A", stripSpaces(accountId), YYMMDD.print(fromDate)));

, где

key === 54686973697361746573746b6579
next === 54686973697361746573746b657a
before === 54686973697361746573746b6578ffffffffffffffffff
beforeNext === 54686973697361746573746b6579ffffffffffffffffff

осуществление

<code>/**
 * <h4>usage</h4>
 * 
 * <pre>
 * Scan scan = new Scan();
 * scan.setStartRow(createKey("S", productSymbolId, YYMMDD.print(fromDate)));
 * scan.setStopRow(createNextKey("S", productSymbolId, YYMMDD.print(toDate)));
 *
 * Scan scan = new Scan();
 * scan.setReversed(true);
 * scan.setStartRow(createKeyBeforeNext("A", stripSpaces(accountId), YYMMDD.print(toDate)));
 * scan.setStopRow(createKeyBefore("A", stripSpaces(accountId), YYMMDD.print(fromDate)));
 * 
* *

spec

* *
 * key === 54686973697361746573746b6579
 * next === 54686973697361746573746b657a
 * before === 54686973697361746573746b6578ffffffffffffffffff
 * beforeNext === 54686973697361746573746b6579ffffffffffffffffff
 * 
* * @see #createKeyBefore (String ...) * @see #createKeyBeforeNext (String ...) * @see #createNextKey (String ...) * / // аналогично Bytes.add (последний байт [] a, последний байт [] b, последний байт [] c) открытый статический байт [] createKey (String ... parts) { byte [] [] bytes = новый байт [parts.length] []; int size = 0; for (int i = 0; i * key === 54686973697361746573746b6579 * next === 54686973697361746573746b657a * * * @see #createKey (String ...) * / открытый статический байт [] createNextKey (String ... parts) { return unsignedCopyAndIncrement (createKey (parts)); } / ** * Создайте ближайшую строку перед * *
 * key === 54686973697361746573746b6579
 * before === 54686973697361746573746b6578ffffffffffffffffff
 * 
* * @see #createKey (String ...) * / открытый статический байт [] createKeyBefore (String ... parts) { return createClosestRowBefore (createKey (parts)); } / ** * Создайте ближайшую строку перед следующей строкой * *
 * key === 54686973697361746573746b6579
 * beforeNext === 54686973697361746573746b6579ffffffffffffffffff
 * 
* * @see #createKey (String ...) * / открытый статический байт [] createKeyBeforeNext (String ... parts) { return createClosestRowBefore (createNextKey (parts)); } // из источников hbase ClientScanner.createClosestRowBefore (byte [] row) закрытый статический байт [] createClosestRowBefore (byte [] row) { если (строка == ноль) бросить новое IllegalArgumentException («Переданная строка пуста»); if (Bytes.equals (строка, HConstants.EMPTY_BYTE_ARRAY)) return MAX_BYTE_ARRAY; if (row [row.length - 1] == 0) return Arrays.copyOf (row, row.length - 1); byte [] closestFrontRow = Arrays.copyOf (row, row.length); closestFrontRow [row.length - 1] = (byte) ((closestFrontRow [row.length - 1] & 0xff) - 1); closestFrontRow = Bytes.add (closestFrontRow, MAX_BYTE_ARRAY); return closestFrontRow; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...