3

私は20110103---のような行キーパターンを持っているので、行キーは20110103-1-23-333のようになります。

たとえば、スキャンを使用して範囲クエリを実行すると、startRow-> 20110103-1-23- endRow-> 20110105-1-23-

上記の範囲内にない行も取得しています。たとえば、行20110105-1-15-6666も取得します。ストア15に関連する行も取得しています。

どうすればこれを修正できますか?RegularExpressionFilterはこれを解決しますか...

この問題についてアドバイスしてください...。

4

4 に答える 4

8

あなたがリストした3つの行キーのうち:

20110103-1-23-
20110105-1-15-666
20110105-1-23-

それは私にとって自然なソート順のように見えます。「666」で終わるものは、「20110103」で始まるものの後に来ます。

(混乱の 1 つのポイントは、HBase にとって、これらはすべて単なるバイトであり、辞書式ソートは一度に 1 バイトずつ実行されるため、「aaa」は「aa」の後、「ab」の前にソートされることです。)

于 2012-04-23T12:24:37.033 に答える
2

以下のコマンドを発行して hbase シェルを開くことができます

scan 'YourHbaseTableName',{FILTER=>"(RowFilter(=,'regexstring:20110103'))"}
于 2013-09-03T16:19:54.630 に答える
1

行 20110105-1-15-6666 は正しく範囲 [20110103-1-23-, 20110105-1-23-) にあります。これは、15 が 23 よりも小さく、行の並べ替えが辞書式であるためです。

「ストア 15 に関連する行も取得しています」とおっしゃっていましたが、行キーの 3 番目の数字 ( ________-_-23-) は、行の何らかの属性であると想像できます。

このテーブルのスキーマを変更して、この「店舗番号」を列にすることをお勧めします。これにより、キーが次のよう20110103-1になり、「店舗」列にそれらの番号15などが表示されます23

このようにして、スキャンで列 store=15 を持つ行をフィルターで除外できます。

Java API を使用している場合、これは次のようになります。

SingleColumnValueFilter filter = new SingleColumnValueFilter(
   Bytes.toBytes("columnfamily"),
   Bytes.toBytes("storenumber"),
   CompareFilter.CompareOp.NOT_EQUAL,
   Bytes.toBytes(15)
);
filter.setFilterIfMissing(true);
Scan scan = new Scan(
   Bytes.toBytes("20110103-1"),
   Bytes.toBytes("20110105-1")
);
scan.setFilter(filter);

行キーに格納しているデータが多すぎる可能性があります。これらの属性の一部を行キーに取り、それらを列にしてみてください。20110105また、行キーの代わりに日付 (日付だと思います) を (テーブルのセルの) タイムスタンプとして使用できることにも注意してください。アプリケーションによって異なります。

于 2012-04-23T12:36:56.350 に答える
0

HBase は、複数のネストされた順序付けられたバイトのマップであると想定します。したがって、各クエリで正しい順序を取得するには、タイムスタンプをバイナリ形式で保存する必要があります。

たとえば、Java メソッドを使用して、rowkey-value を文字列データ型に保存すると思います。

yourDateString.getBytes(encoding) 

また

Bytes.toBytes(yourDateString)

HBase API によって追加されました。

私のアドバイスは、時間の値をタイムスタンプ (ロング) として保存することです。この long はバイトにシリアル化され、その後行キーに保存されます。行キーにタイムスタンプを保存することは、絶えず上昇する性質のために少し問題があることに注意してください。タイムスタンプはミリ秒ごとに大きくなるため、新しい値はすべて、このリージョンを管理する HBase リージョンに保存されます。簡単に言えば、クラスター マシンの 1 つに書き込むだけで、HBase クラスターを使用する目的ではありません。サイズが 100 マシンまでのクラスターの場合、ソルティングを使用できます (行キーの前に乱数を配置して、すべての値をクラスター全体に分散させます)。フェニックスプロジェクトをチェックしてください。シリアライズ、ソルティングなどをすべて透過的に実行し、単純な SQL のようなステートメントを提供します。

于 2013-09-28T04:57:03.120 に答える