最初に痛い事実..他の投稿で述べられているように、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を持っていますか、それともあなたが持っている数はこれに適していますか?
*すべての学生がすべてのテストでどのように行ったかを確認したい場合でも、このスキーマを使用してフルスキャンを実行する必要があります。
それは私からです!
乾杯、ニコ