Apache Tajo - Instruções SQL
No capítulo anterior, você entendeu como criar tabelas no Tajo. Este capítulo explica sobre a instrução SQL no Tajo.
Criar declaração de tabela
Antes de começar a criar uma tabela, crie um arquivo de texto “students.csv” no caminho do diretório de instalação do Tajo da seguinte maneira -
students.csv
Eu iria | Nome | Endereço | Era | Marcas |
---|---|---|---|---|
1 | Adão | 23 New Street | 21 | 90 |
2 | Amit | 12 Old Street | 13 | 95 |
3 | Prumo | 10 Cross Street | 12 | 80 |
4 | David | 15 Express Avenue | 12 | 85 |
5 | Esha | 20 Garden Street | 13 | 50 |
6 | Ganga | 25 North Street | 12 | 55 |
7 | Jack | 2 Park Street | 12 | 60 |
8 | Leena | 24 South Street | 12 | 70 |
9 | Maria | 5 West Street | 12 | 75 |
10 | Peter | 16 Park Avenue | 12 | 95 |
Após a criação do arquivo, vá para o terminal e inicie o servidor Tajo e o shell, um por um.
Criar banco de dados
Crie um novo banco de dados usando o seguinte comando -
Inquerir
default> create database sampledb;
OK
Conecte-se ao banco de dados “sampledb” que agora foi criado.
default> \c sampledb
You are now connected to database "sampledb" as user “user1”.
Em seguida, crie uma tabela em “sampledb” da seguinte forma -
Inquerir
sampledb> create external table mytable(id int,name text,address text,age int,mark int)
using text with('text.delimiter' = ',') location ‘file:/Users/workspace/Tajo/students.csv’;
Resultado
A consulta acima irá gerar o seguinte resultado.
OK
Aqui, a tabela externa é criada. Agora, você só precisa inserir a localização do arquivo. Se você tiver que atribuir a tabela de hdfs, use hdfs em vez de arquivo.
A seguir, o “students.csv”arquivo contém valores separados por vírgula. otext.delimiter campo é atribuído com ','.
Agora você criou “mytable” com sucesso em “sampledb”.
Mostrar mesa
Para mostrar tabelas no Tajo, use a seguinte consulta.
Inquerir
sampledb> \d
mytable
sampledb> \d mytable
Resultado
A consulta acima irá gerar o seguinte resultado.
table name: sampledb.mytable
table uri: file:/Users/workspace/Tajo/students.csv
store type: TEXT
number of rows: unknown
volume: 261 B
Options:
'timezone' = 'Asia/Kolkata'
'text.null' = '\\N'
'text.delimiter' = ','
schema:
id INT4
name TEXT
address TEXT
age INT4
mark INT4
Tabela de lista
Para buscar todos os registros da tabela, digite a seguinte consulta -
Inquerir
sampledb> select * from mytable;
Resultado
A consulta acima irá gerar o seguinte resultado.
Inserir declaração de tabela
Tajo usa a seguinte sintaxe para inserir registros na tabela.
Sintaxe
create table table1 (col1 int8, col2 text, col3 text);
--schema should be same for target table schema
Insert overwrite into table1 select * from table2;
(or)
Insert overwrite into LOCATION '/dir/subdir' select * from table;
A declaração de inserção de Tajo é semelhante ao INSERT INTO SELECT declaração de SQL.
Inquerir
Vamos criar uma tabela para sobrescrever os dados da tabela de uma tabela existente.
sampledb> create table test(sno int,name text,addr text,age int,mark int);
OK
sampledb> \d
Resultado
A consulta acima irá gerar o seguinte resultado.
mytable
test
Inserir registros
Para inserir registros na tabela “teste”, digite a seguinte consulta.
Inquerir
sampledb> insert overwrite into test select * from mytable;
Resultado
A consulta acima irá gerar o seguinte resultado.
Progress: 100%, response time: 0.518 sec
Aqui, os registros “mytable” substituem a tabela “test”. Se você não quiser criar a tabela “test”, atribua imediatamente o local do caminho físico, conforme mencionado em uma opção alternativa para inserir consulta.
Obter registros
Use a seguinte consulta para listar todos os registros na tabela de “teste” -
Inquerir
sampledb> select * from test;
Resultado
A consulta acima irá gerar o seguinte resultado.
Esta instrução é usada para adicionar, remover ou modificar colunas de uma tabela existente.
Para renomear a tabela, use a seguinte sintaxe -
Alter table table1 RENAME TO table2;
Inquerir
sampledb> alter table test rename to students;
Resultado
A consulta acima irá gerar o seguinte resultado.
OK
Para verificar o nome da tabela alterado, use a seguinte consulta.
sampledb> \d
mytable
students
Agora a tabela “teste” é alterada para tabela “alunos”.
Adicionar coluna
Para inserir uma nova coluna na tabela “alunos”, digite a seguinte sintaxe -
Alter table <table_name> ADD COLUMN <column_name> <data_type>
Inquerir
sampledb> alter table students add column grade text;
Resultado
A consulta acima irá gerar o seguinte resultado.
OK
Definir propriedade
Esta propriedade é usada para alterar a propriedade da tabela.
Inquerir
sampledb> ALTER TABLE students SET PROPERTY 'compression.type' = 'RECORD',
'compression.codec' = 'org.apache.hadoop.io.compress.Snappy Codec' ;
OK
Aqui, o tipo de compressão e as propriedades do codec são atribuídos.
Para alterar a propriedade do delimitador de texto, use o seguinte -
Inquerir
ALTER TABLE students SET PROPERTY ‘text.delimiter'=',';
OK
Resultado
A consulta acima irá gerar o seguinte resultado.
sampledb> \d students
table name: sampledb.students
table uri: file:/tmp/tajo-user1/warehouse/sampledb/students
store type: TEXT
number of rows: 10
volume: 228 B
Options:
'compression.type' = 'RECORD'
'timezone' = 'Asia/Kolkata'
'text.null' = '\\N'
'compression.codec' = 'org.apache.hadoop.io.compress.SnappyCodec'
'text.delimiter' = ','
schema:
id INT4
name TEXT
addr TEXT
age INT4
mark INT4
grade TEXT
O resultado acima mostra que as propriedades da tabela são alteradas através da propriedade “SET”.
Selecionar declaração
A instrução SELECT é usada para selecionar dados de um banco de dados.
A sintaxe para a instrução Select é a seguinte -
SELECT [distinct [all]] * | <expression> [[AS] <alias>] [, ...]
[FROM <table reference> [[AS] <table alias name>] [, ...]]
[WHERE <condition>]
[GROUP BY <expression> [, ...]]
[HAVING <condition>]
[ORDER BY <expression> [ASC|DESC] [NULLS (FIRST|LAST)] [, …]]
Cláusula Where
A cláusula Where é usada para filtrar registros da tabela.
Inquerir
sampledb> select * from mytable where id > 5;
Resultado
A consulta acima irá gerar o seguinte resultado.
A consulta retorna os registros dos alunos cujo id é maior que 5.
Inquerir
sampledb> select * from mytable where name = ‘Peter’;
Resultado
A consulta acima irá gerar o seguinte resultado.
Progress: 100%, response time: 0.117 sec
id, name, address, age
-------------------------------
10, Peter, 16 park avenue , 12
O resultado filtra apenas os registros de Peter.
Cláusula Distinta
Uma coluna da tabela pode conter valores duplicados. A palavra-chave DISTINCT pode ser usada para retornar apenas valores distintos (diferentes).
Sintaxe
SELECT DISTINCT column1,column2 FROM table_name;
Inquerir
sampledb> select distinct age from mytable;
Resultado
A consulta acima irá gerar o seguinte resultado.
Progress: 100%, response time: 0.216 sec
age
-------------------------------
13
12
A consulta retorna a idade distinta dos alunos de mytable.
Grupo por cláusula
A cláusula GROUP BY é usada em colaboração com a instrução SELECT para organizar dados idênticos em grupos.
Sintaxe
SELECT column1, column2 FROM table_name WHERE [ conditions ] GROUP BY column1, column2;
Inquerir
select age,sum(mark) as sumofmarks from mytable group by age;
Resultado
A consulta acima irá gerar o seguinte resultado.
age, sumofmarks
-------------------------------
13, 145
12, 610
Aqui, a coluna “mytable” tem dois tipos de idades - 12 e 13. Agora a consulta agrupa os registros por idade e produz a soma das notas para as idades correspondentes dos alunos.
Ter Cláusula
A cláusula HAVING permite que você especifique as condições que filtram quais resultados do grupo aparecem nos resultados finais. A cláusula WHERE coloca condições nas colunas selecionadas, enquanto a cláusula HAVING coloca condições nos grupos criados pela cláusula GROUP BY.
Sintaxe
SELECT column1, column2 FROM table1 GROUP BY column HAVING [ conditions ]
Inquerir
sampledb> select age from mytable group by age having sum(mark) > 200;
Resultado
A consulta acima irá gerar o seguinte resultado.
age
-------------------------------
12
A consulta agrupa os registros por idade e retorna a idade quando a soma do resultado da condição (marca)> 200.
Ordem por cláusula
A cláusula ORDER BY é usada para classificar os dados em ordem crescente ou decrescente, com base em uma ou mais colunas. O banco de dados Tajo classifica os resultados da consulta em ordem crescente por padrão.
Sintaxe
SELECT column-list FROM table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];
Inquerir
sampledb> select * from mytable where mark > 60 order by name desc;
Resultado
A consulta acima irá gerar o seguinte resultado.
A consulta retorna os nomes dos alunos em ordem decrescente cujas notas são maiores que 60.
Criar declaração de índice
A instrução CREATE INDEX é usada para criar índices em tabelas. O índice é usado para recuperação rápida de dados. A versão atual suporta o índice apenas para formatos de texto simples armazenados em HDFS.
Sintaxe
CREATE INDEX [ name ] ON table_name ( { column_name | ( expression ) }
Inquerir
create index student_index on mytable(id);
Resultado
A consulta acima irá gerar o seguinte resultado.
id
———————————————
Para visualizar o índice atribuído à coluna, digite a seguinte consulta.
default> \d mytable
table name: default.mytable
table uri: file:/Users/deiva/workspace/Tajo/students.csv
store type: TEXT
number of rows: unknown
volume: 307 B
Options:
'timezone' = 'Asia/Kolkata'
'text.null' = '\\N'
'text.delimiter' = ','
schema:
id INT4
name TEXT
address TEXT
age INT4
mark INT4
Indexes:
"student_index" TWO_LEVEL_BIN_TREE (id ASC NULLS LAST )
Aqui, o método TWO_LEVEL_BIN_TREE é usado por padrão no Tajo.
Declaração de abandono de mesa
A instrução Eliminar Tabela é usada para eliminar uma tabela do banco de dados.
Sintaxe
drop table table name;
Inquerir
sampledb> drop table mytable;
Para verificar se a tabela foi eliminada da tabela, digite a seguinte consulta.
sampledb> \d mytable;
Resultado
A consulta acima irá gerar o seguinte resultado.
ERROR: relation 'mytable' does not exist
Você também pode verificar a consulta usando o comando “\ d” para listar as tabelas Tajo disponíveis.