Tutorial de junção e subconsulta do Hive com exemplos

⚡ Resumo Inteligente

As junções do Hive combinam linhas de duas ou mais tabelas com base em uma coluna correspondente, e as subconsultas aninham uma consulta dentro de outra; ambas são demonstradas aqui em duas tabelas de exemplo carregadas de arquivos de texto simples.

  • 🧱 Duas tabelas de exemplo: O conjunto de dados sample_joins contém detalhes do cliente e o conjunto de dados sample_joins1 contém detalhes do pedido, unidos pela coluna Id compartilhada.
  • 🔗 Quatro tipos de junção: As junções internas, externas esquerdas, externas direitas e totalmente externas mantêm cada uma um conjunto diferente de fileiras não correspondentes.
  • ⬜ NULL indica a lacuna: Uma junção externa retorna uma linha mesmo sem correspondência, preenchendo todas as colunas do lado ausente com NULL.
  • 🔁 A ordem importa: As operações de junção não são comutativas e são associativas à esquerda, portanto, troque-as.ping As tabelas alteram o resultado de uma junção externa.
  • 🧮 Subconsultas aninham consultas: Uma subconsulta é escrita na cláusula FROM ou na cláusula WHERE, e a consulta externa depende do valor que ela retorna.
  • 📜 TRANSFORM incorpora scripts: Scripts personalizados de mapeamento e redução são executados por meio da cláusula TRANSFORM quando nenhuma função integrada é adequada.

Exemplos de junção e subconsulta do Hive

Junte-se a consultas

Consultas de junção podem ser realizadas em duas tabelas presentes em ColméiaPara entender melhor os conceitos de junção, criaremos duas tabelas aqui:

  • amostras_joins (relacionadas a detalhes do cliente)
  • sample_joins1 (relacionado aos detalhes dos pedidos feitos pelos funcionários)

Passo 1) Criação da tabela “sample_joins” com as colunas Id, Nome, Idade, Endereço e Salário dos funcionários. A captura de tela abaixo mostra a instrução CREATE TABLE e sua confirmação.

Instrução CREATE TABLE do Hive para a tabela de clientes sample_joins.

Passo 2) Carregando e exibindo dados. A próxima captura de tela mostra o comando de carregamento seguido pelo conteúdo da tabela.

Carregando o arquivo Customers.txt em sample_joins e exibindo as linhas carregadas.

Conforme a captura de tela acima:

  1. Carregando dados em sample_joins de Customers.txt
  2. Exibindo o conteúdo da tabela sample_joins

Passo 3) Criação da tabela sample_joins1 e, em seguida, carregamento e exibição de seus dados, conforme mostrado na captura de tela abaixo.

Criando sample_joins1, carregando orders.txt e exibindo as linhas de pedido.

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

  1. Criação da tabela sample_joins1 com as colunas Orderid, Date1, Id e Amount.
  2. Carregando dados em sample_joins1 deorders.txt
  3. Exibindo registros presentes em sample_joins1

A seguir, veremos os diferentes tipos de junções que podem ser realizadas nas tabelas que criamos. Antes disso, você precisa considerar os seguintes pontos sobre junções.

Alguns pontos a observar nas junções:

  • Somente junções por igualdade são permitidas em junções.
  • Mais de duas tabelas podem ser unidas na mesma consulta
  • As junções LEFT, RIGHT e FULL OUTER existem para fornecer mais controle sobre a cláusula ON para a qual não há correspondência.
  • As junções não são comutativas.
  • As junções são associativas à esquerda, independentemente de serem junções ESQUERDA ou DIREITA

A restrição de igualdade reflete o Hive como era há muitos anos. A partir da versão 2.2.0, expressões complexas na cláusula ON são suportadas (HIVE-15211), portanto, uma condição de não igualdade é aceita na versão atual. Em versões mais antigas, a condição precisa ser um teste de igualdade, com qualquer outra condição sendo movida para uma cláusula WHERE.

Diferentes tipos de junções

Existem quatro tipos de junções. São elas:

  • Junção interna
  • Junção externa esquerda
  • Junção externa direita
  • Junção externa completa

Cada tipo é demonstrado abaixo em relação às mesmas duas tabelas, portanto, a única coisa que muda entre os exemplos é quais linhas não correspondentes permanecem.

Junção interna

Os registros comuns a ambas as tabelas serão recuperados por meio dessa junção interna. O resultado na captura de tela abaixo contém apenas os clientes que possuem um pedido correspondente.

O resultado da junção interna do Hive mostra apenas os clientes que têm um pedido correspondente.

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

  1. Aqui estamos realizando uma consulta de junção usando a palavra-chave JOIN entre as tabelas sample_joins e sample_joins1, com a condição de correspondência (c.Id = o.Id).
  2. O resultado exibe os registros comuns presentes em ambas as tabelas, selecionados verificando a condição mencionada na consulta.

Inquérito:

SELECT c.Id, c.Name, c.Age, o.Amount FROM sample_joins c JOIN sample_joins1 o ON(c.Id=o.Id);

União Externa Esquerda

  • HiveQLGenericName LEFT OUTER JOIN retorna todas as linhas da tabela da esquerda, mesmo que não haja correspondências na tabela da direita.
  • Se a cláusula ON não encontrar nenhum registro na tabela da direita, a junção ainda retornará um registro no resultado com NULL em cada coluna da tabela da direita.

A captura de tela abaixo mostra que todos os clientes aparecem, incluindo aqueles que não fizeram nenhum pedido.

O resultado da junção externa à esquerda do Hive apresenta valores NULL para clientes sem pedidos.

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

  1. Aqui, estamos realizando uma consulta de junção usando a palavra-chave “LEFT OUTER JOIN” entre as tabelas sample_joins e sample_joins1, com a condição de correspondência (c.Id = o.Id). Por exemplo, aqui estamos usando o ID do funcionário como referência; verificamos se o ID é comum tanto à tabela da direita quanto à tabela da esquerda. Isso funciona como a condição de correspondência.
  2. A saída exibe os registros selecionados pela condição mencionada na consulta. Os valores NULL na saída acima representam colunas sem valores da tabela correta, ou seja, sample_joins1.

Inquérito:

SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c LEFT OUTER JOIN sample_joins1 o ON(c.Id=o.Id)

Junção Externa Direita

  • A consulta RIGHT OUTER JOIN do HiveQL retorna todas as linhas da tabela da direita, mesmo que não haja correspondências na tabela da esquerda.
  • Se a cláusula ON não encontrar nenhum registro na tabela da esquerda, a junção ainda retornará um registro no resultado com NULL em cada coluna da tabela da esquerda.
  • A junção RIGHT sempre retorna registros da tabela à direita e registros correspondentes da tabela à esquerda. Se a tabela à esquerda não tiver nenhum valor correspondente à coluna, ela retornará valores NULL nesse local.

A captura de tela abaixo mostra a imagem espelhada do resultado anterior: todos os pedidos aparecem, correspondidos ou não.

Saída do Hive right outer join keeping cada linha de pedido de sample_joins1

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

  1. Aqui estamos realizando uma consulta de junção usando a palavra-chave “RIGHT OUTER JOIN” entre as tabelas sample_joins e sample_joins1, com a condição de correspondência (c.Id = o.Id).
  2. O resultado exibe os registros selecionados verificando a condição mencionada na consulta.

Inquérito:

  SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c RIGHT OUTER JOIN sample_joins1 o ON(c.Id=o.Id)

Junção Externa Completa

Ela combina os registros das tabelas sample_joins e sample_joins1 com base na condição JOIN fornecida na consulta.

A função retorna todos os registros de ambas as tabelas e preenche os valores NULL nas colunas cujos valores correspondentes estão ausentes em um dos lados, conforme mostra a captura de tela abaixo.

Saída do Hive full outer join combinando linhas não correspondentes de ambas as tabelas

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

  1. Aqui estamos realizando uma consulta de junção usando a palavra-chave “FULL OUTER JOIN” entre as tabelas sample_joins e sample_joins1, com a condição de correspondência (c.Id = o.Id).
  2. O resultado exibe todos os registros presentes em ambas as tabelas, selecionados verificando a condição mencionada na consulta. Os valores NULL no resultado indicam os valores ausentes nas colunas de ambas as tabelas.

Inquérito:

SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c FULL OUTER JOIN sample_joins1 o ON(c.Id=o.Id)

Subconsultas

As junções colocam tabelas lado a lado. Uma subconsulta faz algo diferente: ela aninha uma consulta dentro de outra, de forma que a consulta externa possa trabalhar com um resultado que já foi calculado.

Uma consulta contida dentro de outra consulta é conhecida como subconsulta. A consulta principal dependerá dos valores retornados pela subconsulta.

As subconsultas podem ser classificadas em dois tipos:

  • Subconsultas na cláusula FROM
  • Subconsultas na cláusula WHERE

Quando usar:

  • Para obter um valor específico combinado de dois valores de colunas de tabelas diferentes
  • Dependência dos valores de uma tabela em relação aos valores de outras tabelas.
  • Verificação comparativa dos valores de uma coluna em relação aos valores de outras tabelas.

Sintaxe:

Subquery in FROM clause
SELECT <column names 1, 2…n>From (SubQuery) <TableName_Main >
Subquery in WHERE clause
SELECT <column names 1, 2…n> From<TableName_Main>WHERE col1 IN (SubQuery);

Exemplo:

SELECT col1 FROM (SELECT a+b AS col1 FROM t1) t2

Aqui, t1 e t2 são nomes de tabelas. A instrução interna é a subconsulta realizada na tabela t1. Aqui, a e b são colunas adicionadas na subconsulta e atribuídas a col1. Col1 é o valor da coluna presente na tabela principal. Essa coluna “col1” presente na subconsulta é equivalente à consulta da tabela principal na coluna col1.

Incorporando scripts personalizados

Enquanto uma subconsulta remodela os dados usando apenas o HiveQL, um script incorporado entrega as linhas para um código escrito fora do Hive.

O Hive permite escrever scripts específicos para atender aos requisitos do cliente. Os usuários podem escrever seus próprios scripts de mapeamento e redução para esses requisitos. Esses scripts são chamados de scripts personalizados incorporados. A lógica de codificação é definida no script personalizado, e podemos usar esse script durante o processo de ETL.

Quando optar por scripts incorporados:

  • Onde os requisitos específicos do cliente exigem que os desenvolvedores escrevam e implementem scripts no Hive.
  • Onde as funções integradas do Hive não funcionarão para requisitos de domínio específicos

Para isso, o Hive utiliza a cláusula TRANSFORM para incorporar os scripts de mapeamento e de redução.

Nesses scripts personalizados incorporados, devemos observar os seguintes pontos:

  • As colunas serão transformadas em strings e delimitadas por TAB antes de serem passadas para o script do usuário.
  • A saída padrão do script do usuário será tratada como colunas de strings separadas por tabulação.

Exemplo de script incorporado:

FROM (
	FROM pv_users
	MAP pv_users.userid, pv_users.date
	USING 'map_script'
	AS dt, uid
	CLUSTER BY dt) map_output

INSERT OVERWRITE TABLE pv_users_reduced
	REDUCE map_output.dt, map_output.uid
	USING 'reduce_script'
	AS date, count;

A partir do roteiro acima, podemos observar o seguinte. Este é apenas um roteiro de exemplo para fins de compreensão.

  • pv_users é a tabela de usuários, que possui campos como userid e date, conforme mencionado em map_script.
  • O script de redução é definido com base na data e na contagem da tabela pv_users.

Perguntas Frequentes

Historicamente, não. A partir do Hive 2.2.0, expressões complexas são permitidas na cláusula ON (HIVE-15211), portanto, condições de desigualdade e de intervalo funcionam. Em versões anteriores, a cláusula ON deve ser um teste de igualdade e qualquer outro predicado deve estar dentro da cláusula WHERE.

Uma junção de mapa carrega a tabela menor na memória e ignora completamente a etapa de redução. O Hive a seleciona automaticamente quando `hive.auto.convert.join` é verdadeiro e a tabela atende ao limite de tamanho configurado, o que torna as junções de tabelas pequenas para grandes muito mais rápidas.

A função retorna as linhas da tabela da esquerda que possuem pelo menos uma correspondência na tabela da direita, sem duplicá-las e sem retornar as colunas do lado direito. A tabela da direita só pode ser referenciada na cláusula ON, não nas cláusulas SELECT ou WHERE.

Em parte. A partir do Hive 0.13, os operadores IN, NOT IN, EXISTS e NOT EXISTS aceitam subconsultas na cláusula WHERE, incluindo consultas correlacionadas. Restrições permanecem, portanto, uma correlação não suportada geralmente é reescrita como uma junção (JOIN).

A consulta interna se torna uma tabela derivada, e cada tabela precisa de um nome antes que suas colunas possam ser referenciadas. É por isso que o exemplo termina com t2 após o colchete de fechamento; omitir o alias gera um erro de análise sintática.

Quando uma chave de junção detém uma parcela desproporcional de linhas, um único redutor recebe a maior parte do trabalho, enquanto outros ficam ociosos. Configurar `hive.optimize.skewjoin`, ou dividir a chave pesada e unir os resultados, distribui a carga.

Os assistentes de aprendizado de máquina leem o plano EXPLAIN e sinalizam causas comuns, como um filtro de partição ausente, uma junção de mapa não convertida ou uma chave distorcida. Considere a sugestão como um ponto de partida e confirme-a com o plano e o tempo de execução real.

Ele descreve bem os padrões de junção e subconsulta padrão a partir de um breve comentário. Verifique qualquer informação específica do mecanismo de busca, pois ele a incorpora facilmente. Spark Sintaxe SQL ou Presto, e o Hive rejeita construções como uma tabela derivada sem alias.

Resuma esta postagem com: