Exemplos de consultas Hive: Order By, Group By & Cluster By

โšก Resumo Inteligente

As consultas do Hive usam as clรกusulas ORDER BY, GROUP BY, SORT BY, CLUSTER BY e DISTRIBUTE BY para classificar, agrupar e distribuir linhas entre os reducers, e cada clรกusula รฉ demonstrada aqui em uma รบnica tabela de funcionรกrios de exemplo.

  • ๐Ÿงฑ Primeiro, uma tabela de exemplo: A tabela employees_guru รฉ criada com seis colunas e carregada do arquivo Employees.txt antes da execuรงรฃo de qualquer clรกusula.
  • ๐Ÿ”ข ORDENAR POR totais: O ORDER BY envia todo o conjunto de resultados para um รบnico redutor, o que garante a ordem total, mas torna as consultas grandes mais lentas.
  • ๐Ÿ”ค Ordenaรงรฃo de strings: Uma coluna de texto, como "Departamento", รฉ retornada em ordem lexicogrรกfica em vez de ordem numรฉrica.
  • ๐Ÿ“Š Agrupar por contagens: A combinaรงรฃo de GROUP BY com count(*) retorna uma linha por departamento com o total de funcionรกrios.
  • ๐Ÿ”€ A classificaรงรฃo por redutor รฉ feita da seguinte forma: O comando SORT BY ordena as linhas dentro de cada redutor, de modo que vรกrios redutores produzem uma saรญda parcialmente ordenada.
  • ๐ŸŽฏ Agrupar por combina: CLUSTER BY funciona como DISTRIBUTE BY mais SORT BY, enquanto DISTRIBUTE BY sozinho direciona as chaves correspondentes para um redutor sem ordenรก-las.

Consultas Hive: Ordenar por, Agrupar por, Cluster Por e Distribuir Por

O Hive fornece uma linguagem de consulta do tipo SQL para fins de ETL sobre o Hadoop sistema de arquivo.

A Linguagem de Consulta Hive (HiveQL) fornece um ambiente do tipo SQL no Hive para trabalhar com tabelas, bancos de dados e consultas.

O Hive utiliza diferentes tipos de clรกusulas para realizar diversos tipos de manipulaรงรฃo e consulta de dados, e oferece conectividade JDBC para melhorar as conexรตes com nรณs externos ao ambiente.

As consultas do Hive oferecem os seguintes recursos:

  • Modelagem de dados, como a criaรงรฃo de bancos de dados, tabelas, etc.
  • funcionalidades ETL como extracรงรฃo, transformaรงรฃo e carregamento de dados em tabelas
  • Junta para mesclar diferentes tabelas de dados
  • Scripts personalizados especรญficos do usuรกrio para facilitar o cรณdigo
  • Ferramenta de consulta mais rรกpida baseada no Hadoop

Criando tabela no Hive

Antes de comeรงarmos com o tema principal deste tutorial, vamos primeiro criar uma tabela que servirรก de referรชncia para as seรงรตes seguintes.

Neste tutorial, vamos criar a tabela โ€œemployees_guruโ€ com 6 colunas, como mostra a captura de tela abaixo.

Instruรงรฃo CREATE TABLE do Hive para employees_guru e o comando load.

Na captura de tela acima,

  1. Estamos criando a tabela โ€œemployees_guruโ€ com 6 colunas, como Id, Nome, Idade, Endereรงo, Salรกrio e Departamento, que pertencem aos funcionรกrios da organizaรงรฃo โ€œguruโ€.
  2. Nesta etapa, estamos carregando dados na tabela employees_guru. Os dados que vamos carregar estรฃo localizados no arquivo Employees.txt.

Ordenar por consulta

A sintaxe ORDER BY no HiveQL รฉ semelhante ร  sintaxe ORDER BY no... SQL lรญngua.

ORDER BY รฉ a clรกusula que usamos com a instruรงรฃo โ€œSELECTโ€ em Consultas de colmeia Para classificar dados, utiliza colunas em tabelas do Hive para ordenar os valores das colunas especรญficas mencionadas com ORDER BY, e a consulta exibe os resultados em ordem crescente ou decrescente desses valores.

Se o campo ORDER BY mencionado for uma string, o resultado serรก exibido em ordem lexicogrรกfica. No backend, todo o conjunto de resultados precisa ser passado para um รบnico reducer.

Esse รบnico redutor tambรฉm torna o ORDER BY caro em uma tabela grande, portanto, no modo estrito (hive.mapred.mode=strictO Hive rejeita uma instruรงรฃo ORDER BY que nรฃo contenha uma clรกusula LIMIT.

A captura de tela abaixo mostra a consulta ORDER BY e suas linhas classificadas.

Consulta ORDER BY em employees_guru classificada por Departamento

A partir da captura de tela acima, podemos observar o seguinte:

  1. Trata-se da consulta realizada na tabela โ€œemployees_guruโ€ com a clรกusula ORDER BY e โ€œDepartmentโ€ como o nome da coluna definida na clรกusula ORDER BY. โ€œDepartmentโ€ รฉ uma string, portanto, os resultados sรฃo exibidos em ordem lexicogrรกfica.
  2. Este รฉ o resultado real da consulta. Os resultados sรฃo exibidos com base na coluna Departamento, como ADMINISTRAร‡รƒO, Finanรงas e assim por diante, em ordem.

Inquรฉrito:

SELECT * FROM employees_guru ORDER BY Department;

Agrupar por consulta

A clรกusula GROUP BY usa colunas em tabelas do Hive para agrupar.ping Os valores especรญficos da coluna mencionados com GROUP BY sรฃo usados โ€‹โ€‹na consulta, que seleciona e exibe os resultados agrupados por esses valores.

Por exemplo, a captura de tela abaixo exibe o nรบmero total de funcionรกrios presentes em cada departamento. Aqui, temos "Departamento" como o valor de AGRUPAMENTO.

A consulta GROUP BY contabiliza os funcionรกrios em cada departamento.

A partir da captura de tela acima, podemos observar o seguinte:

  1. Trata-se da consulta realizada na tabela โ€œemployees_guruโ€ com a clรกusula GROUP BY e Department como o nome da coluna GROUP BY definida.
  2. O resultado apresentado aqui mostra o nome do departamento e o nรบmero de funcionรกrios em cada departamento. Todos os funcionรกrios pertencentes a um departamento especรญfico sรฃo agrupados e exibidos, portanto, cada linha de resultado corresponde ao nome do departamento e seu nรบmero total de funcionรกrios.

Inquรฉrito:

SELECT Department, count(*) FROM employees_guru GROUP BY Department;

Ordenar

A clรกusula SORT BY opera sobre os nomes das colunas das tabelas do Hive para ordenar a saรญda. Podemos usar DESC para ordenar em ordem decrescente e ASC para ordenar em ordem crescente.

A opรงรฃo SORT BY ordena as linhas antes de enviรก-las ao redutor, garantindo a ordem dentro de cada redutor, em vez de em todo o resultado. A ordenaรงรฃo sempre depende do tipo da coluna.

Por exemplo, se o tipo da coluna for numรฉrico, a classificaรงรฃo serรก feita em ordem numรฉrica, e se o tipo da coluna for de texto, a classificaรงรฃo serรก feita em ordem lexicogrรกfica.

A captura de tela abaixo mostra a consulta SORT BY usando DESC.

Consulta SORT BY em employees_guru retornando Id em ordem decrescente

Na captura de tela acima, podemos observar o seguinte:

  1. Trata-se da consulta realizada na tabela โ€œemployees_guruโ€ com a clรกusula SORT BY e โ€œIdโ€ como nome da coluna definida na clรกusula SORT BY. Utilizamos a palavra-chave DESC.
  2. Assim, a saรญda exibida estรก em ordem decrescente de "Id".

Inquรฉrito:

SELECT * from employees_guru SORT BY Id DESC;

Cluster By

CLUSTER BY รฉ usado como uma alternativa ร s clรกusulas DISTRIBUTE BY e SORT BY no HiveQL.

A clรกusula CLUSTER BY รฉ usada em tabelas presentes no Hive. O Hive usa as colunas em CLUSTER BY para distribuir as linhas entre os reducers, e as colunas em CLUSTER BY sรฃo direcionadas para mรบltiplos reducers. Isso tambรฉm garante a ordem de classificaรงรฃo dos valores presentes nesses mรบltiplos reducers.

Por exemplo, a clรกusula CLUSTER BY รฉ mencionada no nome da coluna Id da tabela employees_guru. A execuรงรฃo dessa consulta envia resultados para vรกrios reducers no back-end, mas no front-end ela funciona como uma clรกusula alternativa tanto para SORT BY quanto para DISTRIBUTE BY.

Este รฉ o processo de back-end quando realizamos uma consulta com SORT BY, GROUP BY ou CLUSTER BY no framework MapReduce. Portanto, se quisermos armazenar resultados em vรกrios reducers, usamos CLUSTER BY.

A gramรกtica CLUSTER BY aceita apenas nomes de colunas, portanto, ASC e DESC nรฃo podem ser associados a ela; um resultado em ordem decrescente requer DISTRIBUTE BY com um SORT BY โ€ฆ DESC separado.

A captura de tela abaixo mostra a consulta CLUSTER BY no Id.

Consulta CLUSTER BY na coluna Id de employees_guru

Na captura de tela acima, obtemos as seguintes observaรงรตes:

  1. ร‰ a consulta que executa a clรกusula CLUSTER BY no valor do campo Id. Aqui, ela irรก classificar os valores de Id.
  2. Exibe os valores de Id e Nome presentes em employees_guru em ordem crescente.

Inquรฉrito:

SELECT  Id, Name from employees_guru CLUSTER BY Id;

Distribuir por

A clรกusula DISTRIBUTE BY รฉ usada em tabelas presentes no Hive. O Hive utiliza as colunas em DISTRIBUTE BY para distribuir as linhas entre os reducers, de forma que todas as linhas que compartilham o mesmo valor na coluna DISTRIBUTE BY sejam direcionadas para o mesmo reducer.

  • Isso garante que cada um dos N redutores receba uma sequรชncia sem sobreposiรงรฃo.ping conjunto de valores da coluna
  • Nรฃo ordena a saรญda de cada redutor e nรฃo hรก garantia de que as linhas correspondentes fiquem lado a lado.

A captura de tela abaixo mostra a consulta DISTRIBUTE BY no Id.

A consulta DISTRIBUTE BY na coluna Id de employees_guru

A partir da captura de tela acima, podemos observar o seguinte:

  1. A clรกusula DISTRIBUTE BY รฉ executada no Id da tabela โ€œemployees_guruโ€.
  2. A saรญda mostra o ID e o Nome. No backend, as linhas com o mesmo ID sรฃo enviadas para o mesmo reducer.

Inquรฉrito:

SELECT  Id, Name from employees_guru DISTRIBUTE BY Id;

As quatro clรกusulas sรฃo fรกceis de confundir, por isso a tabela abaixo as compara.

Clรกusula Redutores O que isso garante
ORDENAR POR completa Ordem total em todo o resultado
ORDENAR POR Muitos Encomendar apenas dentro de cada redutor.
DISTRIBUIR POR Muitos A mesma chave chega ao mesmo redutor, sem ordenaรงรฃo.
AGRUPAR POR Muitos DISTRIBUIR POR mais CLASSIFICAR POR, em ordem crescente

Perguntas Frequentes

Um รบnico redutor precisa classificar todas as linhas, o que pode levar horas em uma tabela grande. Limitaรงรตes LIMIT funcionam. Definir `hive.mapred.mode` como `nonstrict` remove completamente a restriรงรฃo.

Defina `mapreduce.job.reduces` antes da consulta para fixar a contagem; caso contrรกrio, o Hive a estima com base no tamanho da entrada. A clรกusula `ORDER BY` ignora essa configuraรงรฃo, pois um pedido total sempre se concentra em um รบnico redutor.

Nรฃo. A clรกusula aceita apenas nomes de colunas e sempre ordena em ordem crescente. Em vez disso, escreva DISTRIBUTE BY na coluna de partiรงรฃo com uma coluna SORT BY separada, em ordem decrescente (DESC); as duas colunas tambรฉm podem ser diferentes.

Eles sรฃo relacionados, mas nรฃo idรชnticos. Baldeamento O comando `cluster by` armazena linhas permanentemente em um nรบmero fixo de arquivos, enquanto o comando `cluster by` distribui e classifica as linhas apenas durante a execuรงรฃo de uma consulta.

Os assistentes de aprendizado de mรกquina leem o plano EXPLAIN e sinalizam causas como um ORDER BY ilimitado, um filtro de partiรงรฃo ausente ou uma chave distorcida. Confirme cada sugestรฃo com base no tempo de execuรงรฃo real.

Ele descreve bem esses padrรตes a partir de um breve comentรกrio. Verifique qualquer detalhe especรญfico do mecanismo de busca, pois ele se mistura facilmente com outros. Spark Sintaxe SQL ou Presto que o Hive rejeita, como DESC apรณs CLUSTER BY.

Um arquivo de texto simples chamado Employees.txt contรฉm os valores das seis colunas e รฉ carregado na tabela antes da execuรงรฃo da primeira consulta. Qualquer arquivo delimitado com colunas correspondentes funciona da mesma maneira.

A semรขntica รฉ idรชntica, pois sรฃo caracterรญsticas da linguagem HiveQL e nรฃo caracterรญsticas do mecanismo. Apenas o plano fรญsico muda โ€” os mecanismos agendam as etapas de classificaรงรฃo e embaralhamento de forma diferente, portanto os tempos de execuรงรฃo variam, embora os resultados nรฃo mudem.

Resuma esta postagem com: