Pergunta

Dado o seguinte cenário esquema HBase ( do FAQ oficial ) ...

Como você projetar uma tabela HBase para muitos-para-muitos associação entre duas entidades, por exemplo Student e Curso?

Eu definiria duas tabelas:

Estudantes: dados de identificação do aluno estudante (Nome, endereço, ...) cursos (uso ids curso como qualificadores coluna aqui)

Curso: Campo de dados do curso ID (nome, plano de estudos, ...) alunos (estudante uso ids como qualificadores coluna aqui)

Este esquema dá-lhe acesso rápido a as consultas, mostrar todas as classes para uma estudantis (tabela estudante, cursos família), ou todos os alunos para uma classe (Cursos de mesa, os alunos família).

Como você satisfazer o pedido: " Dê-me todos os estudantes que compartilham pelo menos dois cursos em comum "? você pode construir uma "consulta" em HBase que irá retornar esse conjunto, ou você tem para recuperar todos os dados pertinentes e triturar-lo sozinho no código?

Foi útil?

Solução

A consulta conforme descrito é mais adequado para um banco de dados relacional. Você pode responder a consulta rapidamente, no entanto, por precomputing o resultado. Por exemplo, você pode ter uma tabela onde a chave é o número de classes em comum, e as células são estudantes individuais que têm chave-muitas classes em comum.

Você pode usar uma variante deste para responder a perguntas como "qual os alunos estão na classe X e classe Y": usar as classes como pedaços da chave (em ordenação alfabética, ou algo assim, pelo menos consistente), e novamente, cada coluna é um estudante.

Outras dicas

Este tipo de consulta não está disponível através do 0.20.0 API. Eu não tenho certeza se existem quaisquer planos para ele (eu duvido que ele iria aparecer a qualquer momento em breve). Você vai encontrar alguns detalhes do roteiro no site da HBase que pode resposta a essa pergunta.

Você vai precisar para calcular a resposta em seu próprio aplicativo (embora eu adoraria estar errado provado).

Use um arquivador para o conseguir.

SingleValueFiler arquivador = new SingleValueFiler (e seus argumentos com base na API);

adicionar isso para Scan (org.apache.hadoop.hbase.client.Scan varredura = new Scan (); scan.setFiler (filtro);

Parece que MapReduce poderia ser uma maneira de resolver este; infelizmente, não daria um resultado imediato se for feito na mosca. Só de pensar através dele você poderia, na fase mapa, contar o número de vezes que um par de estudantes acabam na mesma classe. Durante a fase de reduzir você poderia resumir os pares e escrever (emitem) os pares que tinham uma soma de 2 ou mais. Esta abordagem poderia ser usada para pré-gerar um índice (como sugerido anteriormente) que indica os pares de alunos com "x" cursos em comum. A chave para um tal índice pode ser algo ao longo das linhas de "X / Student1_Key / Student2_Key", onde X é o número de cursos que eles têm em comum e. Uma varredura gama sobre o índice (por exemplo, X> = 2) iria dar-lhe a sua resposta. Dada a integração nativa do HBase com MapReduce uma solução ao longo destas linhas deve ser simples.

Além disso, seguindo o modelo BigTable, você não precisa mesmo de criar duas tabelas. Apenas preceder cada chave registro com um "tipo", tais como Curso: ou estudante :. Desde as linhas são ordenados lexicographically eles são facilmente verificado pelo tipo. Preencher (ou gerar) as colunas necessárias para suportar as propriedades de cada tipo. Desde HBase suporta tabelas altamente esparsas isso funciona bem. Veja este excelente apresentação sobre a seleção de teclas e desenvolver índices com BigTable: http: // www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html . Esta apresentação realmente me ajudou a entender como armazenar coisas em bases de dados, como HBase para recuperação eficiente.

Mas voltando à pergunta inicial, parece que quando se trabalha com HBase você realmente tem que saber como seus dados estão a ser utilizados de modo índices apropriados podem ser desenvolvidas previamente para obter respostas rápidas. Não parece que ad-hoc aleatória consultas será sempre trabalhar para fora com este modelo.

De qualquer forma, eu também sou novo a este modo de ver problemas como estes e as possíveis soluções ajuda!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top