Question

Étant donné le scénario de schéma HBase suivant ( de la FAQ officielle ) ...

  

Comment concevriez-vous une table Hbase?   pour l'association plusieurs à plusieurs entre   deux entités, par exemple étudiant et   Cours?

     

Je définirais deux tables:

     

Etudiant: identifiant d'étudiant   (nom, adresse, ...) cours (utiliser   identifiants de cours en tant que qualificateurs de colonne ici)

     

Course: identifiant du cours données de cours (nom,   syllabus, ...) étudiants (utilisez étudiant   identifiants en tant que qualificateurs de colonne ici)

     

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

Comment répondez-vous à la demande: " Donnez-moi tous les étudiants partageant au moins deux cours en commun ". Pouvez-vous créer une "requête"? dans HBase qui renverra cet ensemble, ou devez-vous récupérer toutes les données pertinentes et les analyser vous-même dans le code?

Était-ce utile?

La solution

La requête décrite correspond mieux à une base de données relationnelle. Vous pouvez toutefois répondre rapidement à la requête en précalculant le résultat. Par exemple, vous pouvez avoir un tableau dans lequel la clé est le nombre de classes en commun et les cellules sont des étudiants individuels qui ont plusieurs classes en commun.

Vous pouvez utiliser une variante pour répondre à des questions telles que "quels étudiants sont en classe X et en classe Y": utilisez les classes en tant que morceaux de la clé (dans l'ordre alphabétique ou quelque chose de cohérent), et encore, chaque colonne est un étudiant.

Autres conseils

Ce type de requête n'est pas disponible via l'API 0.20.0. Je ne suis pas sûr s'il y a des projets pour cela (je doute que cela paraisse de sitôt). Vous trouverez des informations sur la feuille de route sur le site Web HBase qui pourraient répondre à cette question.

Vous aurez besoin de calculer la réponse dans votre propre application (même si j'aimerais beaucoup avoir tort).

Utilisez un fichier pour y parvenir.

SingleValueFiler filer = new SingleValueFiler (et vos arguments basés sur l'api);

ajoutez ceci à Scan (org.apache.hadoop.hbase.client.Scan scan = new Scan ();                    scan.setFiler (filtre);

On dirait que MapReduce pourrait être un moyen de résoudre ce problème; malheureusement, cela ne donnerait pas un résultat instantané si cela se fait à la volée. En y réfléchissant, vous pourriez, à la phase de carte, compter le nombre de fois où une paire d'élèves se retrouvent dans la même classe. Pendant la phase de réduction, vous pouvez additionner les paires et écrire (émettre) les paires qui ont une somme de 2 ou plus. Cette approche pourrait être utilisée pour pré-générer un indice (comme suggéré précédemment) qui indique les paires d’élèves avec "x". cours en commun. La clé d'un tel index pourrait être quelque chose du type "X / Student1_Key / Student2_Key", où X est le nombre de cours qu'ils ont en commun et. Un balayage de plage sur l’index (par exemple, X > = 2) vous donnerait votre réponse. Étant donné l’intégration native de HBase avec MapReduce, une solution allant dans ce sens devrait être simple.

En outre, suivant le modèle BigTable, vous n’auriez même pas besoin de créer deux tables. Il suffit de faire précéder chaque clé d’enregistrement par un "type". tels que cours: ou étudiant :. Les rangées étant ordonnées lexicographiquement, elles sont facilement numérisées par type. Renseignez (ou générez) les colonnes nécessaires pour prendre en charge les propriétés de chaque type. Comme HBase supporte les tables très rares, cela fonctionne bien. Consultez cette excellente présentation sur la sélection de clés et le développement d’index avec BigTable: http: // www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html . Cette présentation m'a vraiment aidé à comprendre comment stocker des éléments 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 utiliser vos données afin de pouvoir développer au préalable des indices appropriés pour obtenir des réponses rapides. Il ne semble pas que les requêtes ad hoc aléatoires fonctionneront toujours avec ce modèle.

Quoi qu’il en soit, je suis aussi novice dans ce domaine, alors voir les problèmes de ce type et les solutions possibles peut aider!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top