Escolar Documentos
Profissional Documentos
Cultura Documentos
❖ Análise de dados
▪ Hive
▪ Impala
▪ Presto
▪ Spark
Análise HIVE
❖ Apache hive
▪ Criado pelo facebook em 2007
Processamento lento para consultas diárias
Moveram o DataWarehouse para o Hadoop
Criar tarefas MapReduce consumia tempo
▪ Ferramenta para permitir fácil acesso aos dados via SQL
❖ DataWarehouse construído em cima do Hadoop
❖ Camada de acesso a dados armazenados no HDFS
❖ Não é um SGBD
▪ Criar tabelas no HIVE
▪ Dados são armazenadas no HDFS
❖ Realizar consultas em grandes volumes de dados
▪ Recursos avançados de particionamento
Subdividir os dados
▪ Organizar através de colunas
▪ Não é usada para fornecer respostas em tempo real (Impala)
Componentes do HIVE
❖ HCatalog
▪ Camada de gerenciamento de armazenamento para o Hadoop
▪ Permite que usuários com diferentes ferramentas de processamento de dados
leiam e gravem os dados
❖ WebHCat
▪ Servidor para se conectar com o Metastore Hive
❖ HiveServer2(HS2)
▪ Serviço que permite aos clientes executar consultas no Hive
❖ Metastore
▪ Todos os metadados das tabelas e partições do Hive são acessados através do Hive
Metastore
▪ Existem diferentes maneiras de configurar o servidor metastore
Embedded Metastore
Local Metastore
Remote Metastore
❖ Beeline
▪ Cliente Hive
▪ Faz uso do JDBC para se conectar ao HiveServer2
Estrutura dos Dados
❖ Não existe um formato Hive
❖ Conector para vários formatos
▪ Arquivos de texto com valores separados por vírgula e tabulação (CSV/TSV)
▪ Parquet
▪ ORC
▪ AVRO
▪ JSONFILE
▪ OUTROS...
❖ Dados Estruturados e semi-estruturados
❖ Hierarquia dos dados
▪ Database
Table
▪ Partition – Coluna de armazenamento dos dados no sistema de
arquivo (diretórios)
Bucket – Dados são divididos em uma coluna através de
Hash
Exemplo de caminho
/user/hive/waarehouse/banco.db/tabela/data=010119/000000_0
Linguagem HIVE
❖ Hive Query Language
❖ HiveQL
❖ HQL
▪ Instruções SQL são transformadas internamente em Jobs MapReduce
❖ INT
❖ SMALLINTE
❖ TINYINT
❖ BIGINT
❖ BOOLEAN
❖ FLOAT
❖ DOUBLE
❖ DECIMAL
❖ STRING
❖ VARCHAR
❖ CHAR
❖ ARRAY
▪ Lista de Elementos[‘Seg’,’Ter’,’Quar’,’Qui’, ‘Sex’]
❖ MAP
▪ Tipo Chave-valor ‘nome’ -> ‘Rodrigo’
❖ STRUCT
▪ Define os campos dos seus tipos de dados
▪ STRUCT <col_name
:data_type, ...
❖ UNION
▪ Armazenar diferentes tipos de dados no mesmo local de memória
▪ UNIONTYPE<data_type,
Data_type,...>
❖ Definir delimitadores
▪ Row format delimited
▪ Fields terminated by ‘<delimitador>’
▪ Lines terminated by ‘<delimitador>’
▪ Delimitadores: ‘qualquer coisa’, \b (backspace), \n (newline), \t (tab)
❖ Pular um número de linhas de leitura do arquivo
▪ Tblproperties(“skip.header.line.count” = “<número de linhas>”);
❖ Definir localização dos dados (tabela externa)
➢ Location ' /user/Cloudera/data/client';
Id int,
Name String,
Age inte )
Stored as textfile
Location ‘/user/Cloudera/data/client’
Beeline --help
Correção
Manipulação de Dados
Inserir e carregar dados
Inserção de dados
❖ Inserir dados
▪ Insert into table <nomeTabela> partition(<partition>=’<value>’)
values(<campo>,<value>),(<campo>,<value>),(<campo>,<value>);
❖ Ex
▪ Insert into users values(10,’Rodrigo’),(11,’Augusto’);
▪ Insert into users partition(data=now()) values(10,’Rodrigo’), (11,’Augusto’);
▪ Insert into users select * from cliente;
Carregamento Dados
Seleção de Dados
❖ Ex
▪ Hive>select*from cliente Where state=sp group by city having population >100
order by limit 10;
Tipos de join
View Consulta
❖ Salvar consultas
❖ Tratar como tabelas
❖ Objetos lógicos
▪ Esquema é fixo quando criado a View
▪ Alterar tabela não altera a View
❖ Comando
▪ Create view <nomeView> as select * from nome_table;
CORREÇÃO
C:\Users\laish\Desktop\Semantix\docker-bigdata>docker exec -it hive-server bash
root@hive_server:/opt# beeline -u jdbc:hive2://localhost:10000
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hive/lib/log4j-slf4j-impl-
2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop-2.7.4/share/hadoop/common/lib/slf4j-log4j12-
1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Connecting to jdbc:hive2://localhost:10000
Connected to: Apache Hive (version 2.3.2)
Driver: Hive JDBC (version 2.3.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 2.3.2 by Apache Hive
0: jdbc:hive2://localhost:10000> show databases;
+----------------+
| database_name |
+----------------+
| default |
| teste |
+----------------+
2 rows selected (0.114 seconds)
0: jdbc:hive2://localhost:10000> use teste;
No rows affected (0.021 seconds)
0: jdbc:hive2://localhost:10000> show tables;
+-----------+
| tab_name |
+-----------+
| pop |
+-----------+
1 row selected (0.03 seconds)
0: jdbc:hive2://localhost:10000> desc pop;
Mostra a tabela
Tabela Particionada
❖ Tabela não particionada
▪ Consultas precisam varrer todos os arquivos no diretório
Processo lento para big table
❖ Tabela particionada
▪ Consultas podem varrer os arquivos de uma partição
Campo com registros duplicados(grupos)
▪ Estado, gênero, categoria, classe, etc...
▪ Fatias horizontais de dados separadas por partes
▪
❖ Definir parâmetros na criação da tabela
▪ Partição
Um campo q1ue não está na estrutura da tabela
Organizar os dados
Consultas SQL interpretarão como coluna
▪ Select * from user Where cidade =sp
Comando
▪ Partitioned by (<campo><type>)
▪ Buket
Quantidade que os dados serão divididos
Campo precisa estar na estrutura da tabela
Comando
▪ Clustered by (<campo>) into <qtd> buckets
Tipos de Particionamento
Particionamento Estático
❖ Você pode inserir os arquivos individualmente em uma tabela de partição
❖ Criar novas partições manualmente
❖ Comando
▪ Hive> alter table <nomeTabela> add partition (<partição> =’<valor>’);
❖ Ex.
▪ Criar uma partição para cada dia
▪ Hive> alter table logs add partition (data=’2019-21-02’);
❖ Particionamento dinâmico
❖ Partições são criadas automaticamente nos tempos de carregamento
❖ Novas partições podem ser criadas dinamicamente
▪ Baseada no valor da última coluna
Se a partição não existir, ela será criada
Se existir, os dados serão adicionados na partição
▪ Ex
Hive> insert overwrite table user_cidade partition (cidade) select *from
user;
❖ Por padrão, o particionamento dinâmico está desativado, para ativar
▪ Set hive.exec.dynamic.partition=true;
▪ Set hive.exec.dynamic.partition.mode=nonstrict;
Reparar a tabela
❖ Reparar partições na tabela Hive
▪ Quando a tabela não encontra a partição
▪ Sincronizar a tabela com o metastore
❖ Comando
▪ Msck repair table <nomeTabela>
Exercicios
1. Criar o diretório “/user/aluno/<nome>/data/nascimento” no HDFS
2. Criar e usar o Banco de dados <nome>
3. Criar uma tabela externa no Hive com os parâmetros:
a) Tabela: nascimento
b) Campos: nome (String), sexo (String) e frequencia (int)
c) Partição: ano
d) Delimitadores:
i) Campo ‘,’
ii) Linha ‘\n’
e) Salvar
i) Tipo do arquivo: texto
ii) HDFS: '/user/aluno/<nome>/data/nascimento’
4.Adicionar partição ano=2015
5.Enviar o arquivo local “input/exercises-data/names/yob2015.txt” para o HDFS no diretório
/user/aluno/<nome>/data/nascimento/ano=2015
6.Selecionar os 10 primeiros registros da tabela nascimento no Hive
7.Repita o processo do 4 ao 6 para os anos de 2016 e 2017.
8. Clicar no botão de Enviar Tarefa, e enviar o texto: ok
Correção
Não precisa acessar o HDFS através do bash podemos consultar através do seguinte comando
Criar o database
create external table lais.nascimento(nome string, sexo string, frequencia int ) partitioned by
(ano int) row format delimited fields terminated by ',' lines terminated by '\n' stored as textfile
location '/user/laish/semantix/data/nascimento';
Adicionar partição
Listar
Listar os diretórios
ls /input/exercises-data/names
Inpath load data inpath '/user/laish/semantix /data/populacao' overwrite into table pop;
AULA 6
Exercício de Seleção de Tabelas Particionadas
1. Selecionar os 10 primeiros registros da tabela nascimento pelo ano de 2016
2. Contar a quantidade de nomes de crianças nascidas em 2017
3. Contar a quantidade de crianças nascidas em 2017
4. Contar a quantidade de crianças nascidas por sexo no ano de 2015
5. Mostrar por ordem de ano decrescente a quantidade de crianças nascidas por
sexo
6. Mostrar por ordem de ano decrescente a quantidade de crianças nascidas por
sexo com o nome iniciado com ‘A’
7. Qual nome e quantidade das 5 crianças mais nascidas em 2016
8. Qual nome e quantidade das 5 crianças mais nascidas em 2016 do sexo
masculino e feminino
9. Clicar no botão de Enviar Tarefa, e enviar o texto: ok
Correção
repostas
1. Selecionar os 10 primeiros registros da tabela nascimento pelo ano de 2016
select sexo, sum(frequencia) as qtd from nascimento where ano=2015 group by sexo;
5. Mostrar por ordem de ano decrescente a quantidade de crianças nascidas por sexo
select ano, sexo, sum(frequencia) as qtd from nascimento group by ano, sexo ordem by amo
desc;
6. Mostrar por ordem de ano decrescente a quantidade de crianças nascidas por sexo com o
nome iniciado com ‘A’
select ano, sexo, sum(frequencia) as qtd from nascimento where nome like 'A%' group by ano,
sexo order by ano desc;
select nome, max(frequencia) as qtd from nascimento where ano=2016 group by nome order
by qtd desc limit 5;
8. Qual nome e quantidade das 5 crianças mais nascidas em 2016 do sexo masculino e
feminino
select nome, max(frequencia) as qtd, sexo from nascimento where ano=2016 group by nome,
sexo order by qtd desc limit 5;
Resposta do amiguinho
Minha resposta:
select nome, frequencia from nascimento where ano=2016 order by frequencia desc limit 5;
. Qual nome e quantidade das 5 crianças mais nascidas em 2016 do sexo masculino e feminino
Minha resposta:
select nome, frequencia, sexo from nascimento where ano=2016 order by frequencia desc
limit 5;
❖ Fomatos de arquivo
▪ Text File
▪ Sequence File
▪ RC File
▪ ORC File
▪ Avro
▪ Parquet
Text File
❖ Arquivos de texto
❖ Fomato padrão
▪ HIVE
▪ SQOOP
❖ Facilidade para compartilhar os dados do Hadoop com outros sistemas externos
❖ Facilidade de edição manualmente
❖ Menos eficiente que outros Formatos
❖ Ex.
▪ txt
▪ csv
▪ Estrutura de texto
xml
json
Sequence File
❖ Arquivo de sequência do Hadoop
❖ Formado por pares chave e valor
❖ Armazena em formato binário
❖ Mais eficiente que o arquivo de texto
❖ Facilidade para compartilhar os dados com outras ferramentas do Hadoop
RC-file
❖ Record Colunnar File
❖ 1º formato de arquivo colunar do Hadoop
▪ Formado pro grupos de colunas
❖ Armazenamento horizontal dos dados
❖ Vantagem
▪ Agilidade para carregamento de dados
▪ Agilidade para processamento de consultas
▪ Espaço de armazenamento eficiente
❖ Desvantagem
▪ Utiliza mais memória e computação
▪ Não suporta a evolução do esquema
ORC FILE
❖ Optimized Row Colunnar File
❖ Substituiu o formato RC File
▪ Mesmas características
❖ Compacta melhor os arquivos RC
▪ Consultas mais rápidas
❖ Projetado para otimizar o desempenho no Hive
▪ Formado por faixas
Grupo de dados de linha
❖ Não usado para MapReduce não Hive
▪ Pig
▪ Impala
▪ Java
AVRO
❖ Formado por serialização de dados com neutralidade de linguagem
❖ Armazenamento dos dados e metadados juntos
❖ Vantagem
▪ Suporta MapReduce
▪ Suporta evolução do esquema
PARQUET
❖ Fomato colunar
▪ Formado por grupos de colunas
❖ Vantagem
▪ Suporta MapReduce
Pig
Hive
Java
▪ Processamento
Impala
Spark
▪ Suporta evolução do esquema
Hive
Impala
Compressão de dados
❖ Armazenamento x Velocidade de leitura
❖ ZLIB (GZip)
▪ Alta compressão, lento
❖ Snappy
▪ Baixa compressão, rápido
EX Criação de tabela
Tabela com partição e compressão
Id int,
Name string,
Age int
3. Criar a tabela pop_parquet no formato parquet para ler os dados da tabela pop
7. Criar a tabela pop_parquet_snappy no formato parquet com compressão Snappy para ler os
dados da tabela pop
3. Criar a tabela pop_parquet no formato parquet para ler os dados da tabela pop
zip_code int,
total_population int,
median_age float,
total_males int,
total_females int,
total_households int,
average_household_size float
) Stored as parquet;
7. Criar a tabela pop_parquet_snappy no formato parquet com compressão Snappy para ler os
dados da tabela pop
zip_code int,
total_population int,
median_age float,
total_males int,
total_females int,
total_households int,
average_household_size float
) Stored as parquet
Tblproperties(‘parquet.compress’=’SNAPPY’);