Melhorar suas consultas colmeia com índices
Criar um índice é prática comum com bancos de dados relacionais quando você quiser acelerar o acesso a uma coluna ou conjunto de colunas em seu banco de dados. Sem um índice, o sistema de banco de dados tem de ler todas as linhas na tabela para encontrar os dados que você selecionou. Índices tornam-se ainda mais essencial quando as tabelas crescer extremamente grande, e como você já sabe, sem dúvida, Hive prospera em tabelas grandes.
Como seria de esperar, Hive suporta a criação do índice em tabelas, embora a sua funcionalidade ainda é um pouco imaturo. No entanto, a comunidade Hive é ativo, e indexação acabará por amadurecer. Mesmo com suas limitações atuais, indexação oferece uma abordagem para acelerar as consultas colmeia com pouco esforço.
Você pode otimizar consultas Hive em pelo menos cinco maneiras: primeiro, com um pouco de pesquisa, muitas vezes você pode acelerar sua junta, aproveitando certas técnicas de otimização, conforme descrito no wiki hive. Em segundo lugar, as opções de armazenamento orientada a coluna pode ser bastante útil. Lembre-se que o formato de arquivo ORC é novo a partir de Hive 0,11.
Em terceiro lugar, você pode particionar tabelas. Em quarto lugar, a comunidade Hive tem proporcionado indexação. Finalmente, não se esqueça do hive.exec.mode.local.auto variável de configuração.
No que se segue são as medidas necessárias para o índice FlightInfo2008 mesa. Esta extremamente grande mesa tem milhões de linhas, por isso faz um bom candidato para um índice ou dois.
(A) CRIAR f08_index ÍNDICE NO flightinfo2008 TABELA (Origem) AS `compacto COM REBUILD- regularização (B) ALTER INDEX f08_index NO flightinfo2008 REBUILD- (C) colmeia (flightdata) gt; MOSTRAR índices em FlightInfo2008-OKf08indexflightinfo2008 origem flightdata__flightinfo2008_f08index__ compactTime feita: 0,079 segundos, obtida: uma linha (s) (D) colmeia (flightdata) gt; DESCREVER flightdata__flightinfo2008_f08index __- corda OKorigin string_offsetsarray None_bucketnameTempo necessário: 0,112 segundos, obtida: 3 linha (s) de (E) colmeia (flightdata) gt; Origem SELECT, COUNT (1) DE ONDE flightinfo2008 grupo de origem = `SYR` por origem SYR-12032Time feita: 17,34 segundos, obtida: uma linha (s) (F) colmeia (flightdata) gt; Origem SELECT, TAMANHO ( `_offsets`) DE ONDE flightdata__flightinfo2008_f08index__ origem = `SYR`-SYR 12032Time feita: 8.347 segundos, obtida: uma linha (s) (G), ramificação (flightdata) gt; DESCREVER flightdata__flightinfo2008_f08index __- corda OKorigin string_offsetsarray None_bucketname Tempo necessário: 0,12 segundos, obtida: 3 row (s)
Passo (A) cria o índice utilizando o ‘COMPACTAR’Manipulador de índice na Origem coluna. Colmeia também oferece um manipulador de índice de mapa de bits como o lançamento de 0,8, o qual se destina para a criação de índices em colunas com alguns valores originais.
No passo (a) as expressões COM FUTUROS RECONSTRUIR instrui colmeia para criar primeiro um passo index- vazio (B), onde é efectivamente construir o índice com o ALTER INDEX ... REBUILD comando. índice diferido constrói pode ser muito útil nos fluxos de trabalho, onde um processo cria as tabelas e índices mais carrega os dados e constrói os índices e um processo final executa a análise de dados.
O ramo não fornecer a manutenção do índice automático, então você precisa reconstruir o índice se você substituir ou acrescentar dados à tabela. Além disso, os índices de colmeia suportar divisórias de mesa, de modo a reconstruir pode ser limitado a uma partição. Passo (C) ilustra como você pode listar ou mostrar os índices criados contra uma tabela específica.
O passo (D) ilustra um ponto importante sobre índices colmeia: índices colmeia são implementados como mesas. É por isso que você precisa primeiro criar a tabela de índice e, em seguida, construí-lo para preencher a tabela. Portanto, você pode usar índices em pelo menos duas maneiras:
Conte com o sistema para usar automaticamente índices que criar.
Reescrever algumas consultas para alavancar a nova tabela de índice.
O uso automático de índices está progredindo, mas este aspecto é um trabalho em progresso. Concentrando-se na segunda opção, no Passo (E) você escrever uma consulta que procura determinar quantos vôos deixaram o aeroporto de Syracuse ao longo de 2008. Para obter essa informação, você alavancar o CONTAGEM função agregada.
Você pode ver que Hive levou 17,32 segundos na máquina virtual para informar que 12,032 vôos originados de Syracuse, Nova York.
Na Etapa (F), você alavancar a nova tabela de índice e usar o TAMANHO funcionar em seu lugar. Passo (F) faz mais sentido depois de estudar passo (D): Passo (D) mostra o que uma tabela de índice parece, onde os registros de cada segurar a coluna _bucketname, que é a localização dos dados no armazém colmeia (/ Home / BiAdmin / colmeia / armazém, neste caso), e um _offsets matriz, que é o índice para a mesa (FlightInfo2008) nesse caso.
Então agora a pergunta no Passo (F) faz sentido. Todos Hive tem a fazer é encontrar o SYR origem (para Syracuse) na flightdata__flightinfo2008_f08index__ mesa e, em seguida, contar as linhas na _offsets’ matriz para obter o número de voos - uma maneira simples, mas elegante para dobrar a performance (8.347 segundos na Etapa (F) versus 17,34 em Degrau (E)) da consulta original.