8

次のHBaseスキーマシナリオ(公式FAQから)を考えると...

StudentとCourseなどの2つのエンティティ間の多対多の関連付けのためにHbaseテーブルをどのように設計しますか?

2つのテーブルを定義します。

学生:学生ID学生データ(名前、住所、...)コース(ここでは列修飾子としてコースIDを使用します)

コース:コースIDコースデータ(名前、シラバス、...)学生(ここでは学生IDを列修飾子として使用します)

このスキーマを使用すると、クエリにすばやくアクセスして、学生のすべてのクラス(学生テーブル、コースファミリー)、またはクラスのすべての学生(コーステーブル、学生ファミリー)を表示できます。

「少なくとも2つの共通のコースを共有するすべての学生を教えてください」という要求をどのように満たしますか?そのセットを返す「クエリ」をHBaseで構築できますか、それともすべての関連データを取得してコードで自分で処理する必要がありますか?

4

4 に答える 4

3

説明されているクエリは、リレーショナルデータベースに適しています。ただし、結果を事前に計算することで、クエリにすばやく答えることができます。たとえば、キーが共通のクラスの数であり、セルがキーを持つ個々の学生であるテーブルがあるとします-多くのクラスが共通しています。

これのバリエーションを使用して、「どの生徒がクラスXとクラスYにいるのか」などの質問に答えることができます。クラスをキーの一部として使用し(アルファベット順、または少なくとも一貫性のあるもの)、各列は学生。

于 2009-10-01T20:08:08.833 に答える
2

このタイプのクエリは、0.20.0APIでは使用できません。計画があるかどうかはわかりません(すぐに表示されるとは思えません)。その質問に答える可能性のあるロードマップの詳細は、HBaseWebサイトにあります。

あなたはあなた自身のアプリケーションで答えを計算する必要があるでしょう(私は間違っていると証明されたいのですが)。

于 2009-09-22T01:01:52.763 に答える
1

これを実現するには、ファイラーを使用します。

SingleValueFiler filer = new SingleValueFiler(およびAPIに基づく引数);

これをスキャンに追加します(org.apache.hadoop.hbase.client.Scan scan = new Scan(); scan.setFiler(filter);

于 2010-05-05T14:20:32.070 に答える
1

MapReduceはこれを解決する1つの方法のようです。残念ながら、その場で実行した場合、すぐに結果が得られることはありません。考えてみると、マップフェーズで、2人の生徒が同じクラスに入る回数を数えることができます。削減フェーズでは、ペアを合計し、合計が2以上のペアを書き出す(放出する)ことができます。このアプローチは、共通の「x」コースを持つ学生のペアを示すインデックスを事前に生成するために使用できます(前述のとおり)。このようなインデックスの鍵は、「X / Student1_Key / Student2_Key」に沿ったものである可能性があります。ここで、Xは共通のコースの数です。インデックスの範囲スキャン(たとえば、X> = 2)により、答えが得られます。HBaseとMapReduceのネイティブ統合を考えると、これらの方針に沿ったソリューションは簡単なはずです。

また、BigTableモデルに従うと、2つのテーブルを作成する必要もありません。各レコードキーの前に、Course:やStudent:などの「種類」を付けます。行は辞書式順序で並べられているため、種類ごとに簡単にスキャンできます。各種類のプロパティをサポートするために必要な列にデータを入力(または生成)します。HBaseは非常にスパースなテーブルをサポートしているため、これはうまく機能します。BigTableを使用したキーの選択とインデックスの開発に関するこの優れたプレゼンテーションを参照してください:http ://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html 。このプレゼンテーションは、効率的な検索のためにHBaseなどのデータベースに物事を保存する方法を理解するのに本当に役立ちました。

しかし、元の質問に戻ると、HBaseを使用する場合は、データがどのように使用されるかを実際に知っておく必要があるようです。これにより、適切なインデックスを事前に開発して、迅速な回答を得ることができます。ランダムなアドホッククエリがこのモデルで常に機能するようには見えません。

とにかく、私もこれに慣れていないので、これらのような問題と可能な解決策を見ることが役立ちます!

于 2010-10-22T00:28:41.207 に答える