Pregunta

Dado el siguiente escenario de esquema de HBase ( de las preguntas frecuentes oficiales ) ...

  

¿Cómo diseñaría una tabla Hbase?   para la asociación de muchos a muchos entre   dos entidades, por ejemplo Student y   Curso?

     

Definiría dos tablas:

     

Estudiante: identificación del estudiante datos del estudiante   (nombre, dirección, ...) cursos (uso   ID del curso como calificadores de columna aquí)

     

Curso: id del curso datos del curso (nombre,   plan de estudios, ...) estudiantes (use estudiante   identificadores como calificadores de columna aquí)

     

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

¿Cómo satisfaría la solicitud: " Dame todos los estudiantes que comparten al menos dos cursos en común " ;? ¿Se puede construir una " consulta " en HBase que devolverá ese conjunto, o ¿tiene que recuperar todos los datos pertinentes y procesarlos usted mismo en el código?

¿Fue útil?

Solución

La consulta como se describe es más adecuada para una base de datos relacional. Sin embargo, puede responder la consulta rápidamente precalculando el resultado. Por ejemplo, puede tener una tabla donde la clave es la cantidad de clases en común, y las celdas son estudiantes individuales que tienen clases clave-muchas en común.

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

Otros consejos

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

Tendrá que calcular la respuesta en su propia aplicación (aunque me encantaría que me demuestren lo contrario).

Use un archivador para lograr esto.

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

agregue esto a Scan (org.apache.hadoop.hbase.client.Scan scan = new Scan ();                    scan.setFiler (filtro);

Parece que MapReduce podría ser una forma de resolver esto; desafortunadamente no daría un resultado instantáneo si se hace sobre la marcha. Con solo pensarlo, en la fase del mapa, podrías contar la cantidad de veces que un par de estudiantes terminan en la misma clase. Durante la fase de reducción, 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 '' x '' cursos en común. La clave de dicho índice podría ser algo similar a "X / Student1_Key / Student2_Key", donde X es el número de cursos que tienen en común y. Una exploración 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 este sentido 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 " kind " como Curso: o Estudiante :. Como las filas están ordenadas lexicográficamente, se pueden escanear fácilmente por tipo. Rellene (o genere) las columnas necesarias para admitir propiedades para cada tipo. Dado que HBase admite tablas muy dispersas, esto funciona bien. Consulte 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 comprender cómo almacenar cosas en bases de datos como HBase para una recuperación eficiente.

Pero volviendo a la pregunta original, parece que cuando trabajas con HBase realmente tienes que saber cómo se van a utilizar tus datos para poder desarrollar índices apropiados 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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top