quinta-feira, 25 de outubro de 2012

Substring

Existem algumas formas de obtermos pedaços de um texto ou string no Kettle, no entanto gostaria de demonstrar rapidamente como usar a maneira mais simples e adequada, através do step Strings Cut, que pode ser encontrado na aba Transform.
 
Primeiramente, é importante deixar claro que, caso o usuário tente pegar o substring de um campo numérico, data, ou qualquer outro que não seja um string/texto, o Kettle interromperá a execução e exibirá um erro.    Se em alguma parte do processo isso for necessário, será importante realizar a conversão prévia do data type.
 
Observe abaixo que, em nosso exemplo, vamos utilizar o step Generate Rows para criar um campo e simular um valor para recuperarmos o substring.
 
 
 


 
 
Vamos para as propriedades do Strings Cut:
  1. A contagem começa do zero, ou seja, a primeira posição é o 0;
  2. O step corta os pedaços de acordo com a posição inicial e a posição final.    É muito comum confundirmos o uso deste step com a lógica da função substring do SQL ou Javascript, que normalmente recebe a posição inicial e o número de casas/caracteres a partir dela.    Neste caso, coloque no campo Cut from a posição inicial e no campo Cut to a posição final;
  3. O campo In stream field recebe o campo texto onde será aplicado o corte;
  4. O campo Out stream field recebe o nome do campo criado com o corte;
  5. Caso você coloque o Out stream field com o nome de um campo que já existe, o Kettle criará um novo campo seguido de _1.    Ex: se voce colocar o nome do Out stream field como CampoSubstring e este campo já existir, o Kettle mantém o campo original com o mesmo nome e valor, além de criar o campo CampoSubstring_1, que receberá o campo criado neste step.
 
 
Por fim, fazendo um simples preview, teremos o seguinte resultado:
 
 
 
Além do step Strings Cut, poderíamos utilizar o step Formula ou até o Modified Java Script Value para obter o mesmo resultado, porém é aconselhado evitar o uso de scripts quando desejamos melhorar a performance de execução do ETL.
 

segunda-feira, 1 de outubro de 2012

Group by e Funções de Agregação

Até hoje não explicamos como aplicar a cláusula Group by no Kettle.   Para quem já tem uma ideia de como aplicá-la em um Select, não haverá problemas para identificar a melhor forma de preencher os atributos do step que já leva o mesmo nome da cláusula.

Para encontrar o step Group by, basta acessar a guia "Statistics".    

A única premissa para a utilização deste step, é a de que os campos agrupados precisam estar ordenados antes de chegar ao step.    Adotando uma prática simples, o ideal é que sempre utilizemos um step Sort Rows imediatamente antes do Group by, para garantir que os dados chegarão devidamente ordenados ao step de agrupamento.


Observe pela figura acima que estamos selecionando todos os alunos matriculados durante o ano letivo de 2012 em uma determinada instituição de ensino, buscando seus respectivos cursos, matérias cursadas e notas recebidas em cada matéria.
Com um cenário deste, podemos imaginar uma série de exemplos de agrupamento.    Podemos pegar o aluno de maior ou menor nota, a média das notas de cada aluno durante todo o ano, a média de notas em determinado curso, em determinada matéria, entre outros.

Mostraremos agora um pequeno exemplo de utilização do step Group by, com o intuito de obter apenas a média de notas de cada aluno em todas as matérias cursadas por ele durante todo o ano.



Ex:
Luciano Peixoto - Cálculo A - 6,5
Luciano Peixoto - Lógica Computacional - 8,0
Luciano Peixoto - Gerencia de Projetos - 7,0
Luciano Peixoto - Engenharia de Software - 6,0

O resultado deste agrupamento seria:
Luciano Peixoto - 6,875

Para isso, teríamos que primeiramente ordenar os registros de nosso fluxo pelo nome dos alunos, utilizando por exemplo, o Sort Rows.



Depois disso, definimos apenas as características de nosso agrupamento no step Group by, conforme demonstra a figura abaixo:



Apenas de termos escolhido realizar o cálculo da média de notas de cada aluno, poderíamos de feito a soma destes valores, contado o número total de valores ou o número de valores distintos, escolhido o maior ou menor valor de nota para cada aluno, concatenado todos os valores divididos por vírgulas, entre outras opções.

É importante lembrarmos que apenas os campos selecionados como agrupadores e os campos criados neste step continuarão no fluxo.   Todos os outros campos não passarão adiante, visto que, caso continuassem, o agrupamento não faria o menor sentido ou causaria uma grande confusão na visualização dos dados.

Além disso, todos os valores numéricos sairão deste step com formatação 0.0.   Isso significa que, primeiramente, o resultado de nosso exemplo ao invés de aparecer como 6.875, seria arredondado para 6.9.    Utilizando o step Select Values logo em seguida e convertendo o formato deste campo (mediaNotas) para Number com formato 0.00 ou 0.000, ele converteria o número para o seu resultado correto.