Compte tenu du scénario de schéma HBASE suivant ( de la FAQ officiel ) ... < / p>
Comment concevriez-vous une table HBASE Pour une association à plusieurs égales entre deux entités, par exemple étudiant et Cours? P>
Je définirais deux tables: p>
Étudiant: Data Student ID Student (nom, adresse, ...) cours (utilisation ID de cours comme qualificatifs de colonne ici) p>
Cours: Données de cours d'identification de cours (nom, Syllabus, ...) Étudiants (utilisez l'étudiant IDS comme qualificatif de colonne ici) p>
Ce schéma vous donne un accès rapide à Les requêtes, montrent toutes les classes pour un Étudiant (table étudiante, cours famille) ou tous les étudiants pour une classe (Table de cours, famille des étudiants). P> blockQuote>
Comment voulez-vous satisfaire la demande: " Donnez-moi tous les étudiants qui partagent au moins deux cours en commun em>"? Pouvez-vous créer une "requête" dans HBASE qui retournera cet ensemble, ou devez-vous récupérer toutes les données pertinentes et la crunch-la-même dans le code? P>
4 Réponses :
Ce type de requête n'est pas disponible via l'API de 0.20.0. Je ne sais pas s'il y a des projets pour cela (je doute qu'il apparaisse à tout moment bientôt). Vous trouverez des détails de la feuille de route sur le site Web HBASE qui pourrait em> répondre à cette question. P>
Vous devrez calculer la réponse dans votre propre application (bien que j'aimerais être prouvé comme mal). P>
La requête décrite comme décrit est mieux adaptée à une base de données relationnelle. Vous pouvez répondre à la requête rapidement, cependant, en précalisant le résultat. Par exemple, vous pourriez avoir une table dans laquelle la clé est le nombre de classes en commun, et les cellules sont des élèves individuels qui ont des classes de plusieurs classes en commun. P>
Vous pouvez utiliser une variante à ce sujet pour répondre à des questions telles que «quels étudiants sont en classe X et Class Y»: utilisez les classes comme des morceaux de la clé (par ordre alphabétique ou quelque chose au moins cohérent), et encore une fois, chacun colonne est un étudiant. P>
Utilisez un déposant pour y parvenir. p>
SingleValuefiler Filer = Nouveau SingleValueFiler (et vos arguments basés sur l'API); P>
ajoutez ceci à numériser (org.apache.hadoop.hbase.client.scan scan = Nouvelle analyse (); scan.setfiler (filtre); p>
Pourriez-vous s'il vous plaît développer votre exemple pseudo-code incorporant les étudiants / cours de la question pour démontrer comment un SingEvalueFilter accomplirait la tâche?
On dirait que Mapreduce pourrait être un moyen de résoudre ce problème; Malheureusement, cela ne donnerait pas de résultat instantané si cela se fait à la volée. Il suffit de penser que vous pourriez, dans la phase de carte, comptez le nombre de fois qu'une paire d'étudiants se retrouvent dans la même classe. Pendant la phase de réduction, vous pouvez résumer 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é plus tôt) qui indique les paires d'étudiants avec des cours «X» en commun. La clé d'un tel index pourrait être quelque chose dans le sens de "x / étudiant1_key / étudiant2_key", où X est le nombre de cours qu'ils ont en commun et. Une analyse de la plage sur l'index (par exemple, x> = 2) vous donnerait votre réponse. Compte tenu de l'intégration native de HBASE avec MapReduce une solution sur ces lignes doit être simple. P>
En outre, après le modèle bigtable, vous n'avez même pas besoin de créer deux tables. Il suffit de préciser chaque clé d'enregistrement avec un «type» tel que le cours: ou étudiant :. Étant donné que les lignes sont commandées lexicographiquement, elles sont facilement numérisées par type. Renseigner (ou générer) les colonnes nécessaires pour prendre en charge les propriétés pour chaque type. Puisque HBASE soutient des tables très clairsemées, cela fonctionne bien. Consultez cette excellente présentation sur la sélection des clés et des indices de développement avec BigTable: http: // www.google.com/events/IO/2009/SESSSIONS/BUILDINGSCALABLECOMPLEXApps.html . Cette présentation m'a vraiment aidé à comprendre comment stocker des objets dans des bases de données telles que HBASE pour une récupération efficace. P>
Mais retour à 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 à l'avance pour obtenir des réponses rapides. Il n'apparaît pas que des requêtes ad-hoc aléatoires fonctionnent toujours avec ce modèle. P>
Quoi qu'il en soit, je suis également nouveau à cela afin de voir des problèmes comme ceux-ci et des solutions possibles aide! P>