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 シェルを使用する場合、私が使用しているコマンドは次のとおりです。

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 に答える