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を使用する場合は、データがどのように使用されるかを実際に知っておく必要があるようです。これにより、適切なインデックスを事前に開発して、迅速な回答を得ることができます。ランダムなアドホッククエリがこのモデルで常に機能するようには見えません。
とにかく、私もこれに慣れていないので、これらのような問題と可能な解決策を見ることが役立ちます!