HBase Stargate Scanner - startRow и endRow не работают
У меня возникли серьезные проблемы с попыткой сканирования таблицы с помощью HBase Stargate. Моя схема строки HBase в основном objectidnumber_languagecode_date_randomhash, т.е.
1_en_2014-12-12_1432ae341
1_en_2014-13-13_234fe321
2_en_2014-01-14_243a43fe
...
342342_uk_2014-01-14_2234af3
Я хочу отсканировать таблицу для всех элементов, начинающихся с objectidnumber. Я думаю, что проблема в том, что objectidnumbers являются последовательными и имеют другое количество цифр, но я не совсем уверен.
При использовании оболочки HBase, я использую команду:
scan 'object_articles', { STARTROW => '33_', ENDROW => '34' }
Это должно дать мне каждую строку, которая начинается с 33_ и заканчивается, как только она достигает 34, как показывают результаты:
hbase(main):012:0> scan 'object_articles', { STARTROW => '33_', ENDROW => '34' }
ROW COLUMN+CELL
33_en_2004_zdfasdf column=cf:articleId, timestamp=1398803544834, value=en_2004_zdfasdf
33_en_2004_zdfasdf column=cf:articleTitle, timestamp=1398803544834, value=Testing
33_en_2004_zdfasdf column=cf:index, timestamp=1398803544834, value=en_2004
1 row(s) in 0.0120 seconds
Однако, когда я настроил свой сканер Stargate с этим простым XML:
<Scanner startRow="33_" endRow="34" />
Это возвращает мне каждый ряд во всей таблице. Другое поведение состоит в том, что 4-значный startRow/endRow дает ответ 204 No Content, но любой 3-значный startRow/endRow возвращает всю таблицу.
Все результаты:
<Scanner startRow="999_" endRow="1000" />
204 Нет содержимого:
Я довольно озадачен тем, почему кажется, что Shell работает нормально, однако Stargate XML - нет.
1 ответ
Я предполагаю, что это отправляло в 2:00, но это было действительно просто. Я не совсем обдумывал лексикографический порядок.
Начиная с 99_9, моя оригинальная идея не сработала. Я закончил тем, что добавил PrefixFilter для startRow и избавился от endRow, таким образом, он только захватывает строки, начинающиеся с OOID:
В Java:
xml.append("<Scanner startRow=\"").append(startRow).append("\">");
// Prefix Filter
PrefixFilter test = new PrefixFilter(Bytes.toBytes(startRow));
xml.append("<filter>").append(ScannerModel.stringifyFilter(test)).append("</filter>");
xml.append("</Scanner>");
Как это выглядит с "99_" в качестве startRow:
<Scanner startRow="99_">
<filter>
{"type":"PrefixFilter","value":"OTlf"}
</filter>
</Scanner>