ETL – Extrair, Transformar e Carregar

ETL - Extrair, Transformar e CarregarAtualmente nos deparamos com uma base imensa de informações na internet, disponível em várias formas: textos, imagens, gráficos, tabelas, números e outros elementos. Por esse motivo, os sistemas de informação ao redor do mundo devem ser capazes de lidar com esse montante de informações e apresentá-las de forma consolidada e compreensível.
Como isso é possível? Simples, através do processo de ETL!

 

O termo ETL vem do inglês “Extract, Transform, Load” e representa um conjunto de funções para extrair dados de diversos sistemas e armazená-los em uma base principal. Este processo é oriundo da área de Business Intelligence, extremamente útil para a continuidade de negócios das empresas.
A ideia por trás do ETL é coletar dados de diferentes fontes, mas que sejam pertinentes a uma única regra de negócio. Após coletados, os dados sofrem uma transformação para entrarem em um padrão aceitável pelo contêiner ou sistema de destino. Por fim, após tratados, os dados são carregados em Data Warehouses – depósitos de dados que armazenam informações consolidadas. Entre esses três estágios, talvez a transformação seja a fase de maior custo, já que, se o formato dos dados extraídos estiverem muito incompatíveis com a estrutura de armazenamento do Data Warehouse, várias regras de transformação deverão ser aplicadas.

Quando falamos em processos de ETL em grandes empresas, estamos nos referindo à vários Gigabytes ou até Terabytes de informação, processados em curtos períodos de tempo para atualização dos depósitos de dados. Como exemplo, podemos citar sistemas estatísticos, redes sociais e portais governamentais, nos quais aceitam documentos ou dados de uma fonte externa.
O LinkedIn, por exemplo, permite que o usuário se cadastre na rede utilizando o login do Facebook que, obviamente, consta em outra base. Nessa integração, o LinkedIn provavelmente aplica um pequeno processo de ETL para transformar os dados disponíveis no Facebook em informações necessárias para o cadastro. Do mesmo modo, ele também pode descartar informações desnecessárias.

Embora utilizado em grandes mecanismos, o ETL não se restringe somente ao armazenamento de dados em Data Warehouses, mas também em bancos de dados relacionais utilizados por softwares. Nós, desenvolvedores, estamos sujeitos a criar processos de ETL em nossos softwares quando for necessário realizar uma leitura de dados que estão compostos em outros locais, como arquivos de texto, planilhas eletrônicas ou documentos XML.

Para facilitar a compreensão deste artigo, o código abaixo apresenta um processo básico de ETL ao carregar informações de uma planilha do Excel.
Em primeiro lugar, vale lembrar que é necessário avaliar o volume de dados e definir as classes, ferramentas e recursos necessários para a operação. No exemplo a seguir, imagine que a planilha contenha os campos Código, Nome, Sexo e Crédito. Logo, criaremos uma classe:

TRegistroPlanilha = class
private
  FCodigo: integer;
  FNome: string;
  FSexo: string;
  FCredito: real;
public
  property Codigo: integer read FCodigo write FCodigo;
  property Nome: string read FNome write FNome;
  property Sexo: string read FSexo write FSexo;
  property Credito: real read FCredito write FCredito;
end;

A declaração das nossas funções serão as seguintes:

function ExtrairDadosPlanilha(Linha: integer): TRegistroPlanilha;
procedure TransformarDados(objRegistro: TRegistroPlanilha);
procedure CarregarDados(objRegistro: TRegistroPlanilha);

Por fim, o código principal que irá executar o processo de ETL será este:

var
  TotalLinhas, LinhaAtual: integer;
  objRegistro: TRegistroPlanilha;
begin
  TotalLinhas := ContarLinhas(ArquivoExcel);
 
  for LinhaAtual := 1 to TotalLinhas do
  begin
    objRegistro := ExtrairDadosPlanilha(LinhaAtual);
    TransformarDados(objRegistro);
    CarregarDados(objRegistro);
  end;
end;

 

1) Extração
A primeira fase consiste em extrair as informações que estão na planilha. No código abaixo, o método extrai os dados da linha indicada pelo parâmetro e preenche uma instância da classe que criamos:

function ExtrairDadosPlanilha(Linha: integer): TRegistroPlanilha;
var
 objRegistro: TRegistroPlanilha;
begin
  objRegistro := TRegistroPlanilha.Create;
 
  objRegistro.Codigo := ArquivoExcel.WorkBooks[1].Sheets[1].Cells[Linha, 1];
  objRegistro.Nome := ArquivoExcel.WorkBooks[1].Sheets[1].Cells[Linha, 2];
  objRegistro.Sexo := ArquivoExcel.WorkBooks[1].Sheets[1].Cells[Linha, 3];
  objRegistro.Credito := ArquivoExcel.WorkBooks[1].Sheets[1].Cells[Linha, 4];
 
  result := objRegistro;
end;

 

2) Transformação
Temos um problema! Na planilha, o sexo masculino está armazenado como 1 e o sexo feminino como 2, porém, na nossa base de dados, os armazenamos como ‘M’ e ‘F’, respectivamente. Além disso, é necessário gravar o nome da pessoa em maiúsculas e realizar um acréscimo de 5% no crédito que consta na planilha.
A etapa de transformação atende justamente as situações mencionadas acima. Nós temos um padrão na base de dados e não desejamos que as informações fiquem incompatíveis ou ilegíveis, dificultando a busca de dados ou a geração de relatórios. Portanto, é necessário realizar esse tratamento para que os dados obedeçam aos nossos padrões:

procedure TransformarDados(objRegistro: TRegistroPlanilha);
begin
  // converte o nome para letras maiúsculas
  objRegistro.Nome := UpperCase(objRegistro.Nome);
 
  // transforma '1' em 'M' e '2' em 'F'
  if objRegistro.Sexo = '1' then
    objRegistro.Sexo := 'M'
  else if objRegistro.Sexo = '2' then
    objRegistro.sexo := 'F';
 
  // aplica um acréscimo de 5% no crédito
  objRegistro.Credito := objRegistro.Credito + objRegistro.Credito * 0.05;
end;

 

3) Carga
Bem, agora que os dados estão coerentes, finalmente podemos armazená-los no nosso banco de dados:

procedure CarregarDados(objRegistro: TRegistroPlanilha);
begin
  DataSet.Append;
  DataSet.FieldByName('Codigo').AsInteger := objRegistro.Codigo;
  DataSet.FieldByName('Nome').AsString := objRegistro.Nome;
  DataSet.FieldByName('Sexo').AsString := objRegistro.Sexo;
  DataSet.FieldByName('Credito').AsFloat := objRegistro.Credito;
  DataSet.Post;
end;

 

Apesar de bem simples, o exemplo acima demonstra os passos realizados em um processo de ETL. Acredito que você já tenha desenvolvido algo parecido, não é? A propósito, um exemplo de importação de planilha do Excel pelo Delphi está disponível na página de Exemplos!
Agora faça o seguinte: extraia as informações deste artigo, transforme-as conforme sua compreensão e carregue-as na sua mente para nunca mais esquecer o que é ETL!

 

Abraço, leitores!


 

Compartilhe!
Share on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Pin on PinterestEmail this to someone

Deixe uma resposta

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

Preencha o campo abaixo * Time limit is exhausted. Please reload CAPTCHA.