1

我在尝试使用 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 shell 时,我使用的命令是:

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 设置我的 Stargate 扫描仪时:

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

它让我回到整个表格中的每一行。另一种行为是 4 位 startRow/endRow 会产生 204 No Content 响应,但任何 3 位 startRow/endRow 都会返回整个表格。

所有结果:

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

204 无内容:

我很困惑为什么 Shell 似乎工作正常,但 Stargate XML 却不是。

4

1 回答 1

0

我想它是在凌晨 2 点发布的,但这真的很简单。我并没有完全围绕词典排序。

由于 99_ < 9_,我最初的想法是行不通的。我最终为 startRow 添加了一个 PrefixFilter 并摆脱了 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>
于 2014-05-01T15:01:54.017 回答