2009-09-16 16 views
8

Dato lo scenario seguente schema HBase (from the official FAQ) ...query avanzate in HBase

Come si progetta una tabella HBase per molti-a-molti tra due entità, per esempio studenti e Corso?

definirei due tabelle:

Studente: i dati degli studenti studente id (nome, indirizzo, ...) Corsi (utilizzare ids corso come qualificazioni colonna qui)

corso: Corso ID corso i dati (nome, piano di studi, ...) gli studenti (uso degli studenti ids come qualificazioni colonna qui)

Questo schema consente di accedere rapidamente alle le query, mostrare tutte le classi per uno studente (s tavolo tudent, corsi famiglia), o tutti gli studenti per una classe (tabella corsi, famiglia di studenti).

Come ti soddisfare la richiesta: "Dammi tutti gli studenti che condividono almeno due corsi in comune"? Puoi creare una "query" in HBase che restituirà quel set, o devi recuperare tutti i dati pertinenti e crunch te stesso nel codice?

risposta

3

La query come descritta è più adatta a un database relazionale. È possibile rispondere rapidamente alla query, tuttavia, precompilando il risultato. Ad esempio, potresti avere una tabella in cui la chiave è il numero di classi in comune e le celle sono studenti individuali che hanno in comune molte classi chiave.

È possibile utilizzare una variante su questo per rispondere a domande come "quali studenti sono in classe X e in classe Y": utilizzare le classi come parti della chiave (in ordine alfabetico o comunque almeno coerente), e ancora, ogni colonna è uno studente.

2

Questo tipo di query non è disponibile tramite l'API 0.20.0. Non sono sicuro se ci sono dei piani per farlo (dubito che possa apparire in qualunque momento presto). Troverai alcuni dettagli della roadmap sul sito web HBase che potrebbe rispondere a questa domanda con.

Avrai bisogno di calcolare la risposta nella tua applicazione (anche se mi piacerebbe essere smentito).

1

Utilizzare un filer per ottenere questo.

SingleValueFiler filer = new SingleValueFiler (e gli argomenti basati sull'api);

aggiungi questo a scansione (scansione org.apache.hadoop.hbase.client.Scan = new Scansione(); scan.setFiler (filtro);

+0

Potresti ampliare il tuo esempio di pseudo-codice incorporando gli studenti/corsi della domanda per dimostrare come un SingleValueFilter possa svolgere l'attività? –

1

Sembra MapReduce potrebbe essere un modo per risolvere questo; sfortunatamente non darebbe un risultato istantaneo se fosse fatto al volo Pensandoci sopra, nella fase della mappa puoi contare il numero di volte in cui una coppia di studenti finisce nella stessa classe. potresti sommare le coppie e scrivere (emettere) le coppie che avevano una somma di 2 o più.Questo approccio potrebbe essere usato per pre-generare un indice (come suggerito in precedenza) che indica le coppie di studenti con corsi di "x" in Comune.La chiave per un tale indice potrebbe essere qualcosa sulla falsariga di "X/Student1_Key/Student2_Key", dove X è il numero di corsi che hanno in comune e. Una scansione dell'intervallo sull'indice (ad es., X> = 2) ti darebbe la risposta. Data l'integrazione nativa di HBase con MapReduce, una soluzione lungo queste linee dovrebbe essere semplice.

Inoltre, seguendo il modello BigTable, non è nemmeno necessario creare due tabelle. Basta precedere ogni chiave di registrazione con un "tipo" come Corso: o Studente :. Poiché le righe sono ordinate lessicograficamente, sono facilmente scansionate per tipo. Compila (o genera) le colonne necessarie per supportare le proprietà per ogni tipo. Dato che HBase supporta tabelle molto sparse, questo funziona bene. Guarda questa eccellente presentazione sulla selezione delle chiavi e sullo sviluppo degli indici con BigTable: http://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html. Questa presentazione mi ha davvero aiutato a capire come archiviare cose in database come HBase per un recupero efficiente.

Ma torniamo alla domanda iniziale, sembra che quando si lavora con HBase realmente dovete sapere come i dati deve essere utilizzato in modo indici appropriati possono essere sviluppati in anticipo per ottenere risposte rapide. Non sembra che le query ad-hoc casuali funzioneranno sempre con questo modello.

In ogni caso, sono anche nuovo a questo, quindi vedere i problemi come questi e le possibili soluzioni aiuta!