Сканер HBase Stargate - 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. Я думаю, проблема в том, что номера объектов являются серийными и имеют разное количество цифр, но я не совсем уверен.

При использовании оболочки 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

Однако, когда я настроил свой сканер Звездных врат с помощью этого простого XML:

<Scanner startRow="33_" endRow="34" />

Он возвращает мне каждую строку во всей таблице. Другое поведение заключается в том, что 4-значный startRow/endRow дает ответ 204 No Content, но любой 3-значный startRow/endRow возвращает всю таблицу.

Все результаты:

<Scanner startRow="999_" endRow="1000" />

204 Нет содержания:

Я очень озадачен тем, почему кажется, что Shell работает нормально, а XML Stargate — нет.


person ev0lution37    schedule 01.05.2014    source источник


Ответы (1)


Я предполагаю, что это публиковалось в 2 часа ночи, но это было действительно просто. Я не совсем укладывался в голове относительно лексикографического порядка.

С 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>
person ev0lution37    schedule 01.05.2014