ETL – De uma API Rest para o MySQL utilizando Pentaho – Parte 4

Olá! Finalmente chegamos a quarta, e última, parte deste tutorial, onde vamos trabalhar em conjunto transformações e jobs . Para você que não vem acompanhando o Blog a Parte 1 foi uma introdução do Pentaho, na Parte 2 recebemos dados de uma API Rest para salvar em uma planilha e na Parte 3 salvamos o mesmo resultado em uma tabela do MySQL. Nesta última parte vamos criar mais uma transformação, que irá carregar todas as cidades de um estado, através de dados recebidos da transformação criada anteriormente. Estas transformações serão orquestradas por um Job que controlará o fluxo de todo o processo. Vamos lá!

Analisando a API de Cidades

Vamos utilizar a mesma API de onde obtivemos os estados, só que agora o método que obtém municípios por estado. Neste caso poderia ser utilizada opção que retorna todos os municípios, mas para entendermos a didática do compartilhamento de informações entre transformações vamos utilizar esta opção. Clique aqui para acessar a documentação do métodos que utilizaremos.

Documentação da API para recuperar Municípios
Documentação da API para recuperar Municípios

Note que a url da chamada deste método devemos trocar o parametro “UF” pelo ID do estado para recuperar os seus municípios, este ID obtivemos na primeira transformação que fizemos. Devemos utilizar o ID e não a sigla do estado, então uma consulta pelas cidades do estado de São Paulo ficaria:

http://servicodados.ibge.gov.br/api/v1/localidades/estados/35/municipios

Alterando transformação dos estados

Para que nossa futura transformação de cidades do estado funcione corretamente precisamos deixar “visíveis” os dados do estado para outras transformações. Vamos a transformação em que recebemos os estados, nos steps do PDI escolha a pasta Job, dentro dela temos o step “Copy rows to result”, copie-o para a transformação. Vamos criar um hop entre o step que persistiu os dados no banco de dados e o novo criado. Este não tem nenhum opção, além do título, na sua edição, porém, é necessário para enviar os dados obtidos nesta transformação para frente.

Adicionando step "Copy rows to result"
Adicionando step “Copy rows to result”

Criando transformação das cidades do estado

Vamos iniciar uma nova transformação no PDI, assim como copiamos os resultados no tópico anterior agora temos de “receber” esta informação neste step, para isso, destro da pasta Job escolha o step “Get rows from result”. Agora vamos escolher quais campos do resultado anterior queremos utilizar, repare que na URL da nossa API vamos precisar como parâmetro o ID do estado, portanto, somente este campo é necessário nessa transformação, que vou chamar de Carregar Dados do Estado.

Step "Get rows from result"
Step “Get rows from result”

A URL da API é formada basicamente por três partes: a url principal, o ID do estado, que é variável, e um parâmetro fixo para a listagem de municípios.

<strong><span style="color: #0000ff;">http://servicodados.ibge.gov.br/api/v1/localidades/estados/</span><span style="color: #ff0000;">{UF}</span><span style="color: #008000;">/municipios
</span></strong>

Vamos ter de montar esta URL, a parte do ID, em vermelho, do estado já estamos recuperando no step “Carregar Dados do Estado”, agora precisamos montar os outros dois, vamos criar um outro step utilizando o Generate Rows, dentro de Input, vou chamar este step de Campos da URL. Nele vamos criar duas linhas: url e tipo. Na coluna valor da linha url preencha com o primeira parte, em azul, do endereço da API, já para a linha tipo preencha com a terceira parte, em verde.

Adicionando campos da URL
Adicionando campos da URL

Agora temos uma parte da URL no step Carregar Dados do Estado e mais duas partes no step Campos da URL, não é possível concatenar estes campos diretamente pois estão com tamanhos diferentes. É preciso juntar as linhas e para isso vamos usar o step Join Rows (cartesian product), dentro da pasta Joins, ligue os dois passos anteriores a este, não precisamo configurar nada nele, vamos somente alterar o nome para Juntar Linhas.

Fazendo Join dos dois steps
Fazendo Join dos dois steps

Para finalizar a montagem da URL vamos utilizar o step Concat Fields, que está dentro da aba Transform. Como o nome sugere este step irá juntar todos os campos em um novo campo, primeiro vamos alterar o nome do step para Criar Url API. Logo abaixo, no campo Target Field Name, vamos dar o nome para o campo com o resultado da concatenação, vou colocar urlAPI. Na aba Fields vamos colocar os campos que serão concatenados, a ordem é muito importate. Com o novo campo urlAPI não precisaremos mais dos outros três, então, para removê-los, clique na aba Advanced e marque a primeira opção Remove selected fields, desta forma será passado adiante somente o campo concatenado.

Concatenando campos
Concatenando campos

Agora vamos realizar passos semelhantes ao da Parte 2 deste artigo, primeiro adicione o step REST Client, dentro da pasta Lookup, como na imagem abaixo, repare que no campo Result field name deixamos “cidades”:

Conectando com a API
Conectando com a API

Agora adicione o step Json Input, dentro da pasta Input, na aba File marque a opção Source is from a previous step e logo abaixo escolha na lista o campo cidades. Marque também a opção Do not pass field downstream. Na aba Fields vamos definir os campos que usaremos, deixe como na imagem abaixo:

Campos do JSON
Campos do JSON

Agora vamos remover o campo urlAPI pois não será mais usado, para isso escolha o step Select values, dentro da pasta Transform. Nele utilize a aba Remove para indicar o campo que vamos remover.

Remover o campo urlAPI
Remover o campo urlAPI

Por fim, vamos salvar os resultados no banco, insira o step Inser / Update, que está na pasta Output. Nele vamos continuar a utilizar a conexão CidadesBrasil, agora no campo Target table deixe o valor cidade. Como ainda não criamos a tabela clique no botão SQL para gerar script para a criação da tabela, nesta janela clique em Execute para que o script seja executado no banco. Agora  temos de alterar o restante dos campos como na imagem abaixo:

Persistência dos dados
Persistência dos dados

A transformação está pronta, porém não conseguimos executá-la ainda porque existe dependência de dados da primeira transformação, de estados, e essas duas transformações só “conversarão” quando criarmos um Job que orquestrará a comunicação entre elas.

Criando o JOB principal

Chegamos a parte final do nosso projeto, vamos criar um Job do PDI que será responsável por controlar o fluxo de informações entre as nossas transformações. Clique no menu File > Novo > Job, repare que as pastas da aba Design são diferentes, um Job tem steps específicos para tarefas de controle de fluxo, validações, enfim, tarefas simples que não envolvem transformações.

Vamos começar nosso Job adicionando um step que representa o inicio do fluxo, na aba General escolha o START. Ao abrir os detalhes desse step temos algumas configurações de agendamento do Job, essa não é a melhor maneira de criar um agendamento pois o PDI precisaria estar aberto para que fosse executado, em outro artigo trataremos melhor desse ponto, portanto não vamos alterar nada nos detalhes desse step.

Vamos criar um step que irá executar a nossa primeira transformação, ainda na aba General escolha o step Transformation e abra os seus detalhes. Em Entry Name coloque carregarEstados e, abaixo, em Transformation escolha o arquivo da primeira transformação. Para essa transformação não precisaremos alterar nenhuma opção a mais. Crie um hop entre o step START e o carregar Estados. Agora, novamente, adicione um step de Trasnformation, e abra os seus detalhes, deixe o nome como carregarCidades e escolha o arquivo da segunda transformação. Agora, na opções, deixe marcada Execute every input row, com isso estamos indicando ao Job que a cada linha enviada pelo step anterior esta transformação será executada. Clique em OK e crie um hop entre o step carregarEstados e carregarCidades.

Escolhendo transformação para o Job
Escolhendo transformação para o Job

E se alguma de nossas Transformações derem erro? Podemos tratar isso no Job, na pasta Utility escolha o step Abort job. Abra os seus detalhes e coloque o nome como finalizarJob e a mensagem de erro como Erro ao executar JOB. Agora vamos ligar as duas transformações (carregarEstados e carregarCidades) a este Step, repare na imagem abaixo os tipos de Hop de um Job:

Fluxo do Job
Fluxo do Job

No Job podemos marcar que o fluxo de hop sempre será executado (ícone do cadeado amarelo), ou será executado em caso de sucesso (ícone verde) ou será executado em carro de erro (ícone vermelho). Estas três opções podem ser alternadas clicando sobre o ícone, daí você pode montar o fluxo da forma como escolher. Para finalizar o nosso processo, na aba General, escolha o step Success e faça um hop saindo do step da transformação carregarCidades. Pronto, nosso Job está finalizado, vamos executar e acompanhar nos logs a sua execução.

Job Final
Job Final

Conclusão

E chegamos ao fim do tutorial de como extrair os dados de uma API Rest para o MySQL utilizando o Pentaho Data Integration. Nessa última parte é muito importante ressaltar os passos que utilizamos para copiar e receber os dados de uma transformação para outra. É uma boa prática fazer um projeto com pequenas transformações, assim fica mais fácil de entender e de dar manutenção em um projeto. Para isso é imprescindível a correta utilização de Jobs na organização do trabalho das transformações. Espero que tenham gostado deste primeiro tutorial, sugestões e dúvidas são muito bem vindas para os próximos!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *