Frage

das folgende HBase Schema Szenario Given ( von dem offiziellen FAQ ) ...

  

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

     

Ich würde definieren zwei Tabellen:

     

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

     

Kurs: Kurs-ID Kursdaten (Name,   Lehrplan, ...) Studenten (Verwendung Student   ids als Spaltenqualifikations hier)

     

Dieses Schema gibt Ihnen einen schnellen Zugriff auf   die Abfragen, zeigen alle Klassen für eine   Schüler (Schülertisch, Kurse   Familie), oder alle Schüler für eine Klasse   (Kurse Tisch, Studenten Familie).

Wie würden Sie die Anforderung erfüllen: „ Gib mir alle Studenten, die mindestens zwei Kurse gemeinsam teilen “? Können Sie sich eine „Abfrage“ in HBase bauen, dass dieser Satz zurück, oder haben Sie alle relevanten Daten abrufen und es selbst in Code Crunch?

War es hilfreich?

Lösung

Die Abfrage wie beschrieben, ist besser geeignet, um eine relationale Datenbank. Sie können die Abfrage schnell beantworten, jedoch durch das Ergebnis precomputing. Zum Beispiel könnten Sie eine Tabelle, wo der Schlüssel ist die Anzahl der Klassen gemeinsam ist, und die Zellen sind einzelne Schüler, die Schlüssel viele Klassen gemeinsam haben.

Sie können eine Variante dieses verwenden, um Fragen wie „die Schüler sind in der Klasse X und Klasse Y“ zu beantworten: die Klassen als Teile des Schlüssels verwenden (in alphabetischer Reihenfolge, oder etwas zumindest konsistent), und wieder, jeden Spalte ist ein Student.

Andere Tipps

Diese Art der Abfrage ist durch die 0.20.0 API nicht verfügbar. Ich bin nicht sicher, ob es irgendwelche Pläne für sie (ich bezweifle es würde in absehbarer Zeit erscheinen). Sie werden einige Fahrplan Details auf der HBase Website, die könnte diese Frage beantworten.

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

Verwenden Sie einen Filer dies zu erreichen.

SingleValueFiler Filer = new SingleValueFiler (und Ihre Argumente auf der Grundlage der api);

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

Scheint, wie MapReduce könnte ein Weg sein, diese zu lösen; leider würde es nicht ein sofortiges Ergebnis geben, wenn es im laufenden Betrieb durchgeführt wird. Ich denke nur durch sie kann man in der Karte Phase zählen die Anzahl der mal ein Paar von Studenten in der gleichen Klasse enden. Während der Phase reduzieren könnten Sie die Paare zusammenfassen und schreiben (emit) die Paare, die eine Summe von 2 oder mehr hatten. Dieser Ansatz könnte verwendet werden, um einen Index zu vorge erzeugen (wie bereits weiter oben erwähnt), die die Paare von Studenten mit „x“ Kurse gemeinsam anzeigt. Der Schlüssel zu einem solchen Index könnte etwas entlang der Linien von „X / Student1_Key / Student2_Key“ sein, wobei X die Anzahl der Kurse ist, dass sie gemeinsam haben, und. Eine Reihe Scan über den Index (zum Beispiel X> = 2) würden Sie Ihre Antwort. In Anbetracht HBase native Integration mit MapReduce eine Lösung in diese Richtung sollte einfach sein.

Auch das BigTable Modell folgen, würden Sie nicht einmal brauchen zwei Tabellen zu erstellen. voraus nur jeden Datensatz Schlüssel mit einer „Art“ wie Kurs: oder Studenten :. Da die Reihen geordnet lexikografisch werden sie leicht durch Art gescannt. Bevölkern (oder erzeugen), die Spalten benötigten Eigenschaften für jede Art zu unterstützen. Da HBase sehr spärlich Tabellen unterstützt das funktioniert gut. Sehen Sie diese hervorragende Präsentation auf Tasten und Entwicklung Indizes mit BigTable Auswahl: http: // www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html . Diese Präsentation hat mir wirklich geholfen zu verstehen, wie die Dinge in Datenbanken zu speichern, wie HBase für effizienten Abruf.

Aber zurück auf die ursprüngliche Frage, wie es scheint, dass, wenn sie mit HBase arbeiten Sie wirklich wissen, wie Ihre Daten verwendet werden sollen, so entsprechender Indizes vorher schnelle Antworten bekommen entwickelt werden kann. Es scheint nicht, dass zufällige Ad-hoc-Abfragen werden immer mit diesem Modell erarbeiten.

Wie auch immer, ich bin auch neu in diese so zu sehen, wie diese Probleme und mögliche Lösungen hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top