3

私のキーには、num、type、nameの3つのコンポーネントがあります

'type'はAとBの2種類のみですが、numは0,1,2 ..、30などのより多くの値を持つことができます

numとtypeに関してデータをフェッチする必要があります。つまり、指定されたnumとtypeのキーを持つすべての行をフェッチする必要があります。

データは1.num|type|name または2の形式で保存できます。type|num|name

部分的なキースキャンを使用する場合、HBaseがデータをスキャンする方法を検討します。これは、データを保存するための最良の戦略ですか?

これが私の部分的なキースキャンを設定する方法です:1の場合。

scan.setStartRow(Bytes.toBytes(num);
scan.setStopRow(Bytes.toBytes(num+1);

2の場合。

scan.setStartRow(Bytes.toBytes(type + "|" + num);
scan.setStopRow(Bytes.toBytes(type + "|" + (num+1));
4

2 に答える 2

4

まず、パイプを区切り文字として使用しないことをお勧めします。これはASCII 124であり、すべての文字と数字の後に分類され、並べ替えは期待どおりではありません(すべてをパッドのままにしない限り、キーが大きくなりすぎます)。HBase行キー区切り文字の場合、正しい並べ替えを維持するために、すべての有効なキー文字の前に辞書式順序であるものを使用する必要があります。タブはASCII9でうまく機能します。

その型には2つの有効な値しかないことを考慮し、ランダムな分布を想定すると、num type。これにより、将来必要になった場合に、numだけを選択できます。逆の順序でnumだけを選択すると、type num2つのフェッチが行われます。1つはタイプ「A」用で、もう1つはタイプ「B」用です。最も効率的ではありません。

数字だけを選択することはめったにない場合type numは、柔軟性がない場合は、行レベルで最も選択的であるため、選択するのが理にかなっています。

実際には、両方を試して、データで何が最も効果的かを確認する必要があります。

于 2011-08-12T17:55:56.950 に答える
1

あなたが取ることができるいくつかのアプローチがあります。

1)より頻繁にスキャンするレイアウトを選択する必要があります。次に、頻度の低いスキャンタイプの場合は、フルスキャンを実行し(または、可能であれば範囲を区切る)、フィルターを使用して、必要なアイテム以外のものをフィルターで除外する行フィルターを作成できます。フィルタについて:http://hbase.apache.org/apidocs/index.html

2)データを2回(各行名で1回)保存することにより、データを複製できます。これにより書き込みが遅くなりますが、両方をスキャンする場合は読み取りに大いに役立ちます。もちろん、ディスク使用量も2倍になります。

3)関連する行を指すように、代替行名を使用してインデックスを作成できます。

どのアプローチを採用するかは、データのアクセスパターンと読み取り/書き込み比率に大きく依存します。

于 2011-08-16T05:11:16.440 に答える