come progettare lo schema HBase?
Domanda
supporre che ho questo tavolo RDBM ( Entità-attributo-value_model ):
col1: entityID
col2: attributeName
col3: value
e voglio usare HBase a causa di problemi di scala.
So che l'unico modo per accedere alla tabella HBase sta usando una chiave primaria (cursore). è possibile ottenere un cursore per una chiave specifica, e iterare le file uno per uno.
Il problema è, che nel mio caso, io voglio essere in grado di scorrere su tutte le 3 colonne. per esempio:
- per un dato un entityID voglio ottenere tutte le sue attriutes e valori
- per un attributeName dare e il valore che voglio a tutti i entitiIDS ...
così un'idea che avevo è quello di costruire una tabella HBase che conterrà i dati (dati della tabella, con entityID come indice primario), e 2 "indice" tavoli uno con attributeName come una chiave primaria, e l'altro con un valore
ogni tabella indice terrà una lista di puntatori (entityIDs) per la tabella di dati.
Si tratta di un approccio ragionevole? o è è un 'abuso' di concetti HBase?
HBase permette ottenere operazioni di primaria chiave e scansioni (pensare: cursore) oltre fila gamme. (Se si dispone di scala e di bisogno di indici secondari, non ti preoccupare - Lucene per il salvataggio! Ma questo è un altro post.)
Sapete come Lucene può aiutare?
- Yonatan
Soluzione
Gli indici secondari sarebbe davvero essere utile per molte applicazioni potenziali di HBase, e credo che gli sviluppatori sono in realtà guardando. Acquista http://www.mail-archive.com /hbase-dev@hadoop.apache.org/msg04801.html.
Nel frattempo, però, se l'archiviazione dei dati applicazione può essere modellato come uno schema a stella (vedi http : //en.wikipedia.org/wiki/Star_schema ) come si potrebbe alla cassa la soluzione che propone per Hypertable secondarie esigenze indice di tipo http://markmail.org/message/rphm4q6cbar2ycgp
Altri suggerimenti
Mi consiglia di avere due diverse tabelle piatti: uno per la ricerca di attributi + valori dati entityID, e uno per la ricerca del entityID data attributi + valori
.La tabella 1 sarebbe simile a questa:
entityID1 {
attribute1: value1;
attribute2: value2;
...
}
e Tabella 2:
attribute1_value1 {
entityID1;
}
attribute2_value2 {
entityID1;
}