2009-09-16 23 views
8

Étant donné le scénario de schéma HBase suivant (from the official FAQ) ...requêtes avancées dans HBase

Comment voulez-vous concevoir une table Hbase pour beaucoup à plusieurs entre deux entités, par exemple des étudiants et Cours?

Je définirais deux tables:

étudiants: données sur les étudiants d'étudiant (nom, adresse, ...) des cours (utiliser ids cours d'épreuves de qualification de la colonne ici)

Cours: cours cours id données (nom, programme , ...) étudiants (utilisation étudiants Ids qualifiés de colonne ici)

Ce schéma vous donne un accès rapide à les requêtes, montrer toutes les classes pour un étudiant (s table de tudent, cours famille), ou tous les élèves pour une classe (table de cours, famille d'étudiants).

Comment voulez-vous répondre à la demande: « Donne-moi tous les étudiants qui partagent au moins deux cours en commun »? Pouvez-vous construire une "requête" dans HBase qui retournera cet ensemble, ou devez-vous récupérer toutes les données pertinentes et les croquer vous-même dans le code?

Répondre

3

La requête décrite est mieux adaptée à une base de données relationnelle. Cependant, vous pouvez répondre rapidement à la requête en calculant le résultat. Par exemple, vous pourriez avoir une table où la clé est le nombre de classes communes, et les cellules sont des étudiants individuels qui ont en commun plusieurs classes clés. Vous pouvez utiliser une variante pour répondre à des questions telles que "quels élèves sont en classe X et en classe Y": utilisez les classes comme des morceaux de la clé (par ordre alphabétique, ou quelque chose de moins cohérent), et encore, chaque colonne est un étudiant.

2

Ce type d'interrogation n'est pas disponible via l'API 0.20.0. Je ne suis pas sûr s'il y a des plans pour cela (je doute qu'il apparaisse bientôt). Vous trouverez quelques détails sur le site Web HBase que pourrait répondre à cette question.

Vous aurez besoin de calculer la réponse dans votre propre application (bien que j'aimerais être mal prouvé).

1

Utilisez un filer pour y parvenir.

SingleValueFiler filer = nouveau SingleValueFiler (et vos arguments basés sur l'API);

ajouter ceci pour numériser (scan org.apache.hadoop.hbase.client.Scan = new scan(); scan.setFiler (filtre);

+0

Pourriez-vous développer votre pseudo-code d'exemple en incorporant les étudiants/cours de la question pour démontrer comment un SingleValueFilter accomplirait la tâche? –

1

On dirait que MapReduce pourrait être un moyen de résoudre ce; Malheureusement, cela ne donnerait pas un résultat instantané s'il est fait à la volée En y réfléchissant, vous pourriez, dans la phase de la carte, compter le nombre de fois où une paire d'élèves se retrouvent dans la même classe. vous pourriez additionner les paires et écrire (émettre) les paires qui avaient une somme de 2 ou plus Cette approche pourrait être utilisée pour pré-générer un index (comme suggéré plus tôt) qui indique les paires d'étudiants avec des cours «x» dans commun.La clé d'un tel index pourrait être quelque chose comme "X/Student1_Key/Student2_Key", où X est le nombre de cours qu'ils ont en commun et. Une analyse de plage sur l'index (par exemple, X> = 2) vous donnera votre réponse. Étant donné l'intégration native de HBase avec MapReduce, une solution dans ce sens devrait être simple. En outre, en suivant le modèle BigTable, vous n'avez même pas besoin de créer deux tables. Juste précèdent chaque clé d'enregistrement avec un "kind" tel que Course: ou Student :. Puisque les lignes sont classées lexicographiquement, elles sont facilement numérisées par type. Remplissez (ou générez) les colonnes nécessaires pour prendre en charge les propriétés pour chaque type. Puisque HBase supporte des tables très clairsemées, cela fonctionne bien. Voir cette excellente présentation sur la sélection des clés et le développement d'indices avec BigTable: http://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html. Cette présentation m'a vraiment aidé à comprendre comment stocker des choses dans des bases de données telles que HBase pour une récupération efficace. Mais revenons à la question initiale, il semble que lorsque vous travaillez avec HBase vous devez vraiment savoir comment vos données doivent être utilisées afin que les indices appropriés puissent être développés au préalable pour obtenir des réponses rapides. Il ne semble pas que les requêtes ad hoc aléatoires fonctionneront toujours avec ce modèle.

De toute façon, je suis également nouveau à ce problème, donc voir des problèmes comme ceux-ci et des solutions possibles!