Domanda

Dato il seguente scenario dello schema HBase ( dalle FAQ ufficiali ) ...

  

Come progetteresti una tabella Hbase   per associazione molti-a-molti tra   due entità, ad esempio Studente e   Corso?

     

Definirei due tabelle:

     

Studente: dati studente ID studente   (nome, indirizzo, ...) corsi (utilizzare   ID corso come qualificatori di colonna qui)

     

Corso: dati del corso ID corso (nome,   programma, ...) studenti (usa studente   ID come qualificatori di colonna qui)

     

Questo schema ti consente di accedere rapidamente a   le query, mostra tutte le classi per a   studente (tabella degli studenti, corsi   famiglia) o tutti gli studenti di una classe   (tabella dei corsi, famiglia di studenti).

Come 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 scriverli tu stesso nel codice?

È stato utile?

Soluzione

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

Potresti utilizzare una variante su questo per rispondere a domande come "gli studenti che sono in classe X e classe Y": usa le classi come parti della chiave (in ordine alfabetico o qualcosa di almeno coerente), e ancora, ogni colonna è uno studente.

Altri suggerimenti

Questo tipo di query non è disponibile tramite l'API 0.20.0. Non sono sicuro che ci siano piani per farlo (dubito che sarebbe apparso presto). Troverai alcuni dettagli della roadmap sul sito web HBase che potrebbe rispondere a questa domanda.

Dovrai calcolare la risposta nella tua domanda (anche se mi piacerebbe essere smentito).

Usa un filer per raggiungere questo obiettivo.

SingleValueFiler filer = new SingleValueFiler (e i tuoi argomenti basati sull'API);

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

Sembra che MapReduce potrebbe essere un modo per risolverlo; sfortunatamente non darebbe un risultato immediato se fatto al volo. Solo riflettendoci potresti, nella fase della mappa, contare il numero di volte in cui una coppia di studenti finisce nella stessa classe. Durante la fase di riduzione 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 " x " corsi 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 tua risposta. Data l'integrazione nativa di HBase con MapReduce, una soluzione in tal senso dovrebbe essere semplice.

Inoltre, seguendo il modello BigTable, non avresti nemmeno bisogno di creare due tabelle. Basta precedere ogni chiave di registrazione con un "tipo" come Corso: o Studente :. Poiché le file sono ordinate lessicograficamente, possono essere facilmente scansionate per tipo. Popolare (o genera) le colonne necessarie per supportare le proprietà per ogni tipo. Poiché 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 le cose in database come HBase per un recupero efficiente.

Ma tornando alla domanda originale, sembra che quando lavori con HBase devi davvero sapere come devono essere utilizzati i tuoi dati, in modo da poter sviluppare in anticipo indici appropriati per ottenere risposte rapide. Non sembra che le query casuali ad hoc funzioneranno sempre con questo modello.

Ad ogni modo, sono anche nuovo a questo, quindi vedere problemi come questi e possibili soluzioni aiuta!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top