Fala pessoal, como estão?! Espero que estejam bem!

No post de hoje gostaria de compartilhar com vocês como utilizar o group by no Pentaho.

Essa transformação permite um alívio da camada de banco, pois sabemos que queries que envolvem group by costumam ser mais pesadas que o normal!

Muito utilizado para desenvolvermos tabelas fato com algum tipo de acúmulo que precisa de um agrupamento por uma determinada coluna. 

Sem mais, vamos ao post!

GROUP BY

Assim como em banco de dados, group by simplesmente agrupa seu resultado de acordo com uma variável desejada, diferente da linguagem SQL que pede que todas as colunas do select estejam no group by, aqui, basta escolher uma e ele agrupa o resultado.

Outro ponto positivo de utilizar group by no Pentaho é que ele possui duas formas de se executar: Group by  e Memory Group by. 

Veremos abaixo os dois tipos de transformação.

Primeiro veremos a transformação do group by. Essa transformação em alguns casos pode obrigar o uso do sort rows, dependendo de como os dados estão dispostos na tabela. 

Caso não utilize, pode ser que os cálculos saiam de forma inconsistente, ou, demorem ainda mais para serem agregados.

Para este exemplo eu executei um select simples na tabela sales.salesorderdetail, como podem ver abaixo:

Eliminei algumas colunas, apenas para título de exemplo mesmo com o select values. 

Agora, vamos configurar o group by e quais campos  e POR qual ou quais queremos criar agregações.

No meu exemplo, coloquei para agregar pela coluna salesorderid, mas poderia adicionar outras, se fosse necessário.

Antes de mostrar o resultado, algumas coisas que precisam de uma breve explicação:

  • Temporary files directory – é o diretório padrão ou, se quiser customizar e indicar um diferente, onde os arquivos temporários ficarão para a agregação da transformação.
  • TMP-file prefix – é simplesmente o prefixo que o arquivo temporário terá no diretório.
  • Always give back a result row – garante um resultado consistente nas agregações independente do cálculo. Não altera o resultado em si, apenas torna-o mais assertivo.
  • Add line number –  é o número de linhas que um determinado grupo de agregação tem e reinicia ao final deste grupo.

NOTA: no exemplo, apenas somei a coluna unit price; não houve nenhum outro cálculo feito entre outras colunas. 

ALWAYS GIVE BACK A RESULT ROW

Veja abaixo, a execução da mesma agregação com este recurso desabilitado.

Como percebemos, o resultado final foi o mesmo!

INCLUDE ALL ROWS

Reparem os dois resultados abaixo e comparem:

Percebam que o resultado da primeira execução foi mais detalhado, retornando todas as linhas para o pedido 43659, diferente do segundo, que foi consolidado.

Isso acontece quando desativamos a caixa de diálogo include all rows na configuração do group by

Ele resume o resultado, agregando apenas no id do pedido – visto que foi essa coluna que utilizei como agrupador – retornando a soma total em uma única linha.

MEMORY GROUP BY

Esta é uma forma de agrupamento mais simples, tratada totalmente na memória e que NÃO precisa do step de sort rows para consistência do resultado.

Por ser processado totalmente na memória ela agrupa e processa de forma mais rápida.

Mas tenha cuidado com esse step, se for um volume de dados muito grande para ocupar espaço e gerar concorrência de memória no ambiente, o melhor é utilizar o group by tradicional com o sort rows. 

Vejam que a configuração é bem mais simples do que o group by tradicional.

Como o memory group by foi desenhado para trabalhar com linhas não ordenadas, ele acaba retornando o resultado da forma mais rápida e isso nem sempre traz o ordenamento natural, veja:

O resultado veio do final para o início.

Outro ponto positivo da transformação do group by é a sua variedade de operações executáveis.

Sendo que o memory group by possui menor quantidade de recursos. Veja a comparação.

CONCLUSÃO

Este foi um post para mostrar o recurso de agrupamento e como ele funciona dentro de um processo de ETL.

Como podemos ver, temos duas formas de realizar estas tarefas cabendo a escolha para o melhor cenário, lembre-se:

  • Group by – se sai melhor em cenários com grandes quantidade de dados por não gerar grande concorrência de memória
  • Memory Group by – é melhor para pequenas amostras por ser mais rápido.

Deixem sempre o always give back a result row ativo para maior consistência dos resultados.

Espero que tenham gostado, saúde!