Вот как на самом деле работает сканирование (протестировано в 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;
}