2011-08-12 5 views
3

マイキーは三つの成分があります NUM、タイプ、名前をPartial Keyスキャンで効率的なフェッチを行うためにHBaseにデータを保存する方法は?

「タイプ」が2つだけ種類のA及びB numは、例えば複数の値を有することができる あります0,1,2 ..、30

IはNUMに対するデータをフェッチし、すなわち、指定されたnumとタイプのキーを持つすべての行をフェッチ入力しなければなりません。

私は、フォームのいずれかでデータを格納することができます: 1. num|type|name または

私は、データを格納するための最良の戦略である部分キースキャンを、使用している場合HBaseのデータをスキャンする方法を考えると?

これは私が私の部分キースキャン設定する方法である:私は区切り文字としてパイプを使用しないことをお勧めします。1. 2.

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

答えて

4

まずに関して

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

について を - それはASCIIですすべての文字と数字の後ろには124となり、ソートは期待通りではありません(あなたがパッドをすべて残していない限り、それはキーが大きすぎます)。 HBaseの行区切り文字の場合、正しいソートを維持するために、すべての有効なキー文字の前に辞書編集的に何かを使用したいと考えています。 TabはASCII 9でうまくいきます。

このタイプには2つの有効な値しかなく、ランダムな分布を仮定すると、num typeとなります。これにより、将来的に必要な場合にのみnumで選択することができます。逆順でnumを選択すると、type numは、タイプAの場合は1回、タイプBの場合は2回フェッチされます。最も効率的ではありません。

あなたははほとんどがちょうど数を上の選択ません場合、それは柔軟性がない場合には、行レベルで最も選択的であるようtype numで行くことに意味を持ちません。

本当にあなたはそれらの両方を試してみると、あなたのデータで最適に動作するものが表示されるはずです。

+0

詳細な返信をありがとうございます。いくつかの質問: デリミタはすべての行で同じになるので、ソート順にどのように影響するか正確に理解しているかわかりません。私が想定しているデータサイズに影響を与えることができますか? –

+0

w.r.tをスキャンすると例えば特定の数値「2」。データがnum | typeとして永続化されている場合。可能性はすべての2が単一のファイルにあることです。この場合、並列性が低下しますか? –

+0

逆に、タイプ| numとして永続化された場合、すべてのA | 2は1つのファイルにあり、すべてのB | 2は別のファイルにあります。これは2のためのスキャン中に並列性を高めますか? –

1

あなたが取ることができるアプローチがいくつかあります。あなたはより頻繁にスキャンされる方のレイアウト

1)あなたが選択する必要があります。それから、頻度の低いスキャンタイプでは、フルスキャン(または範囲指定が可能な場合は範囲​​指定)とフィルタを使用して、必要な項目以外のものをフィルタリングする行フィルタを作成できます。 フィルタについて:http://hbase.apache.org/apidocs/index.html

2)データを2回保存することでデータを複製できます(各rownameで1回)。これは書き込みを遅くすることになりますが、両方でスキャンすると読み込みに多くの手助けをします。もちろん、ディスクの使用量も2倍になります。

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

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

関連する問題