2009-09-16 17 views
8

Angesichts der folgenden HBase Schema Szenario (from the official FAQ) ...Erweiterte Abfragen in HBase

Wie würden Sie einen Hbase Tisch entwerfen für many-to-many Assoziation zwischen zwei Einheiten, zum Beispiel Studenten und Kurs?

würde ich zwei Tabellen definieren:

Student: Schüler-ID Schülerdaten (Name, Adresse, ...) Kurse (verwenden Kurs ids als Spaltenqualifikations hier)

Kurs: Kurs-ID Kurs Daten (Name, Lehrplan, ...) Studenten (Student Verwendung ids als Spalten Qualifier hier)

Dieses Schema Sie schnellen Zugriff auf die Anfragen gibt, zeigen alle Klassen für einen Schüler (s Tudent Tisch, Kurse Familie), oder alle Schüler für eine Klasse (Kurse Tisch, Studenten Familie).

Wie würden Sie die Anforderung erfüllen: „alle Gib mir die Studenten, die mindestens zwei Kurse gemeinsam teilen“? Können Sie in HBase eine "Abfrage" erstellen, die diese Menge zurückgibt, oder müssen Sie alle relevanten Daten abrufen und selbst in Code zerlegen?

Antwort

3

Die Abfrage wie beschrieben ist besser für eine relationale Datenbank geeignet. Sie können die Abfrage jedoch schnell beantworten, indem Sie das Ergebnis vorberechnen. Zum Beispiel könnten Sie eine Tabelle haben, in der der Schlüssel die Anzahl der gemeinsamen Klassen ist und die Zellen einzelne Schüler sind, die Schlüssel-viele Klassen gemeinsam haben.

Sie könnten eine Variante dazu verwenden, um Fragen wie "welche Schüler sind in Klasse X und Klasse Y" zu beantworten: verwenden Sie die Klassen als Teile des Schlüssels (in alphabetischer Reihenfolge, oder zumindest konsistent), und noch einmal, Jede Spalte ist ein Student.

2

Diese Art der Abfrage ist über die 0,20.0-API nicht verfügbar. Ich bin mir nicht sicher, ob es irgendwelche Pläne dafür gibt (ich bezweifle, dass es bald erscheinen würde). Sie finden einige Roadmap-Details auf der HBase-Website, die möglicherweise beantworten diese Frage.

Sie müssen die Antwort in Ihrer eigenen Anwendung berechnen (obwohl ich gerne falsch bewiesen werden würde).

1

Verwenden Sie einen Filer, um dies zu erreichen.

SingleValueFiler filer = neuer SingleValueFiler (und Ihre Argumente basierend auf der API);

fügen Sie diese zu scannen (org.apache.hadoop.hbase.client.Scan scan = new Scan(); scan.setFiler (Filter);

+0

Könnten Sie bitte Ihren Beispiel-Pseudocode mit den Schülern/Kursen aus der Frage erweitern, um zu demonstrieren, wie ein SingleValueFilter die Aufgabe erfüllen würde? –

1

Scheint wie MapReduce ein Weg, dies zu lösen sein könnte; Leider würde es kein sofortiges Ergebnis geben, wenn es im laufenden Betrieb gemacht wird Wenn man nur darüber nachdenkt, könnte man in der Kartenphase zählen, wie oft ein Schülerpaar in der gleichen Klasse endet Sie könnten die Paare summieren und die Paare ausschreiben (emittieren), die eine Summe von 2 oder mehr hatten.Dieser Ansatz könnte verwendet werden, um einen Index (wie zuvor vorgeschlagen) vorzugenerieren, der die Paare von Schülern mit "x" Kursen angibt verbreitet.Der Schlüssel zu einem solchen Index könnte etwas in der Art von "X/Student1_Key/Student2_Key" sein, wobei X die Anzahl der Kurse ist, die sie gemeinsam haben und. Ein Bereichsscan über den Index (z. B. X> = 2) würde Ihnen Ihre Antwort geben. Angesichts der nativen Integration von HBase mit MapReduce sollte eine Lösung in diesen Bereichen unkompliziert sein.

Außerdem müssen Sie nach dem BigTable-Modell nicht einmal zwei Tabellen erstellen. Folgen Sie jeder Satzschlüssel mit einer "Art" wie Kurs: oder Student :. Da die Zeilen lexikografisch geordnet sind, können sie leicht nach Art gescannt werden. Füllen Sie die Spalten auf (oder generieren Sie sie), die benötigt werden, um die Eigenschaften für jede Art zu unterstützen. Da HBase sehr sparsame Tabellen unterstützt, funktioniert das gut. Sehen Sie sich diese ausgezeichnete Präsentation über die Auswahl von Schlüsseln und das Entwickeln von Indizes mit BigTable an: http://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html. Diese Präsentation hat mir wirklich geholfen zu verstehen, wie man Dinge in Datenbanken wie HBase speichert, um effizient zu recherchieren.

Aber zurück zur ursprünglichen Frage, es scheint, dass, wenn Sie mit HBase arbeiten, Sie wirklich wissen müssen, wie Ihre Daten verwendet werden, damit passende Indizes im Voraus entwickelt werden können, um schnelle Antworten zu erhalten. Es scheint nicht, dass zufällige Ad-hoc-Abfragen immer mit diesem Modell funktionieren.

Wie auch immer, ich bin auch neu, so dass Probleme wie diese und mögliche Lösungen helfen!