Apache Tajo - Guia rápido

Sistema de Data Warehouse Distribuído

O data warehouse é um banco de dados relacional projetado para consulta e análise, e não para processamento de transações. É uma coleção de dados orientada para o assunto, integrada, variável no tempo e não volátil. Esses dados ajudam os analistas a tomar decisões informadas em uma organização, mas os volumes de dados relacionais aumentam dia a dia.

Para superar os desafios, o sistema de data warehouse distribuído compartilha dados em vários repositórios de dados para fins de processamento analítico online (OLAP). Cada data warehouse pode pertencer a uma ou mais organizações. Ele executa balanceamento de carga e escalabilidade. Os metadados são replicados e distribuídos centralmente.

Apache Tajo é um sistema de data warehouse distribuído que usa o Hadoop Distributed File System (HDFS) como a camada de armazenamento e tem seu próprio mecanismo de execução de consulta em vez da estrutura MapReduce.

Visão geral do SQL no Hadoop

Hadoop é uma estrutura de código aberto que permite armazenar e processar big data em um ambiente distribuído. É extremamente rápido e poderoso. No entanto, o Hadoop tem recursos de consulta limitados, portanto, seu desempenho pode ser ainda melhor com a ajuda do SQL no Hadoop. Isso permite que os usuários interajam com o Hadoop por meio de comandos SQL fáceis.

Alguns dos exemplos de SQL em aplicativos Hadoop são Hive, Impala, Drill, Presto, Spark, HAWQ e Apache Tajo.

O que é Apache Tajo

Apache Tajo é uma estrutura de processamento de dados distribuída e relacional. Ele foi projetado para baixa latência e análise de consulta ad-hoc escalonável.

  • Tajo suporta SQL padrão e vários formatos de dados. A maioria das consultas Tajo podem ser executadas sem qualquer modificação.

  • Tajo tem fault-tolerance por meio de um mecanismo de reinicialização para tarefas com falha e mecanismo de regravação de consulta extensível.

  • Tajo realiza o necessário ETL (Extract Transform and Load process)operações para resumir grandes conjuntos de dados armazenados no HDFS. É uma escolha alternativa para Hive / Pig.

A última versão do Tajo tem maior conectividade com programas Java e bancos de dados de terceiros, como Oracle e PostGreSQL.

Características do Apache Tajo

Apache Tajo tem os seguintes recursos -

  • Escalabilidade superior e desempenho otimizado
  • Baixa latência
  • Funções definidas pelo usuário
  • Estrutura de processamento de armazenamento em linha / colunar.
  • Compatibilidade com HiveQL e Hive MetaStore
  • Fluxo de dados simples e fácil manutenção.

Benefícios do Apache Tajo

Apache Tajo oferece os seguintes benefícios -

  • Fácil de usar
  • Arquitetura simplificada
  • Otimização de consulta baseada em custos
  • Plano de execução de consulta vetorizado
  • Entrega rápida
  • Mecanismo de E / S simples e suporta vários tipos de armazenamento.
  • Tolerância ao erro

Casos de uso do Apache Tajo

A seguir estão alguns dos casos de uso do Apache Tajo -

Armazenamento e análise de dados

A empresa coreana SK Telecom executou o Tajo com 1,7 terabytes de dados e descobriu que poderia completar consultas com maior velocidade do que o Hive ou o Impala.

Descoberta de dados

O serviço de streaming de música coreano Melon usa Tajo para processamento analítico. O Tajo executa tarefas ETL (processo de extração-transformação-carregamento) 1,5 a 10 vezes mais rápido do que o Hive.

Análise de log

Bluehole Studio, uma empresa com sede na Coréia desenvolveu TERA - um jogo online multiplayer de fantasia. A empresa usa o Tajo para análise de registro de jogos e localização das principais causas de interrupções na qualidade do serviço.

Armazenamento e formatos de dados

Apache Tajo suporta os seguintes formatos de dados -

  • JSON
  • Arquivo de texto (CSV)
  • Parquet
  • Arquivo de Sequência
  • AVRO
  • Buffer de protocolo
  • Apache Orc

Tajo suporta os seguintes formatos de armazenamento -

  • HDFS
  • JDBC
  • Amazon S3
  • Apache HBase
  • Elasticsearch

A ilustração a seguir descreve a arquitetura do Apache Tajo.

A tabela a seguir descreve cada um dos componentes em detalhes.

S.No. Descrição do componente
1

Client

Client envia as instruções SQL ao Tajo Master para obter o resultado.

2

Master

Master é o daemon principal. É responsável pelo planejamento da consulta e coordenador dos trabalhadores.

3

Catalog server

Mantém as descrições da tabela e do índice. Ele está embutido no daemon Master. O servidor de catálogos usa Apache Derby como a camada de armazenamento e se conecta via cliente JDBC.

4

Worker

O nó mestre atribui tarefas aos nós de trabalho. TajoWorker processa dados. Conforme o número de TajoWorkers aumenta, a capacidade de processamento também aumenta linearmente.

5

Query Master

O mestre tajo atribui a consulta ao mestre de consultas. O Query Master é responsável por controlar um plano de execução distribuído. Ele inicia o TaskRunner e agenda tarefas para o TaskRunner. A principal função do mestre de consultas é monitorar as tarefas em execução e relatá-las ao nó mestre.

6

Node Managers

Gerencia o recurso do nó de trabalho. Ele decide sobre a alocação de solicitações ao nó.

7

TaskRunner

Atua como um mecanismo de execução de consulta local. É usado para executar e monitorar o processo de consulta. O TaskRunner processa uma tarefa por vez.

Tem os seguintes três atributos principais -

  • Plano lógico - um bloco de execução que criou a tarefa.
  • Um fragmento - um caminho de entrada, um intervalo de deslocamento e um esquema.
  • Busca URIs
8

Query Executor

É usado para executar uma consulta.

9

Storage service

Conecta o armazenamento de dados subjacente ao Tajo.

Fluxo de Trabalho

Tajo usa o Hadoop Distributed File System (HDFS) como a camada de armazenamento e tem seu próprio mecanismo de execução de consulta em vez da estrutura MapReduce. Um cluster Tajo consiste em um nó mestre e vários trabalhadores em nós de cluster.

O mestre é o principal responsável pelo planejamento da consulta e o coordenador dos trabalhadores. O mestre divide uma consulta em pequenas tarefas e atribui aos trabalhadores. Cada trabalhador possui um mecanismo de consulta local que executa um gráfico acíclico direcionado de operadores físicos.

Além disso, o Tajo pode controlar o fluxo de dados distribuídos de forma mais flexível do que o MapReduce e oferece suporte a técnicas de indexação.

A interface baseada na web do Tajo tem os seguintes recursos -

  • Opção para descobrir como as consultas enviadas são planejadas
  • Opção para descobrir como as consultas são distribuídas entre os nós
  • Opção para verificar o status do cluster e dos nós

Para instalar o Apache Tajo, você deve ter o seguinte software em seu sistema -

  • Hadoop versão 2.3 ou superior
  • Java versão 1.7 ou superior
  • Linux ou Mac OS

Vamos agora continuar com os seguintes passos para instalar o Tajo.

Verificando a instalação do Java

Felizmente, você já instalou o Java versão 8 em sua máquina. Agora, você só precisa continuar verificando.

Para verificar, use o seguinte comando -

$ java -version

Se o Java for instalado com sucesso em sua máquina, você poderá ver a versão atual do Java instalado. Se o Java não estiver instalado, siga estas etapas para instalar o Java 8 em sua máquina.

Baixar JDK

Baixe a versão mais recente do JDK visitando o link a seguir e, em seguida, baixe a versão mais recente.

https://www.oracle.com

A última versão é JDK 8u 92 e o arquivo é “jdk-8u92-linux-x64.tar.gz”. Faça download do arquivo em sua máquina. Em seguida, extraia os arquivos e mova-os para um diretório específico. Agora, defina as alternativas Java. Finalmente, o Java é instalado em sua máquina.

Verificando a instalação do Hadoop

Você já instalou Hadoopem seu sistema. Agora, verifique-o usando o seguinte comando -

$ hadoop version

Se tudo estiver bem com sua configuração, você poderá ver a versão do Hadoop. Se o Hadoop não estiver instalado, baixe e instale o Hadoop visitando o seguinte link -https://www.apache.org

Instalação Apache Tajo

O Apache Tajo fornece dois modos de execução - modo local e modo totalmente distribuído. Depois de verificar a instalação do Java e do Hadoop, prossiga com as etapas a seguir para instalar o cluster Tajo em sua máquina. Uma instância Tajo de modo local requer configurações muito fáceis.

Baixe a versão mais recente do Tajo visitando o seguinte link - https://www.apache.org/dyn/closer.cgi/tajo

Agora você pode baixar o arquivo “tajo-0.11.3.tar.gz” de sua máquina.

Extrair arquivo tar

Extraia o arquivo tar usando o seguinte comando -

$ cd opt/ $ tar tajo-0.11.3.tar.gz 
$ cd tajo-0.11.3

Definir Variável de Ambiente

Adicione as seguintes alterações a “conf/tajo-env.sh” Arquivo

$ cd tajo-0.11.3 
$ vi conf/tajo-env.sh
 
# Hadoop home. Required 
export HADOOP_HOME = /Users/path/to/Hadoop/hadoop-2.6.2
 
# The java implementation to use.  Required. 
export JAVA_HOME = /path/to/jdk1.8.0_92.jdk/

Aqui, você deve especificar o caminho Hadoop e Java para “tajo-env.sh”Arquivo. Depois que as alterações forem feitas, salve o arquivo e saia do terminal.

Iniciar servidor Tajo

Para iniciar o servidor Tajo, execute o seguinte comando -

$ bin/start-tajo.sh

Você receberá uma resposta semelhante à seguinte -

Starting single TajoMaster 
starting master, logging to /Users/path/to/Tajo/tajo-0.11.3/bin/../ 
localhost: starting worker, logging to /Users/path/toe/Tajo/tajo-0.11.3/bin/../logs/
 
Tajo master web UI: http://local:26080 
Tajo Client Service: local:26002

Agora, digite o comando “jps” para ver os daemons em execução.

$ jps  
1010 TajoWorker 
1140 Jps 
933 TajoMaster

Lançar Tajo Shell (Tsql)

Para iniciar o cliente shell Tajo, use o seguinte comando -

$ bin/tsql

Você receberá a seguinte saída -

welcome to
   _____ ___  _____ ___ 
  /_  _/ _  |/_  _/   / 
   / // /_| |_/ // / / 
  /_//_/ /_/___/ \__/  0.11.3
  
Try \? for help.

Saia da Tajo Shell

Execute o seguinte comando para sair do Tsql -

default> \q 
bye!

Aqui, o padrão se refere ao catálogo no Tajo.

IU da web

Digite o seguinte URL para iniciar a IU da web do Tajo - http://localhost:26080/

Agora você verá a tela a seguir, que é semelhante à opção ExecuteQuery.

Pare Tajo

Para parar o servidor Tajo, use o seguinte comando -

$ bin/stop-tajo.sh

Você receberá a seguinte resposta -

localhost: stopping worker 
stopping master

A configuração do Tajo é baseada no sistema de configuração do Hadoop. Este capítulo explica as definições de configuração do Tajo em detalhes.

Configurações básicas

Tajo usa os seguintes dois arquivos de configuração -

  • catalog-site.xml - configuração para o servidor de catálogos.
  • tajo-site.xml - configuração para outros módulos Tajo.

Configuração de modo distribuído

A configuração do modo distribuído é executada no Hadoop Distributed File System (HDFS). Vamos seguir as etapas para configurar a configuração do modo distribuído Tajo.

tajo-site.xml

Este arquivo está disponível @ /path/to/tajo/confdiretório e atua como configuração para outros módulos Tajo. Para acessar o Tajo em um modo distribuído, aplique as seguintes alterações a“tajo-site.xml”.

<property> 
   <name>tajo.rootdir</name> 
   <value>hdfs://hostname:port/tajo</value> 
</property>
  
<property> 
   <name>tajo.master.umbilical-rpc.address</name> 
   <value>hostname:26001</value> 
</property> 
 
<property> 
   <name>tajo.master.client-rpc.address</name> 
   <value>hostname:26002</value> 
</property>
  
<property> 
   <name>tajo.catalog.client-rpc.address</name> 
   <value>hostname:26005</value> 
</property>

Configuração do Nó Mestre

Tajo usa HDFS como tipo de armazenamento primário. A configuração é a seguinte e deve ser adicionada ao“tajo-site.xml”.

<property> 
   <name>tajo.rootdir</name> 
   <value>hdfs://namenode_hostname:port/path</value> 
</property>

Configuração do Catálogo

Se você deseja customizar o serviço de catálogo, copie $path/to/Tajo/conf/catalogsite.xml.template para $path/to/Tajo/conf/catalog-site.xml e adicione qualquer uma das configurações a seguir, conforme necessário.

Por exemplo, se você usar “Hive catalog store” para acessar o Tajo, a configuração deve ser como a seguinte -

<property> 
   <name>tajo.catalog.store.class</name> 
   <value>org.apache.tajo.catalog.store.HCatalogStore</value> 
</property>

Se você precisa armazenar MySQL catálogo e, em seguida, aplique as seguintes alterações -

<property> 
   <name>tajo.catalog.store.class</name> 
   <value>org.apache.tajo.catalog.store.MySQLStore</value> 
</property> 

<property> 
   <name>tajo.catalog.jdbc.connection.id</name> 
   <value><mysql user name></value> 
</property>
 
<property> 
   <name>tajo.catalog.jdbc.connection.password</name> 
   <value><mysql user password></value> 
</property>
 
<property> 
   <name>tajo.catalog.jdbc.uri</name> 
   <value>jdbc:mysql://<mysql host name>:<mysql port>/<database name for tajo>
      ?createDatabaseIfNotExist = true</value> 
</property>

Da mesma forma, você pode registrar os outros catálogos suportados pelo Tajo no arquivo de configuração.

Configuração de trabalhador

Por padrão, o TajoWorker armazena dados temporários no sistema de arquivos local. É definido no arquivo “tajo-site.xml” da seguinte forma -

<property> 
   <name>tajo.worker.tmpdir.locations</name> 
   <value>/disk1/tmpdir,/disk2/tmpdir,/disk3/tmpdir</value> 
</property>

Para aumentar a capacidade de execução de tarefas de cada recurso do trabalhador, escolha a seguinte configuração -

<property> 
   <name>tajo.worker.resource.cpu-cores</name> 
   <value>12</value> 
</property>
 
<property> 
   <name>tajo.task.resource.min.memory-mb</name> 
   <value>2000</value> 
</property>
  
<property> 
   <name>tajo.worker.resource.disks</name> 
   <value>4</value> 
</property>

Para fazer o trabalhador Tajo funcionar em um modo dedicado, escolha a seguinte configuração -

<property> 
   <name>tajo.worker.resource.dedicated</name> 
   <value>true</value> 
</property>

Neste capítulo, entenderemos os comandos do Tajo Shell em detalhes.

Para executar os comandos do shell Tajo, você precisa iniciar o servidor Tajo e o shell Tajo usando os seguintes comandos -

Iniciar servidor

$ bin/start-tajo.sh

Iniciar Shell

$ bin/tsql

Os comandos acima agora estão prontos para execução.

Meta Comandos

Vamos agora discutir o Meta Commands. Os meta comandos Tsql começam com uma barra invertida(‘\’).

Comando de ajuda

“\?” O comando é usado para mostrar a opção de ajuda.

Query

default> \?

Result

O de cima \?O comando lista todas as opções básicas de uso no Tajo. Você receberá a seguinte saída -

Lista de banco de dados

Para listar todos os bancos de dados no Tajo, use o seguinte comando -

Query

default> \l

Result

Você receberá a seguinte saída -

information_schema 
default

No momento, não criamos nenhum banco de dados, portanto ele mostra dois bancos de dados Tajo integrados.

Banco de Dados Atual

\c opção é usada para exibir o nome do banco de dados atual.

Query

default> \c

Result

Agora você está conectado ao banco de dados "padrão" como usuário “nome de usuário”.

Listar funções integradas

Para listar todas as funções integradas, digite a consulta da seguinte forma -

Query

default> \df

Result

Você receberá a seguinte saída -

Descrever Função

\df function name - Esta consulta retorna a descrição completa da função fornecida.

Query

default> \df sqrt

Result

Você receberá a seguinte saída -

Sair do Terminal

Para sair do terminal, digite a seguinte consulta -

Query

default> \q

Result

Você receberá a seguinte saída -

bye!

Comandos de Admin

Concha tajo fornece \admin opção de listar todos os recursos de administrador.

Query

default> \admin

Result

Você receberá a seguinte saída -

Informação do Cluster

Para exibir as informações do cluster no Tajo, use a seguinte consulta

Query

default> \admin -cluster

Result

Você receberá a seguinte saída -

Mostrar mestre

A consulta a seguir exibe as informações mestre atuais.

Query

default> \admin -showmasters

Result

localhost

Da mesma forma, você pode tentar outros comandos de administrador.

Variáveis ​​de Sessão

O cliente Tajo se conecta ao Master por meio de uma id de sessão exclusiva. A sessão está ativa até que o cliente seja desconectado ou expire.

O seguinte comando é usado para listar todas as variáveis ​​de sessão.

Query

default> \set

Result

'SESSION_LAST_ACCESS_TIME' = '1470206387146' 
'CURRENT_DATABASE' = 'default' 
‘USERNAME’ = 'user' 
'SESSION_ID' = 'c60c9b20-dfba-404a-822f-182bc95d6c7c' 
'TIMEZONE' = 'Asia/Kolkata' 
'FETCH_ROWNUM' = '200' 
‘COMPRESSED_RESULT_TRANSFER' = 'false'

o \set key val irá definir a variável de sessão chamada key com o valor val. Por exemplo,

Query

default> \set ‘current_database’='default'

Result

usage: \set [[NAME] VALUE]

Aqui, você pode atribuir a chave e o valor no \setcomando. Se você precisar reverter as alterações, use o\unset comando.

Para executar uma consulta em um shell Tajo, abra seu terminal e vá para o diretório instalado do Tajo e digite o seguinte comando -

$ bin/tsql

Agora você verá a resposta conforme mostrado no programa a seguir -

default>

Agora você pode executar suas consultas. Caso contrário, você pode executar suas consultas por meio do aplicativo de console da web para o seguinte URL -http://localhost:26080/

Tipos de dados primitivos

Apache Tajo suporta a seguinte lista de tipos de dados primitivos -

S.No. Tipo de dados e descrição
1

integer

Usado para armazenar o valor inteiro com 4 bytes de armazenamento.

2

tinyint

O valor inteiro minúsculo é 1 byte

3

smallint

Usado para armazenar valores inteiros de 2 bytes de tamanho pequeno.

4

bigint

O valor inteiro de grande alcance tem 8 bytes de armazenamento.

5

boolean

Retorna verdadeiro / falso.

6

real

Usado para armazenar valor real. O tamanho é 4 bytes.

7

float

Valor de precisão de ponto flutuante que possui 4 ou 8 bytes de espaço de armazenamento.

8

double

Valor de precisão de ponto duplo armazenado em 8 bytes.

9

char[(n)]

Valor do personagem.

10

varchar[(n)]

Dados não Unicode de comprimento variável.

11

number

Valores decimais.

12

binary

Valores binários.

13

date

Data do calendário (ano, mês, dia).

Example - DATA '2016-08-22'

14

time

Hora do dia (hora, minuto, segundo, milissegundo) sem fuso horário. Valores desse tipo são analisados ​​e renderizados no fuso horário da sessão.

15

timezone

Hora do dia (hora, minuto, segundo, milissegundo) com um fuso horário. Valores desse tipo são renderizados usando o fuso horário do valor.

Example - TIME '01: 02: 03.456 Asia / kolkata '

16

timestamp

Instantâneo no tempo que inclui a data e a hora do dia sem fuso horário.

Example - TIMESTAMP '2016-08-22 03: 04: 05.321'

17

text

Texto Unicode de comprimento variável.

Os seguintes operadores são usados ​​no Tajo para realizar as operações desejadas.

S.No. Operador e descrição
1 Operadores aritméticos

Presto suporta operadores aritméticos como +, -, *, /,%.

2 Operadores relacionais

<,>, <=,> =, =, <>

3 Operadores lógicos

AND, OR, NOT

4 Operadores de string

O '||' operador executa concatenação de string.

5 Operadores de alcance

O operador de intervalo é usado para testar o valor em um intervalo específico. Tajo suporta os operadores BETWEEN, IS NULL, IS NOT NULL.

A partir de agora, você estava ciente de executar consultas básicas simples no Tajo. Nos próximos capítulos subsequentes, discutiremos as seguintes funções SQL -

  • Funções Matemáticas
  • Funções de String
  • Funções DateTime
  • Funções JSON

As funções matemáticas operam em fórmulas matemáticas. A tabela a seguir descreve a lista de funções em detalhes.

S.No. Descrição da função
1 abs (x)

Retorna o valor absoluto de x.

2 cbrt (x)

Retorna a raiz cúbica de x.

3 ceil (x)

Retorna o valor x arredondado para o número inteiro mais próximo.

4 andar (x)

Retorna x arredondado para o número inteiro mais próximo.

5 pi ()

Retorna o valor de pi. O resultado será retornado como valor duplo.

6 radianos (x)

converte o ângulo x em radianos de graus.

7 graus (x)

Retorna o valor de grau para x.

8 pow (x, p)

Retorna a potência do valor 'p' para o valor x.

9 div (x, y)

Retorna o resultado da divisão para os dois valores inteiros x, y fornecidos.

10 exp (x)

Retorna o número de Euler e elevado à potência de um número.

11 sqrt (x)

Retorna a raiz quadrada de x.

12 sinal (x)

Retorna a função signum de x, ou seja -

  • 0 se o argumento for 0

  • 1 se o argumento for maior que 0

  • 1 se o argumento for menor que 0

13 mod (n, m)

Retorna o módulo (resto) de n dividido por m.

14 rodada (x)

Retorna o valor arredondado para x.

15 cos (x)

Retorna o valor do cosseno (x).

16 asin (x)

Retorna o valor do seno inverso (x).

17 acos (x)

Retorna o valor do cosseno inverso (x).

18 atan (x)

Retorna o valor da tangente inversa (x).

19 atan2 (y, x)

Retorna o valor da tangente inversa (y / x).

Funções de tipo de dados

A tabela a seguir lista as funções de tipo de dados disponíveis no Apache Tajo.

S.No. Descrição da função
1 to_bin (x)

Retorna a representação binária do inteiro.

2 to_char (int, texto)

Converte inteiro em string.

3 to_hex (x)

Converte o valor x em hexadecimal.

A tabela a seguir lista as funções de string no Tajo.

S.No. Descrição da função
1 concat (string1, ..., stringN)

Concatene as strings fornecidas.

2 comprimento (string)

Retorna o comprimento da string fornecida.

3 inferior (corda)

Retorna o formato de minúsculas para a string.

4 superior (corda)

Retorna o formato em maiúsculas para a string fornecida.

5 ascii (texto da string)

Retorna o código ASCII do primeiro caractere do texto.

6 bit_length (texto da string)

Retorna o número de bits em uma string.

7 char_length (texto da string)

Retorna o número de caracteres em uma string.

8 octet_length (texto da string)

Retorna o número de bytes em uma string.

9 resumo (texto de entrada, texto do método)

Calcula o Digesthash de string. Aqui, o segundo método arg refere-se ao método hash.

10 initcap (texto de string)

Converte a primeira letra de cada palavra em maiúsculas.

11 md5 (texto da string)

Calcula o MD5 hash de string.

12 esquerda (texto da string, tamanho interno)

Retorna os primeiros n caracteres da string.

13 direita (texto da string, tamanho interno)

Retorna os últimos n caracteres da string.

14 localizar (texto de origem, texto de destino, start_index)

Retorna a localização da substring especificada.

15 strposb (texto fonte, texto alvo)

Retorna a localização binária da substring especificada.

16 substr (texto de origem, índice inicial, comprimento)

Retorna a substring para o comprimento especificado.

17 trim (texto da string [, texto dos caracteres])

Remove os caracteres (um espaço por padrão) do início / fim / ambas as extremidades da string.

18 split_part (string text, delimiter text, field int)

Divide uma string no delimitador e retorna o campo fornecido (contando a partir de um).

19 regexp_replace (texto de string, texto de padrão, texto de substituição)

Substitui substrings correspondentes a um determinado padrão de expressão regular.

20 reverso (string)

Operação reversa realizada para a string.

Apache Tajo suporta as seguintes funções DateTime.

S.No. Descrição da função
1 add_days (data data ou timestamp, int dia

Retorna a data adicionada pelo valor do dia fornecido.

2 add_months (data data ou timestamp, int mês)

Retorna a data adicionada pelo valor do mês fornecido.

3 data atual()

Retorna a data de hoje.

4 hora atual()

Retorna a hora de hoje.

5 extrair (século da data / carimbo de data / hora)

Extrai o século do parâmetro fornecido.

6 extrair (dia da data / carimbo de hora)

Extrai o dia do parâmetro fornecido.

7 extrair (década a partir da data / carimbo de data / hora)

Extrai a década do parâmetro fornecido.

8 extrair (data / hora do dia de baixa)

Extrai o dia da semana do parâmetro fornecido.

9 extrair (doy de data / carimbo de data / hora)

Extrai o dia do ano do parâmetro fornecido.

10 selecionar extrato (hora do carimbo de data / hora)

Extrai a hora do parâmetro fornecido.

11 selecionar extração (isodow do carimbo de data / hora)

Extrai o dia da semana do parâmetro fornecido. É idêntico ao dow, exceto no domingo. Corresponde à numeração do dia da semana ISO 8601.

12 selecionar extrato (isoyear from date)

Extrai o ano ISO da data especificada. O ano ISO pode ser diferente do ano gregoriano.

13 extrair (microssegundos do tempo)

Extrai microssegundos do parâmetro fornecido. O campo dos segundos, incluindo as partes fracionárias, multiplicado por 1 000 000;

14 extrair (milênio do timestamp)

Extrai milênio do parâmetro fornecido. Um milênio corresponde a 1000 anos. Portanto, o terceiro milênio começou em 1º de janeiro de 2001.

15 extrair (milissegundos a partir do tempo)

Extrai milissegundos do parâmetro fornecido.

16 extrair (minuto do carimbo de data / hora)

Extrai minuto do parâmetro fornecido.

17 extrair (trimestre do carimbo de data / hora)

Extrai o trimestre do ano (1 - 4) do parâmetro fornecido.

18 date_part (texto do campo, data de origem ou carimbo de data / hora ou hora)

Extrai o campo de data do texto.

19 agora()

Retorna o carimbo de data / hora atual.

20 to_char (carimbo de data / hora, formato de texto)

Converte o carimbo de data / hora em texto.

21 to_date (texto src, formato de texto)

Converte o texto em data.

22 to_timestamp (texto src, formato de texto)

Converte texto em carimbo de data / hora.

As funções JSON estão listadas na tabela a seguir -

S.No. Descrição da função
1 json_extract_path_text (js no texto, texto json_path)

Extrai a string JSON de uma string JSON com base no caminho json especificado.

2 json_array_get (texto json_array, índice int4)

Retorna o elemento no índice especificado na matriz JSON.

3 json_array_contains (texto da matriz json_, valor qualquer)

Determine se o valor fornecido existe na matriz JSON.

4 json_array_length (texto json_ar ray)

Retorna o comprimento da matriz json.

Esta seção explica os comandos Tajo DDL. Tajo tem um banco de dados integrado chamadodefault.

Criar declaração de banco de dados

Create Databaseé uma instrução usada para criar um banco de dados no Tajo. A sintaxe para esta declaração é a seguinte -

CREATE DATABASE [IF NOT EXISTS] <database_name>

Inquerir

default> default> create database if not exists test;

Resultado

A consulta acima irá gerar o seguinte resultado.

OK

O banco de dados é o namespace no Tajo. Um banco de dados pode conter várias tabelas com um nome exclusivo.

Mostrar banco de dados atual

Para verificar o nome do banco de dados atual, emita o seguinte comando -

Inquerir

default> \c

Resultado

A consulta acima irá gerar o seguinte resultado.

You are now connected to database "default" as user “user1". 
default>

Conectar ao banco de dados

A partir de agora, você criou um banco de dados denominado “teste”. A seguinte sintaxe é usada para conectar o banco de dados de “teste”.

\c <database name>

Inquerir

default> \c test

Resultado

A consulta acima irá gerar o seguinte resultado.

You are now connected to database "test" as user “user1”. 
test>

Agora você pode ver as mudanças de prompt do banco de dados padrão para o banco de dados de teste.

Drop Database

Para eliminar um banco de dados, use a seguinte sintaxe -

DROP DATABASE <database-name>

Inquerir

test> \c default 
You are now connected to database "default" as user “user1". 
default> drop database test;

Resultado

A consulta acima irá gerar o seguinte resultado.

OK

Uma tabela é uma visão lógica de uma fonte de dados. Ele consiste em um esquema lógico, partições, URL e várias propriedades. Uma tabela Tajo pode ser um diretório no HDFS, um único arquivo, uma tabela HBase ou uma tabela RDBMS.

Tajo suporta os seguintes dois tipos de tabelas -

  • mesa externa
  • mesa interna

Mesa Externa

A tabela externa precisa da propriedade local quando a tabela é criada. Por exemplo, se seus dados já estiverem lá como arquivos Texto / JSON ou tabela HBase, você pode registrá-los como tabela externa Tajo.

A consulta a seguir é um exemplo de criação de tabela externa.

create external table sample(col1 int,col2 text,col3 int) location ‘hdfs://path/to/table';

Aqui,

  • External keyword- Isso é usado para criar uma tabela externa. Isso ajuda a criar uma mesa no local especificado.

  • Amostra refere-se ao nome da tabela.

  • Location- É um diretório para HDFS, Amazon S3, HBase ou sistema de arquivos local. Para atribuir uma propriedade de localização para diretórios, use os exemplos de URI abaixo -

    • HDFS - hdfs: // localhost: porta / caminho / para / tabela

    • Amazon S3 - s3: // nome do intervalo / tabela

    • local file system - arquivo: /// caminho / para / tabela

    • Openstack Swift - swift: // nome do balde / tabela

Propriedades da Tabela

Uma tabela externa possui as seguintes propriedades -

  • TimeZone - Os usuários podem especificar um fuso horário para ler ou escrever uma tabela.

  • Compression format- Usado para tornar o tamanho dos dados compacto. Por exemplo, o arquivo text / json usacompression.codec propriedade.

Mesa Interna

Uma tabela interna também é chamada de Managed Table. Ele é criado em um local físico predefinido chamado Tablespace.

Sintaxe

create table table1(col1 int,col2 text);

Por padrão, o Tajo usa “tajo.warehouse.directory” localizado em “conf / tajo-site.xml”. Para atribuir um novo local para a tabela, você pode usar a configuração do Tablespace.

Tablespace

O espaço de tabela é usado para definir locais no sistema de armazenamento. É compatível apenas com tabelas internas. Você pode acessar os espaços de tabela por seus nomes. Cada espaço de tabela pode usar um tipo de armazenamento diferente. Se você não especificar os espaços de tabela, o Tajo usará o espaço de tabela padrão no diretório raiz.

Configuração de Tablespace

Você tem “conf/tajo-site.xml.template”em Tajo. Copie o arquivo e renomeie-o para“storagesite.json”. Este arquivo funcionará como uma configuração para Tablespaces. Os formatos de dados Tajo usam a seguinte configuração -

Configuração HDFS

$ vi conf/storage-site.json { "spaces": { "${tablespace_name}": {  
         "uri": “hdfs://localhost:9000/path/to/Tajo"  
      } 
   } 
}

Configuração HBase

$ vi conf/storage-site.json { "spaces": { "${tablespace_name}": {  
         "uri": “hbase:zk://quorum1:port,quorum2:port/"  
      } 
   } 
}

Configuração de arquivo de texto

$ vi conf/storage-site.json { "spaces": { "${tablespace_name}": {  
         “uri”: “hdfs://localhost:9000/path/to/Tajo” 
      } 
   } 
}

Criação de Tablespace

Os registros da tabela interna do Tajo podem ser acessados ​​somente de outra tabela. Você pode configurá-lo com o espaço de tabela.

Sintaxe

CREATE TABLE [IF NOT EXISTS] <table_name> [(column_list)] [TABLESPACE tablespace_name] 
[using <storage_type> [with (<key> = <value>, ...)]] [AS <select_statement>]

Aqui,

  • IF NOT EXISTS - Isso evita um erro se a mesma tabela ainda não tiver sido criada.

  • TABLESPACE - Esta cláusula é usada para atribuir o nome do espaço de tabela.

  • Storage type - Os dados Tajo suportam formatos como texto, JSON, HBase, Parquet, Sequencefile e ORC.

  • AS select statement - Selecione registros de outra tabela.

Configurar Tablespace

Inicie seus serviços Hadoop e abra o arquivo “conf/storage-site.json”e adicione as seguintes alterações -

$ vi conf/storage-site.json { 
   "spaces": {  
      “space1”: {  
         "uri": “hdfs://localhost:9000/path/to/Tajo" 
      } 
   } 
}

Aqui, Tajo irá se referir aos dados da localização do HDFS e space1é o nome do espaço de tabela. Se você não iniciar os serviços Hadoop, não poderá registrar o espaço de tabela.

Inquerir

default> create table table1(num1 int,num2 text,num3 float) tablespace space1;

A consulta acima cria uma tabela chamada “tabela1” e “espaço1” refere-se ao nome do espaço de tabela.

Formatos de dados

Tajo suporta formatos de dados. Vamos examinar cada um dos formatos, um por um, em detalhes.

Texto

Um arquivo de texto simples de valores separados por caracteres representa um conjunto de dados tabular que consiste em linhas e colunas. Cada linha é uma linha de texto simples.

Criando mesa

default> create external table customer(id int,name text,address text,age int) 
   using text with('text.delimiter'=',') location ‘file:/Users/workspace/Tajo/customers.csv’;

Aqui, “customers.csv” arquivo refere-se a um arquivo de valor separado por vírgula localizado no diretório de instalação do Tajo.

Para criar uma tabela interna usando formato de texto, use a seguinte consulta -

default> create table customer(id int,name text,address text,age int) using text;

Na consulta acima, você não atribuiu nenhum espaço de tabela, portanto, ele usará o espaço de tabela padrão de Tajo.

Propriedades

Um formato de arquivo de texto tem as seguintes propriedades -

  • text.delimiter- Este é um caractere delimitador. O padrão é '|'.

  • compression.codec- Este é um formato de compressão. Por padrão, ele está desabilitado. você pode alterar as configurações usando o algoritmo especificado.

  • timezone - A mesa usada para ler ou escrever.

  • text.error-tolerance.max-num - O número máximo de níveis de tolerância.

  • text.skip.headerlines - O número de linhas de cabeçalho por omitido.

  • text.serde - Esta é uma propriedade de serialização.

JSON

Apache Tajo suporta o formato JSON para consulta de dados. Tajo trata um objeto JSON como registro SQL. Um objeto é igual a uma linha em uma tabela Tajo. Vamos considerar “array.json” da seguinte forma -

$ hdfs dfs -cat /json/array.json { 
   "num1" : 10, 
   "num2" : "simple json array", 
   "num3" : 50.5 
}

Depois de criar esse arquivo, alterne para o shell Tajo e digite a seguinte consulta para criar uma tabela usando o formato JSON.

Inquerir

default> create external table sample (num1 int,num2 text,num3 float) 
   using json location ‘json/array.json’;

Lembre-se sempre de que os dados do arquivo devem corresponder ao esquema da tabela. Caso contrário, você pode omitir os nomes das colunas e usar * que não requer lista de colunas.

Para criar uma tabela interna, use a seguinte consulta -

default> create table sample (num1 int,num2 text,num3 float) using json;

Parquet

Parquet é um formato de armazenamento colunar. Tajo usa o formato Parquet para um acesso fácil, rápido e eficiente.

Criação de mesa

A consulta a seguir é um exemplo de criação de tabela -

CREATE TABLE parquet (num1 int,num2 text,num3 float) USING PARQUET;

O formato de arquivo Parquet tem as seguintes propriedades -

  • parquet.block.size - tamanho de um grupo de linhas sendo armazenado em buffer na memória.

  • parquet.page.size - O tamanho da página é para compressão.

  • parquet.compression - O algoritmo de compressão usado para comprimir páginas.

  • parquet.enable.dictionary - O valor booleano serve para ativar / desativar a codificação do dicionário.

RCFile

RCFile é o arquivo colunar do registro. Consiste em pares binários de chave / valor.

Criação de mesa

A consulta a seguir é um exemplo de criação de tabela -

CREATE TABLE Record(num1 int,num2 text,num3 float) USING RCFILE;

RCFile tem as seguintes propriedades -

  • rcfile.serde - classe desserializadora personalizada.

  • compression.codec - algoritmo de compressão.

  • rcfile.null - caractere NULL.

SequenceFile

SequenceFile é um formato de arquivo básico no Hadoop que consiste em pares de chave / valor.

Criação de mesa

A consulta a seguir é um exemplo de criação de tabela -

CREATE TABLE seq(num1 int,num2 text,num3 float) USING sequencefile;

Este arquivo de sequência é compatível com Hive. Isso pode ser escrito no Hive como,

CREATE TABLE table1 (id int, name string, score float, type string) 
STORED AS sequencefile;

ORC

ORC (Optimized Row Columnar) é um formato de armazenamento colunar do Hive.

Criação de mesa

A consulta a seguir é um exemplo de criação de tabela -

CREATE TABLE optimized(num1 int,num2 text,num3 float) USING ORC;

O formato ORC tem as seguintes propriedades -

  • orc.max.merge.distance - O arquivo ORC é lido, ele se funde quando a distância é menor.

  • orc.stripe.size - Este é o tamanho de cada faixa.

  • orc.buffer.size - O padrão é 256 KB.

  • orc.rowindex.stride - Este é o avanço do índice ORC em número de linhas.

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 a partir 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 instruçã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

Result

The above query will generate the following result.

mytable 
test

Insert Records

To insert records in the “test” table, type the following query.

Query

sampledb> insert overwrite into test select * from mytable;

Result

The above query will generate the following result.

Progress: 100%, response time: 0.518 sec

Here, “mytable" records overwrite the “test” table. If you don’t want to create the “test” table, then straight away assign the physical path location as mentioned in an alternative option for insert query.

Fetch records

Use the following query to list out all the records in the “test” table −

Query

sampledb> select * from test;

Result

The above query will generate the following result.

This statement is used to add, remove or modify columns of an existing table.

To rename the table use the following syntax −

Alter table table1 RENAME TO table2;

Query

sampledb> alter table test rename to students;

Result

The above query will generate the following result.

OK

To check the changed table name, use the following query.

sampledb> \d  
mytable 
students

Now the table “test” is changed to “students” table.

Add Column

To insert new column in the “students” table, type the following syntax −

Alter table <table_name> ADD COLUMN <column_name> <data_type>

Query

sampledb> alter table students add column grade text;

Result

The above query will generate the following result.

OK

Set Property

This property is used to change the table’s property.

Query

sampledb> ALTER TABLE students SET PROPERTY 'compression.type' = 'RECORD',
   'compression.codec' = 'org.apache.hadoop.io.compress.Snappy Codec' ; 
OK

Here, compression type and codec properties are assigned.

To change the text delimiter property, use the following −

Query

ALTER TABLE students  SET PROPERTY ‘text.delimiter'=',';  
OK

Result

The above query will generate the following result.

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

The above result shows that the table’s properties are changed using the “SET” property.

Select Statement

The SELECT statement is used to select data from a database.

The syntax for the Select statement is as follows −

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 “minha tabela” tem dois tipos de idades - 12 e 13 anos. 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 condições que filtram quais resultados de 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.

Este capítulo explica as funções de agregação e janela em detalhes.

Funções de Agregação

As funções agregadas produzem um único resultado de um conjunto de valores de entrada. A tabela a seguir descreve a lista de funções agregadas em detalhes.

S.No. Descrição da função
1 AVG (exp)

Calcula a média de uma coluna de todos os registros em uma fonte de dados.

2 CORR (expressão1, expressão2)

Retorna o coeficiente de correlação entre um conjunto de pares de números.

3 CONTAGEM()

Retorna o número de linhas.

4 MAX (expressão)

Retorna o maior valor da coluna selecionada.

5 MIN (expressão)

Retorna o menor valor da coluna selecionada.

6 SUM (expressão)

Retorna a soma da coluna fornecida.

7 LAST_VALUE (expressão)

Retorna o último valor da coluna fornecida.

Função de janela

As funções Window são executadas em um conjunto de linhas e retornam um único valor para cada linha da consulta. O termo janela tem o significado de conjunto de linhas para a função.

A função Window em uma consulta define a janela usando a cláusula OVER ().

o OVER() cláusula tem os seguintes recursos -

  • Define partições de janela para formar grupos de linhas. (Cláusula PARTITION BY)
  • Ordena as linhas dentro de uma partição. (Cláusula ORDER BY)

A tabela a seguir descreve as funções da janela em detalhes.

Função Tipo de retorno Descrição
classificação() int Retorna a classificação da linha atual com lacunas.
row_num () int Retorna a linha atual em sua partição, contando a partir de 1.
lead (valor [, deslocamento inteiro [, padrão qualquer]]) Igual ao tipo de entrada Retorna o valor avaliado na linha que está deslocada nas linhas após a linha atual na partição. Se não houver tal linha, o valor padrão será retornado.
lag (valor [, número inteiro de deslocamento [, padrão qualquer]]) Igual ao tipo de entrada Retorna o valor avaliado na linha que está deslocada antes da linha atual dentro da partição.
first_value (valor) Igual ao tipo de entrada Retorna o primeiro valor das linhas de entrada.
last_value (valor) Igual ao tipo de entrada Retorna o último valor das linhas de entrada.

Este capítulo explica sobre as seguintes consultas significativas.

  • Predicates
  • Explain
  • Join

Vamos prosseguir e realizar as consultas.

Predicados

Predicado é uma expressão que é usada para avaliar valores verdadeiro / falso e DESCONHECIDO. Os predicados são usados ​​na condição de pesquisa de cláusulas WHERE e cláusulas HAVING e outras construções onde um valor booleano é necessário.

Predicado IN

Determina se o valor da expressão a ser testada corresponde a qualquer valor na subconsulta ou na lista. A subconsulta é uma instrução SELECT comum que possui um conjunto de resultados de uma coluna e uma ou mais linhas. Esta coluna ou todas as expressões na lista devem ter o mesmo tipo de dados que a expressão a ser testada.

Syntax

IN::= 
<expression to test> [NOT] IN (<subquery>) 
| (<expression1>,...)

Query

select id,name,address from mytable where id in(2,3,4);

Result

A consulta acima irá gerar o seguinte resultado.

id,  name,   address 
------------------------------- 
2,  Amit,  12 old street 
3,  Bob,   10 cross street 
4,  David, 15 express avenue

A consulta retorna registros de mytable para os alunos id 2,3 e 4.

Query

select id,name,address from mytable where id not in(2,3,4);

Result

A consulta acima irá gerar o seguinte resultado.

id,  name,  address 
------------------------------- 
1,  Adam,   23 new street 
5,  Esha,   20 garden street 
6,  Ganga,  25 north street 
7,  Jack,   2 park street 
8,  Leena,  24 south street 
9,  Mary,   5 west street 
10, Peter,  16 park avenue

A consulta acima retorna registros de mytable onde os alunos não estão em 2,3 e 4.

Como predicado

O predicado LIKE compara a string especificada na primeira expressão para calcular o valor da string, que é referido como um valor a ser testado, com o padrão que é definido na segunda expressão para calcular o valor da string.

O padrão pode conter qualquer combinação de curingas, como -

  • Símbolo de sublinhado (_), que pode ser usado em vez de qualquer caractere único no valor a ser testado.

  • Sinal de porcentagem (%), que substitui qualquer string de zero ou mais caracteres no valor a ser testado.

Syntax

LIKE::= 
<expression for calculating the string value> 
[NOT] LIKE 
<expression for calculating the string value> 
[ESCAPE <symbol>]

Query

select * from mytable where name like ‘A%';

Result

A consulta acima irá gerar o seguinte resultado.

id,  name,  address,     age,  mark 
------------------------------- 
1,  Adam,  23 new street,  12,  90 
2,  Amit,  12 old street,  13,  95

A consulta retorna registros de minha tabela daqueles alunos cujos nomes começam com 'A'.

Query

select * from mytable where name like ‘_a%';

Result

A consulta acima irá gerar o seguinte resultado.

id,  name,  address,    age,  mark 
——————————————————————————————————————- 
4,  David,  15 express avenue,  12,  85 
6,  Ganga,  25 north street,    12,  55 
7,  Jack,  2 park street,       12,  60 
9,  Mary,  5 west street,       12,  75

A consulta retorna registros de mytable daqueles alunos cujos nomes começam com 'a' como o segundo caractere.

Usando valor NULL nas condições de pesquisa

Vamos agora entender como usar o valor NULL nas condições de pesquisa.

Syntax

Predicate  
IS [NOT] NULL

Query

select name from mytable where name is not null;

Result

A consulta acima irá gerar o seguinte resultado.

name 
------------------------------- 
Adam 
Amit 
Bob 
David 
Esha 
Ganga 
Jack 
Leena 
Mary 
Peter  
(10 rows, 0.076 sec, 163 B selected)

Aqui, o resultado é verdadeiro, então ele retorna todos os nomes da tabela.

Query

Vamos agora verificar a consulta com a condição NULL.

default> select name from mytable where name is null;

Result

A consulta acima irá gerar o seguinte resultado.

name 
------------------------------- 
(0 rows, 0.068 sec, 0 B selected)

Explicar

Explainé usado para obter um plano de execução de consulta. Ele mostra a execução de um plano lógico e global de uma instrução.

Consulta de plano lógico

explain select * from mytable;  
explain 
-------------------------------  
   => target list: default.mytable.id (INT4), default.mytable.name (TEXT), 
      default.mytable.address (TEXT), default.mytable.age (INT4), default.mytable.mark (INT4) 
   
   => out schema: {
   (5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT), 
      default.mytable.age (INT4), default.mytable.mark (INT4)
   } 
   
   => in schema: {
	(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT), 
      default.mytable.age (INT4), default.mytable.mark (INT4)
   }

Result

A consulta acima irá gerar o seguinte resultado.

O resultado da consulta mostra um formato de plano lógico para a tabela fornecida. O plano lógico retorna os três resultados a seguir -

  • Lista de alvos
  • Nosso esquema
  • No esquema

Consulta de plano global

explain global select * from mytable;  
explain 
------------------------------- 
------------------------------------------------------------------------------- 
Execution Block Graph (TERMINAL - eb_0000000000000_0000_000002) 
------------------------------------------------------------------------------- 
|-eb_0000000000000_0000_000002 
   |-eb_0000000000000_0000_000001 
------------------------------------------------------------------------------- 
Order of Execution 
------------------------------------------------------------------------------- 
1: eb_0000000000000_0000_000001 
2: eb_0000000000000_0000_000002 
-------------------------------------------------------------------------------  
======================================================= 
Block Id: eb_0000000000000_0000_000001 [ROOT] 
=======================================================  
SCAN(0) on default.mytable 
   
   => target list: default.mytable.id (INT4), default.mytable.name (TEXT), 
      default.mytable.address (TEXT), default.mytable.age (INT4), default.mytable.mark (INT4) 
   
   => out schema: {
	(5) default.mytable.id (INT4), default.mytable.name (TEXT),default.mytable.address (TEXT), 
      default.mytable.age (INT4), default.mytable.mark (INT4)
   } 
   
   => in schema: {
	(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT), 
      default.mytable.age (INT4), default.mytable.mark (INT4)
   }  
======================================================= 
Block Id: eb_0000000000000_0000_000002 [TERMINAL] 
======================================================= 
(24 rows, 0.065 sec, 0 B selected)

Result

A consulta acima irá gerar o seguinte resultado.

Aqui, o plano global mostra o ID do bloco de execução, a ordem de execução e suas informações.

Junta-se

As junções SQL são usadas para combinar linhas de duas ou mais tabelas. A seguir estão os diferentes tipos de junções SQL -

  • Junção interna
  • {LEFT | DIREITO | FULL} OUTER JOIN
  • Junção cruzada
  • Autoinserir
  • Junção natural

Considere as duas tabelas a seguir para realizar operações de junção.

Tabela1 - Clientes

Eu iria Nome Endereço Era
1 Cliente 1 23 Old Street 21
2 Cliente 2 12 New Street 23
3 Cliente 3 10 Express Avenue 22
4 Cliente 4 15 Express Avenue 22
5 Cliente 5 20 Garden Street 33
6 Cliente 6 21 North Street 25

Tabela2 - pedido do cliente

Eu iria Id do pedido Id Emp
1 1 101
2 2 102
3 3 103
4 4 104
5 5 105

Vamos agora prosseguir e realizar as operações de junção SQL nas duas tabelas acima.

Junção interna

A junção interna seleciona todas as linhas de ambas as tabelas quando há uma correspondência entre as colunas em ambas as tabelas.

Syntax

SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Query

default> select c.age,c1.empid from customers c inner join customer_order c1 on c.id = c1.id;

Result

A consulta acima irá gerar o seguinte resultado.

age,  empid 
------------------------------- 
21,  101 
23,  102 
22,  103 
22,  104 
33,  105

A consulta corresponde a cinco linhas de ambas as tabelas. Portanto, ele retorna a idade das linhas correspondentes da primeira tabela.

União Externa Esquerda

Uma junção externa esquerda retém todas as linhas da tabela “esquerda”, independentemente de haver uma linha que corresponda à tabela “direita” ou não.

Query

select c.name,c1.empid from customers c left outer join customer_order c1 on c.id = c1.id;

Result

A consulta acima irá gerar o seguinte resultado.

name,       empid 
------------------------------- 
customer1,  101 
customer2,  102 
customer3,  103 
customer4,  104 
customer5,  105 
customer6,

Aqui, a junção externa esquerda retorna linhas de coluna de nome da tabela de clientes (esquerda) e linhas correspondentes de coluna vazia da tabela customer_order (direita).

Junção Externa Direita

Uma junção externa direita retém todas as linhas da tabela “direita”, independentemente de haver uma linha que corresponda à tabela “esquerda”.

Query

select c.name,c1.empid from customers c right outer join customer_order c1 on c.id = c1.id;

Result

A consulta acima irá gerar o seguinte resultado.

name,      empid 
------------------------------- 
customer1,  101 
customer2,  102 
customer3,  103 
customer4,  104 
customer5,  105

Aqui, o Right Outer Join retorna as linhas vazias da tabela customer_order (direita) e as linhas correspondentes da coluna de nome da tabela customers.

Full Outer Join

A Full Outer Join retém todas as linhas da tabela à esquerda e à direita.

Query

select * from customers c full outer join customer_order c1 on c.id = c1.id;

Result

A consulta acima irá gerar o seguinte resultado.

A consulta retorna todas as linhas correspondentes e não correspondentes das tabelas clientes e customer_order.

Cross Join

Isso retorna o produto cartesiano dos conjuntos de registros de duas ou mais tabelas unidas.

Syntax

SELECT *  FROM table1  CROSS JOIN table2;

Query

select orderid,name,address from customers,customer_order;

Result

A consulta acima irá gerar o seguinte resultado.

A consulta acima retorna o produto cartesiano da tabela.

União Natural

Uma junção natural não usa nenhum operador de comparação. Não concatena da mesma forma que um produto cartesiano. Podemos realizar uma junção natural apenas se houver pelo menos um atributo comum entre as duas relações.

Syntax

SELECT * FROM table1 NATURAL JOIN table2;

Query

select * from customers natural join customer_order;

Result

A consulta acima irá gerar o seguinte resultado.

Aqui, há um id de coluna comum entre duas tabelas. Usando essa coluna comum, oNatural Join junta-se a ambas as tabelas.

Self Join

O SQL SELF JOIN é usado para juntar uma tabela a si mesma como se a tabela fosse duas tabelas, renomeando temporariamente pelo menos uma tabela na instrução SQL.

Syntax

SELECT a.column_name, b.column_name...  
FROM table1 a, table1 b  
WHERE a.common_filed = b.common_field

Query

default> select c.id,c1.name from customers c, customers c1 where c.id = c1.id;

Result

A consulta acima irá gerar o seguinte resultado.

id,   name 
------------------------------- 
1,   customer1 
2,   customer2 
3,   customer3 
4,   customer4 
5,   customer5 
6,   customer6

A consulta associa uma tabela de clientes a si mesma.

Tajo suporta vários formatos de armazenamento. Para registrar a configuração do plugin de armazenamento, você deve adicionar as alterações ao arquivo de configuração “storage-site.json”.

storage-site.json

A estrutura é definida da seguinte forma -

{ 
   "storages": { 
      “storage plugin name“: { 
         "handler": "${class name}”, "default-format": “plugin name" 
      } 
   } 
}

Cada instância de armazenamento é identificada por URI.

Manipulador de armazenamento PostgreSQL

Tajo suporta o gerenciador de armazenamento PostgreSQL. Ele permite que as consultas do usuário acessem objetos do banco de dados no PostgreSQL. É o gerenciador de armazenamento padrão no Tajo, portanto, você pode configurá-lo facilmente.

configuração

{ 
   "spaces": {  
      "postgre": {  
         "uri": "jdbc:postgresql://hostname:port/database1"  
         "configs": {  
            "mapped_database": “sampledb”  
            "connection_properties": { 
               "user":“tajo", "password": "pwd" 
            } 
         } 
      } 
   } 
}

Aqui, “database1” refere-se a postgreSQL banco de dados que é mapeado para o banco de dados “sampledb” em Tajo.

Apache Tajo oferece suporte à integração com HBase. Isso nos permite acessar tabelas HBase no Tajo. HBase é um banco de dados orientado a coluna distribuído construído sobre o sistema de arquivos Hadoop. É uma parte do ecossistema Hadoop que fornece acesso aleatório de leitura / gravação em tempo real aos dados no Hadoop File System. As etapas a seguir são necessárias para configurar a integração do HBase.

Definir Variável de Ambiente

Adicione as seguintes alterações ao arquivo “conf / tajo-env.sh”.

$ vi conf/tajo-env.sh  
# HBase home directory. It is opitional but is required mandatorily to use HBase. 
# export HBASE_HOME = path/to/HBase

Depois de incluir o caminho do HBase, Tajo configurará o arquivo da biblioteca do HBase para o caminho de classe.

Crie uma tabela externa

Crie uma tabela externa usando a seguinte sintaxe -

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> [(<column_name> <data_type>, ... )] 
USING hbase WITH ('table' = '<hbase_table_name>' 
, 'columns' = ':key,<column_family_name>:<qualifier_name>, ...' 
, 'hbase.zookeeper.quorum' = '<zookeeper_address>' 
, 'hbase.zookeeper.property.clientPort' = '<zookeeper_client_port>') 
[LOCATION 'hbase:zk://<hostname>:<port>/'] ;

Para acessar as tabelas do HBase, você deve configurar o local do espaço de tabela.

Aqui,

  • Table- Definir o nome da tabela de origem hbase. Se você deseja criar uma tabela externa, a tabela deve existir no HBase.

  • Columns- A chave refere-se à chave de linha do HBase. O número de entradas de colunas deve ser igual ao número de colunas da tabela Tajo.

  • hbase.zookeeper.quorum - Defina o endereço do quorum do zookeeper.

  • hbase.zookeeper.property.clientPort - Definir a porta do cliente zookeeper.

Query

CREATE EXTERNAL TABLE students (rowkey text,id int,name text) 
USING hbase WITH ('table' = 'students', 'columns' = ':key,info:id,content:name') 
LOCATION 'hbase:zk://<hostname>:<port>/';

Aqui, o campo de caminho de localização define o id da porta do cliente zookeeper. Se você não definir a porta, Tajo fará referência à propriedade do arquivo hbase-site.xml.

Criar tabela no HBase

Você pode iniciar o shell interativo do HBase usando o comando “shell hbase” conforme mostrado na consulta a seguir.

Query

/bin/hbase shell

Result

A consulta acima irá gerar o seguinte resultado.

hbase(main):001:0>

Etapas para consultar o HBase

Para consultar o HBase, você deve concluir as seguintes etapas -

Step 1 - Canalize os seguintes comandos para o shell do HBase para criar uma tabela “tutorial”.

Query

hbase(main):001:0> create ‘students’,{NAME => ’info’},{NAME => ’content’} 
put 'students', ‘row-01', 'content:name', 'Adam' 
put 'students', ‘row-01', 'info:id', '001' 
put 'students', ‘row-02', 'content:name', 'Amit' 
put 'students', ‘row-02', 'info:id', '002' 
put 'students', ‘row-03', 'content:name', 'Bob' 
put 'students', ‘row-03', 'info:id', ‘003'

Step 2 - Agora, emita o seguinte comando no shell hbase para carregar os dados em uma tabela.

main):001:0> cat ../hbase/hbase-students.txt | bin/hbase shell

Step 3 - Agora, retorne ao shell Tajo e execute o seguinte comando para visualizar os metadados da tabela -

default> \d students;  

table name: default.students 
table path: 
store type: HBASE 
number of rows: unknown 
volume: 0 B 
Options: 
   'columns' = ':key,info:id,content:name' 
   'table' = 'students'  

schema: 
rowkey  TEXT 
id  INT4 
name TEXT

Step 4 - Para buscar os resultados da tabela, use a seguinte consulta -

Query

default> select * from students

Result

A consulta acima irá buscar o seguinte resultado -

rowkey,  id,  name 
------------------------------- 
row-01,  001,  Adam 
row-02,  002,  Amit 
row-03   003,  Bob

Tajo suporta o HiveCatalogStore para integração com o Apache Hive. Essa integração permite que Tajo acesse tabelas no Apache Hive.

Definir Variável de Ambiente

Adicione as seguintes alterações ao arquivo “conf / tajo-env.sh”.

$ vi conf/tajo-env.sh  
export HIVE_HOME = /path/to/hive

Depois de incluir o caminho do Hive, Tajo configurará o arquivo da biblioteca do Hive como o caminho de classe.

Configuração do Catálogo

Adicione as seguintes alterações ao arquivo “conf / catalog-site.xml”.

$ vi conf/catalog-site.xml  
<property> 
   <name>tajo.catalog.store.class</name> 
   <value>org.apache.tajo.catalog.store.HiveCatalogStore</value> 
</property>

Assim que o HiveCatalogStore estiver configurado, você pode acessar a tabela do Hive no Tajo.

Swift é um armazenamento de objeto / blob distribuído e consistente. Swift oferece software de armazenamento em nuvem para que você possa armazenar e recuperar muitos dados com uma API simples. Tajo suporta integração Swift.

A seguir estão os pré-requisitos da integração Swift -

  • Swift
  • Hadoop

Core-site.xml

Adicione as seguintes alterações ao arquivo hadoop “core-site.xml” -

<property> 
   <name>fs.swift.impl</name> 
   <value>org.apache.hadoop.fs.swift.snative.SwiftNativeFileSystem</value> 
   <description>File system implementation for Swift</description> 
</property>  

<property> 
   <name>fs.swift.blocksize</name> 
   <value>131072</value> 
   <description>Split size in KB</description> 
</property>

Isso será usado para o Hadoop acessar os objetos Swift. Depois de fazer todas as alterações, vá para o diretório Tajo para definir a variável de ambiente Swift.

conf / tajo-env.h

Abra o arquivo de configuração Tajo e adicione definir a variável de ambiente da seguinte maneira -

$ vi conf/tajo-env.h export TAJO_CLASSPATH = $HADOOP_HOME/share/hadoop/tools/lib/hadoop-openstack-x.x.x.jar

Agora, Tajo será capaz de consultar os dados usando o Swift.

Criar a tabela

Vamos criar uma tabela externa para acessar objetos Swift no Tajo da seguinte maneira -

default> create external table swift(num1 int, num2 text, num3 float) 
   using text with ('text.delimiter' = '|') location 'swift://bucket-name/table1';

Após a criação da tabela, você pode executar as consultas SQL.

Apache Tajo fornece interface JDBC para conectar e executar consultas. Podemos usar a mesma interface JDBC para conectar Tajo de nosso aplicativo baseado em Java. Vamos agora entender como conectar o Tajo e executar os comandos em nosso aplicativo Java de amostra usando a interface JDBC nesta seção.

Baixe o driver JDBC

Baixe o driver JDBC visitando o seguinte link - http://apache.org/dyn/closer.cgi/tajo/tajo-0.11.3/tajo-jdbc-0.11.3.jar.

Agora, o arquivo “tajo-jdbc-0.11.3.jar” foi baixado em sua máquina.

Definir caminho da classe

Para usar o driver JDBC em seu programa, defina o caminho da classe da seguinte maneira -

CLASSPATH = path/to/tajo-jdbc-0.11.3.jar:$CLASSPATH

Conecte-se ao Tajo

Apache Tajo fornece um driver JDBC como um único arquivo jar e está disponível @ /path/to/tajo/share/jdbc-dist/tajo-jdbc-0.11.3.jar.

A string de conexão para conectar o Apache Tajo tem o seguinte formato -

jdbc:tajo://host/
jdbc:tajo://host/database
jdbc:tajo://host:port/  
jdbc:tajo://host:port/database

Aqui,

  • host - O nome do host do TajoMaster.

  • port- O número da porta que o servidor está escutando. O número da porta padrão é 26002.

  • database- O nome do banco de dados. O nome do banco de dados padrão é o padrão.

Aplicativo Java

Vamos agora entender o aplicativo Java.

Codificação

import java.sql.*; 
import org.apache.tajo.jdbc.TajoDriver;  

public class TajoJdbcSample {  
   public static void main(String[] args) {  
      Connection connection = null; 
      Statement statement = null;  
      try {
         Class.forName("org.apache.tajo.jdbc.TajoDriver");  
         connection = DriverManager.getConnection(“jdbc:tajo://localhost/default");
         statement = connection.createStatement(); 
         String sql;  
         sql = "select * from mytable”; 
         // fetch records from mytable.  
         ResultSet resultSet = statement.executeQuery(sql);  
         while(resultSet.next()){  
            int id  = resultSet.getInt("id"); 
            String name = resultSet.getString("name");  
            System.out.print("ID: " + id + ";\nName: " + name + "\n"); 
         }  
         resultSet.close();
         statement.close(); 
         connection.close(); 
      }catch(SQLException sqlException){ 
         sqlException.printStackTrace(); 
      }catch(Exception exception){ 
         exception.printStackTrace(); 
      } 
   } 
}

O aplicativo pode ser compilado e executado usando os seguintes comandos.

Compilação

javac -cp /path/to/tajo-jdbc-0.11.3.jar:. TajoJdbcSample.java

Execução

java -cp /path/to/tajo-jdbc-0.11.3.jar:. TajoJdbcSample

Resultado

Os comandos acima irão gerar o seguinte resultado -

ID: 1; 
Name: Adam  

ID: 2; 
Name: Amit  

ID: 3; 
Name: Bob  

ID: 4; 
Name: David  

ID: 5; 
Name: Esha  

ID: 6; 
Name: Ganga 

ID: 7; 
Name: Jack  

ID: 8; 
Name: Leena  

ID: 9; 
Name: Mary  

ID: 10; 
Name: Peter

Apache Tajo oferece suporte a funções definidas pelo usuário / personalizadas (UDFs). As funções personalizadas podem ser criadas em python.

As funções personalizadas são funções simples do Python com decorador “@output_type(<tajo sql datatype>)” como segue -

@ouput_type(“integer”) 
def sum_py(a, b): 
   return a + b;

Os scripts python com UDFs podem ser registrados adicionando a configuração abaixo em “tajosite.xml”.

<property> 
   <name>tajo.function.python.code-dir</name> 
   <value>file:///path/to/script1.py,file:///path/to/script2.py</value> 
</property>

Assim que os scripts forem registrados, reinicie o cluster e os UDFs estarão disponíveis diretamente na consulta SQL da seguinte forma -

select sum_py(10, 10) as pyfn;

Apache Tajo também oferece suporte a funções de agregação definidas pelo usuário, mas não oferece suporte a funções de janela definidas pelo usuário.