2009-09-16 12 views
8

dado el escenario siguiente esquema HBase (from the official FAQ) ...consultas avanzadas en HBase

¿Cómo diseñaría una mesa hbase para-muchos-a-muchos entre dos entidades, por ejemplo, los estudiantes y ¿Curso?

Yo definiría dos tablas:

Estudiante: datos de los estudiantes Identificación del estudiante (nombre, dirección, ...) cursos ( utilizar los identificadores de los cursos como calificadores de columna aquí)

del curso: Curso de Identificación los datos (nombre, programa de estudios, ...) estudiantes (para estudiantes ids como calificadores de columna aquí)

Este esquema permite un rápido acceso a las consultas , mostrar todas las clases para un estudiante (s tudent table, cursos familia), o todos los estudiantes de una clase (tabla de cursos, familia de estudiantes).

¿Cómo le satisfacer la petición: "Dame todos los estudiantes que comparten al menos dos cursos en común"? ¿Se puede construir una "consulta" en HBase que devuelva ese conjunto, o tiene que recuperar todos los datos pertinentes y crunch él mismo en el código?

Respuesta

3

La consulta tal como se describe es más adecuada para una base de datos relacional. Sin embargo, puede responder la consulta rápidamente mediante la precomputación del resultado. Por ejemplo, es posible que tenga una tabla donde la clave sea la cantidad de clases en común, y las celdas sean alumnos individuales que tengan muchas clases clave en común.

Puede usar una variante para responder preguntas como "qué estudiantes son de clase X y clase Y": utilice las clases como partes de la tecla (en orden alfabético, o algo al menos consistente), y nuevamente, cada columna es un estudiante.

2

Este tipo de consulta no está disponible a través de la API 0.20.0. No estoy seguro de si hay algún plan para ello (dudo que aparezca pronto). Encontrará algunos detalles de la hoja de ruta en el sitio web de HBase que podría responder esa pregunta.

Tendrá que calcular la respuesta en su propia aplicación (aunque me gustaría que se demostrara que está mal).

1

Utilice un filtro para lograr esto.

SingleValueFiler filer = new SingleValueFiler (y sus argumentos basados ​​en la API);

añadir esta opción para escanear (org.apache.hadoop.hbase.client.Scan scan = new Escanear(); scan.setFiler (filtro);

+0

¿Podría ampliar su pseudocódigo de ejemplo incorporando los estudiantes/cursos de la pregunta para demostrar cómo un SingleValueFilter lograría la tarea? –

1

Parece que MapReduce podría ser una manera de resolver esto; desafortunadamente no daría un resultado instantáneo si se hace sobre la marcha. Solo pensando en ello, podría, en la fase del mapa, contar el número de veces que un par de estudiantes termina en la misma clase. podría sumar los pares y escribir (emitir) los pares que tenían una suma de 2 o más. Este enfoque podría usarse para pregenerar un índice (como se sugirió anteriormente) que indica los pares de estudiantes con cursos "x" en común.La clave de dicho índice podría ser algo como "X/Student1_Key/Student2_Key", donde X es el número de cursos que tienen en común y. Un análisis de rango sobre el índice (por ejemplo, X> = 2) le daría su respuesta. Dada la integración nativa de HBase con MapReduce, una solución en esta línea debería ser sencilla.

Además, siguiendo el modelo de BigTable, ni siquiera necesitaría crear dos tablas. Simplemente preceda cada clave de registro con un "tipo" como Curso: o Estudiante :. Como las filas se ordenan lexicográficamente, se escanean fácilmente por tipo. Rellena (o genera) las columnas necesarias para admitir propiedades para cada tipo. Como HBase admite tablas muy dispersas, esto funciona bien. Vea esta excelente presentación sobre cómo seleccionar claves y desarrollar índices con BigTable: http://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html. Esta presentación realmente me ayudó a entender cómo almacenar cosas en bases de datos como HBase para una recuperación eficiente.

Pero volviendo a la pregunta original, parece que cuando se trabaja con HBase realmente tiene que saber cómo se utilizarán sus datos para que los índices apropiados puedan desarrollarse de antemano para obtener respuestas rápidas. No parece que las consultas ad-hoc aleatorias siempre funcionen con este modelo.

De todos modos, también soy nuevo en esto, ¡así que ver problemas como estos y posibles soluciones ayuda!