Angesichts des folgenden HBase-Schemaszenarios ( aus den offiziellen FAQ ) ...
Wie würden Sie eine Hbase-Tabelle entwerfen? für viele-zu-viele-Verbindungen zwischen zwei Entitäten, zum Beispiel Student und Kurs?
Ich würde zwei Tabellen definieren:
Student: Student ID Studentendaten (Name, Adresse, ...) Kurse (verwenden Kurs-IDs als Spaltenqualifizierer hier)
Kurs: Kurs ID Kursdaten (Name, Lehrplan, ...) Studenten (verwenden Sie Schüler IDs als Spaltenqualifizierer hier)
Dieses Schema gibt Ihnen schnellen Zugriff auf die Abfragen, zeigen alle Klassen für eine Student (Schülertisch, Kurse Familie) oder alle Schüler für eine Klasse (Kurstisch, Studentenfamilie).
Wie würden Sie die Anfrage erfüllen: " Geben Sie mir alle Schüler, die mindestens zwei gemeinsame Kurse 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?
Die beschriebene Abfrage eignet sich besser für eine relationale Datenbank. 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 wieder jeweils Spalte ist ein Student.
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). Auf der HBase-Website finden Sie einige Roadmap-Details, die diese Frage beantworten könnten.
Sie müssen die Antwort in Ihrer eigenen Anwendung berechnen (obwohl ich gerne falsch bewiesen würde).
Scheint wie MapReduce eine Möglichkeit sein, dies zu lösen; Leider würde es kein sofortiges Ergebnis geben, wenn es im laufenden Betrieb gemacht wird. Wenn Sie nur darüber nachdenken, können Sie in der Kartenphase zählen, wie oft ein Schülerpaar in der gleichen Klasse endet. Während der Reduktionsphase könnten Sie die Paare summieren und die Paare ausschreiben, 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 gemeinsamen "x" Kursen angibt. 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 & gt; = 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 hervorragende Präsentation zum Auswählen von Schlüsseln und Entwickeln von Indizes mit BigTable an: Ссылка . 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 scheint es, dass Sie, wenn Sie mit HBase arbeiten, wirklich wissen müssen, wie Ihre Daten verwendet werden, damit entsprechende 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 arbeiten.
Wie auch immer, ich bin auch neu dabei, so dass Probleme wie diese und mögliche Lösungen helfen!