Variáveis são um dos pontos mais importantes em qualquer ferramenta de ETL e dominar este conceito pode reduzir bastante o tempo que se constrói uma transformação, além de facilitar o trabalho com jobs de automatização dos processos

Dentro do engine do PDI temos duas formas de utilizar variáveis, podendo ser:

Sistema – são nativas do próprio software

Customizadas – são criadas pelo usuário

VARIÁVEIS

Há alguns bons posts atrás (seção: configurando conexão) eu mostrei como criar uma variável fixa que pode ser utilizada para armazenar diretórios, conexões, nome de arquivos etc.

O interessante destas variáveis é que elas são permanentes, disponíveis para qualquer um ‘enxergar’ e, independente da transformação ou job, estarão lá.

Tenha cuidado com mudanças nessas variáveis e certifique-se de que nenhuma transformação esteja utilizando antes de alterar o valor armazenado.

As variáveis possuem configurações que devem ser atribuídas antes da sua execução, estas são divididas nas seguintes categorias:

  • Java virtual machine scope –  variável válida para todos os jobs e transformações que serão executadas naquela máquina
  • Valid in the parent job  – válida para o job que está executando e para todas as transformações jobs aninhados  que ESTE job executa.
  • Valid in the grand job – a variável passa a valer para o job que a chama na execução e para todos os jobs ‘filhos’ e suas transformações. É a mais indicada para jobs aninhados.
  • Valid in the root – variável é válida para o atual, para os jobs que estão aninhados e suas transformações internas dentre todas as configurações, perde apenas para java virtual machine.

Antes de iniciar de fato, tentem utilizar sempre que forem trabalhar com variáveis as duas configurações principais:

  • Java Virtual Machine scope.
  • Valid in The Root Job.

São as duas melhores e mais confiáveis para evitar erros de uso e execução de variáveis!

CRIANDO AS TRANSFORMAÇÕES E VARIÁVEIS

Sem mais teoria, vamos para a prática do uso de variáveis! 

Nosso primeiro passo será criar três transformações e após, atribuir aos jobs de execução de transformação.

Na primeira transformação que eu criei, atribuí um step set variables com as conexões do meu banco SQL Server e duas datas, de início e fim. Explico adiante!

Veja o modelo abaixo:.

Na transformação acima, destaquei em vermelho os padrões de variáveis para conexão que utilizaremos e em preto, as duas datas que pedi para criarem!

Agora, crio a minha segunda transformação e nela, adiciono um outro step, que se chama get variables – irá puxar as variáveis criadas na transformação anterior. 

Voltarei aqui em breve, fique apenas com esse esquema e atribua a seguinte configuração no seu step table input.

Não se preocupe com a conexão agora, logo entenderá. Apenas configure da seguinte maneira!

Partindo para a terceira transformação, criei uma transformação que me retornasse as propriedades do ETL que está sendo criado.

Nesta transformação utilizei o step get system info para extrair essas informações mais básicas, veja abaixo a configuração básica.

O step get system info não foi tratado aqui como eu imaginava, mas mostrarei a configuração básica, sintam-se livres para explorar as suas opções.

  • System date (variable) – irá pegar a hora e data do sistema e atribuir ao campo respectivo
  • Transformation batch id – retorna o id da transformação para o campo
  • Transformation name – nome da transformação que está executando
  • Kettle Version – versão do Pentaho

Estas informações extraídas serão atribuídas à variável ao final desta transformação.

NOTA: é importante atribuir os steps select values e puxar os campos se não, o valor não será considerado, o PDI irá considerar como null em qualquer outro step. Foi um problema que me ocorreu; passei a utilizar para garantir o resultado. 

No meu segundo get system info, criei um valor para o término da execução do ETL pois não poderia colocar no primeiro!

Ao final, atribui os valores obtidos nos steps anteriores para a variável com a seguinte configuração.

Terminado todo esse processo, vamos para a próxima etapa que se trata do jobs e como pegar as variáveis.

UTILIZANDO AS VARIÁVEIS NO JOB

Antes de mostrar preciso explicar o motivo.

No Pentaho, as ações são sequenciais e paralelas. Quando se trata de variáveis criadas em streams, elas só podem ser utilizadas após sua execução, por um processo anterior.


Então, se voltarem ao tópico anterior, entenderão o motivo d’eu ter criado dois steps. Sendo um com as variáveis de conexão e outro com uma consulta qualquer que utilizará as datas criadas.

Outro ponto importante é se atentar sempre ao escopo que se atribui, isso pode limitar a ação delas.

Para o primeiro passo, criei um job e dentro deste, as transformações. Estas transformações possuem outro escopo, elas não tratam dados como o habitual. Aqui, atribuímos as transformações que criamos acima.

Essa é a base que iremos trabalhar.

O processo aqui é mais simples, eu atribuí a cada uma destas transformações as transformações criadas anteriormente para execução em linha.

A primeira transformação que criei, que tratava da conexão e data, coloquei no transformation job “BD_CON_VAR”, a segunda, com a consulta SQL foi para o “DATA_INFO” e a que puxa informações do ETL, “ETL_INFO”.

Como o primeiro job possui apenas as variáveis de conexão e já mostrei como configurei no tópico anterior, pulo para a segunda transformação, “DATA_INFO”, para justificar o motivo.

Para resgatar a variável que foi criada dentro da transformação, vá até o diretório onde as transformações ficam salvas dentro do job transformation, busque pela desejada e dê ok.

Lembrando mais uma vez que as variáveis só se tornarão visíveis após a execução do job. Ao seu final, elas ficarão disponíveis para serem passadas como argumento. Basta apertar ctrl + space para lista de variáveis se tornar selecionável.

Os argumentos são opções para passar linhas de comando via PDI para o S.O. As variáveis pouco tem utilidade aqui. Apenas mostrei que é possível, caso crie uma variável com linhas de comando salvas para facilitar seu uso.

E com eu ainda não executei nenhuma ação nesta transformação, perceba abaixo a imagem do transformation job DATA_INFO”.

Não há nenhuma variável de conexão criada no primeiro step disponível ainda.

Se quiser conferir os valores e quais variáveis estão sendo utilizadas na transformação, aperte ctrl + l, veja.

As que foram circuladas em azul, são fixas, criadas por mim e elas não são afetadas por nenhuma execução. Elas ficam salvas no kettle.properties file.

Quando executo o step interno e passo a atribuir os valores com o set variables, veja no log que os valores foram salvos.

E executando o transformation job BD_CON_VAR” , perceba que os outros conseguem acessar as variáveis.

Este é o primeiro step para puxar as variáveis de data criadas na transformação anterior, como elas possuem a configuração “valid in java virtual machine” todo e qualquer step pode acessar.

“Mas por que as outras não precisam”? Simples, no step table input, eu preciso atribuir um campo de onde o as variáveis virão, logo, não posso buscar de maneira “vaga” no sistema.

Veja abaixo que o próprio step pediu o local de onde as variáveis virão.

E sempre que quiser substituir um valor por variável, basta colocar interrogação. 

Aqui é de EXTREMA importância destacar que no campo get variables, as variáveis devem vir na ordem correta, se não vier, pode causar erro na query.

E diferente dos campos e das variáveis atribuídas em query, no campo de conexão, conseguimos puxar as variáveis mesmo sem que elas estejam no get variables. 

Como podem ver na imagem acima, todos os parâmetros de conexão estão exatamente iguais ao que criei no primeiro step. Irei repetir a imagem abaixo para facilitar a compreensão!

E o teste final do step com as configurações devidamente atribuídas.

Perceba que o resultado está no range de data estipulada na variável criada.

Isso reforça o motivo da ordem das variáveis serem importantes, irei trocar e exibir o resultado para demonstração.

A mensagem de erro quando as variáveis foram trocadas. O nome nada afeta, fiquem tranquilos.

INFORMAÇÕES DO SISTEMA

Neste tópico, quero deixar claro que foi feito bem de improviso, até por ainda não ter pleno domínio do step get system info. 

Eu ainda não consegui pegar o campo transformation batch id, mas os outros foram tranquilos!

Neste teste pude perceber que o melhor é criar um para cada transformação, coisa que farei assim que retomar meu projeto.

CONCLUSÃO

Este post teve o intuito de apresentar os conceitos de variáveis e como utiliza-las no PDI.

Decidi dividir em dois pois quero apresentar outros aspectos sobre parâmetros dentro dos jobs e transformações e se utilizasse aqui, acho que ficaria confuso ou muita informação!

Trabalhar com variáveis no PDI não é difícil, mas é preciso se atentar para pequenos detalhes e o modo de processamento que ele funciona!

Lembrem-se que as variáveis só podem ser utilizadas após sua execução, do contrário, elas não são vistas. No próximo post irei abordar essa questão e mostrar como funciona!

Não abordei as variáveis nativas do Pentaho pois elas são muitas e o post ficaria teórico demais, preferi focar nas que podemos e iremos utilizar no dia a dia.

Espero que gostem deste post, saúde!