2009-09-16 17 views
8

Biorąc pod uwagę scenariusz następujący schemat HBase (from the official FAQ) ...zaawansowane kwerendy w HBase

Jak można zaprojektować tabelę HBase dla wielu-do-wielu stowarzyszenie między dwa podmioty, na przykład studentów i Kierunek?

chciałbym zdefiniować dwie tabele:

Student: Student Student dane id (nazwa, adres, ...) kursy (użyj identyfikatory kursów kwalifikacyjnych kolumn jak tutaj)

kursu: Kurs Kod przedmiotu dane (nazwisko, Syllabus, ...) studenci (wykorzystanie uczeń identyfikatory jako kwalifikatorów kolumn tutaj)

schemat ten daje szybki dostęp do zapytań, pokaż wszystkie zajęcia dla studentów z (s tudent table, courses family), lub wszyscy uczniowie klasy (tabela kursów, rodzina studentów).

Jak byś spełnić żądania: „Daj mi wszystkich uczniów, które mają przynajmniej dwa kursy w zakresie wspólnej”? Czy potrafisz zbudować "zapytanie" w HBase, które zwróci ten zestaw, czy też musisz pobrać wszystkie istotne dane i samemu je skasować w kodzie?

Odpowiedz

3

Opisane zapytanie lepiej pasuje do relacyjnej bazy danych. Możesz jednak szybko odpowiedzieć na zapytanie, wstępnie obliczając wynik. Na przykład możesz mieć tabelę, w której kluczem jest liczba wspólnych klas, a komórki to indywidualni uczniowie, którzy mają wspólne wiele klas.

Można użyć wariantu w tym celu, aby odpowiedzieć na pytania typu "którzy uczniowie są w klasie X i klasie Y": używaj klas jako fragmentów klucza (w kolejności alfabetycznej lub co najmniej spójnej), i ponownie, każda kolumna jest uczniem.

2

Tego typu zapytania nie są dostępne w interfejsie API 0.20.0. Nie jestem pewien, czy są na to jakieś plany (wątpię, by pojawiły się w najbliższym czasie). Szczegółowe informacje na temat mapy drogowej można znaleźć na stronie internetowej HBase pod adresem: ,.

Musisz obliczyć odpowiedź we własnym zgłoszeniu (chociaż bardzo chciałbym, aby okazało się nieprawidłowe).

1

Użyj filtru, aby to osiągnąć.

SingleValueFiler filer = new SingleValueFiler (i twoje argumenty oparte na api);

dodać do skanowania (skanowanie org.apache.hadoop.hbase.client.Scan = new Skanuj(); scan.setFiler (filtr);

+0

Czy możesz rozwinąć swój przykładowy pseudokod kodu, który zawiera uczniów/kursy z pytania, aby zademonstrować, w jaki sposób SingleValueFilter wykona zadanie? –

1

Wygląda MapReduce może być jednym ze sposobów rozwiązania tego problemu; niestety nie dałoby to natychmiastowego rezultatu, jeśli odbywa się on w locie Po prostu myśląc o tym, możesz w fazie mapy policzyć liczbę przypadków, w których para studentów kończy w tej samej klasie. możesz zsumować pary i wypisać (wyemitować) pary, które miały sumę 2 lub więcej.Takie podejście może być użyte do wstępnego wygenerowania indeksu (zgodnie z sugestią wcześniej), który wskazuje pary studentów z kursami "x" w pospolity.Kluczem do takiego indeksu może być coś podobnego do "X/Student1_Key/Student2_Key", gdzie X to liczba kursów, które mają wspólną i. Skanowanie zakresu nad indeksem (np. X> = 2) da ci odpowiedź. Biorąc pod uwagę natywną integrację HBase z MapReduce, rozwiązanie zgodne z tymi wytycznymi powinno być proste.

Ponadto, po modelu BigTable, nie trzeba nawet tworzyć dwóch tabel. Po prostu poprzedzaj każdy klucz rekordu "rodzajem", takim jak Kurs: lub Uczeń :. Ponieważ wiersze są uporządkowane leksykograficznie, można je łatwo skanować według rodzaju. Wypełnij (lub wygeneruj) kolumny potrzebne do obsługi właściwości dla każdego rodzaju. Ponieważ HBase obsługuje bardzo rzadkie tabele, działa to dobrze. Zobacz tę doskonałą prezentację na temat wybierania kluczy i tworzenia indeksów za pomocą BigTable: http://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html. Ta prezentacja naprawdę pomogła mi zrozumieć, jak przechowywać rzeczy w bazach danych, takich jak HBase, w celu efektywnego pobierania.

Wracając do pierwotnego pytania, wydaje się, że podczas pracy z HBase naprawdę musisz wiedzieć, w jaki sposób dane mają być wykorzystane, więc odpowiednie indeksy mogą zostać opracowane wcześniej, aby uzyskać szybkie odpowiedzi. Nie wydaje się, aby losowe zapytania ad-hoc zawsze działały z tym modelem.

W każdym razie, jestem nowy w tym, więc problemy z widzeniem takie jak te i możliwe rozwiązania pomagają!