3

質問をよりよく説明するために、例から始めます。たとえば、3 つのテーブルがあるとします。

  • 学生 (200 万行)
  • TestResults (1 億行)
  • テスト (100 000 行)。

関連するすべてのデータをグループ化し、TestID_StudentID_TestResultsID というキーを持つ「TestSynthesis」という名前の非正規化テーブルを追加します。ユーザーは、このキーの 3 つの部分のいずれかまたはすべてで検索できる必要があるため、キー内のフィールドの順序は重要ではありません。

クエリの例は次のとおりです。

簡単な解決策は次のとおりです。

  1. 正規化されたテーブルの学生を検索します
  2. StudentID を抽出します (3 つの ID があるとします: 0001000,0000999,0000001)
  3. 次に、これらの ID で TestSynthesis を検索します (* 0001000 * 、* 0000999 * 、* 0000001 * など) 。

しかし、ステップ 2 で 3 人の学生ではなく 100 万行を取得した場合はどうなるでしょうか。

HBase はキーのみを検索できますか (たとえば、データを読み取らずに)、または完全なテーブル スキャンを実行する必要がありますか?

4

1 に答える 1

14

最初に痛い事実..他の投稿で述べられているように、HBaseは部分的なキーを完全にはサポートしていません。あなたが言ったように、あなたがあなたの鍵を次のように持っているとしましょう:TestID_StudentID_TestResultsID

StudentIDで検索することはできず、同時に素晴らしいパフォーマンスを楽しむことができます。ただし、行キーにのみ依存して、スキャン中に行をフィルター処理する方法があります。ただし、フィルターのパフォーマンスは、最適化された適切なテーブルスキーマよりも劣ることを忘れないでください。したがって、理解/経験から、次のオプションがあります。

1)多数のクエリに対して最適化されるようにスキームを設計しようとします。たとえば、クエリの大部分は特定の学生のデータを必要とするため、studentIDをキーの先頭に配置します。一部のクエリでは、テストのために現在の学生の結果を知る必要があります。次に、{STARTROW => give_studentID、STOPROW => give_studentID + 1}を使用してスキャンを実行し、キーフィルターを使用して取得した結果をフィルター処理します。keyfiltersは、特定のtestIDをフィルタリングするように設定できます。ただし、この場合、どの学生がテストに参加したかを確認したい場合は、フルスキャンを実行し、結果セットにフィルターを適用する必要があります。これは、パフォーマンスについて話すときはそれほど「安価」ではありません。

2)[http://stackoverflow.com/questions/12806762/hbase-data-only-in-key-compoung-key-wildcards] [1]で提案されているように、2つの異なるテーブルにデータを複製することもできます。最初はTestID_StudentID_TestResultsIDとして、2番目はStudentID_TestID_TestResultsIDのようになります。このように、最初のテーブルまたは2番目のテーブルのいずれかで楽しく検索できるため、特定のtestIDまたはStudentIdでクエリを実行できます。すべてのテストでどの生徒が最良の結果を保持しているかを知りたい場合も、問題が発生します。この場合、もう一度フルスキャンが必要です。スキーマを適切に計画できるように、どのような種類のクエリを実行するかを知ることが重要です。(とにかく、キーのテスト結果が本当に必要ですか?)

3)3番目のオプションもあります。私は一度使用しました。それはデータ自体にかなり依存します。500 000人の学生、約50のテスト、そして50 *500000のテスト結果があるとします。この場合、スキーマは次のように設計します。TestID_StudenIT_Results

*特定のテストで生徒がどのように行ったかを確認したい場合は、キーがテストで始まるため、テストに従ってスキャンできます。

* Studentがすべてのテストでどのように行ったかを確認したい場合は、50回のスキャンを実行できます。各スキャンでは最初に50個のtestIDのいずれかを使用して、スキャンは次のようになります。

test1_studentX

test2_studentX

test3_studentX

test4_studentX

..。

..。

test50_studentX

50スキャンは多すぎるように聞こえるかもしれませんが、マップリデュースジョブには最適です。ここに質問があります、あなたは本当に50のtestIDを持っていますか、それともあなたが持っている数はこれに適していますか?

*すべての学生がすべてのテストでどのように行ったかを確認したい場合でも、このスキーマを使用してフルスキャンを実行する必要があります。

それは私からです!

乾杯、ニコ

于 2012-10-20T13:17:05.810 に答える