Atualmente 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!
Introdução
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.
Exemplo de ETL
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:
1 2 3 4 5 6 7 8 9 10 11 12 |
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:
1 2 3 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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:
1 2 3 4 5 6 7 8 9 |
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!
Bom dia André, não achei esse exemplo na página de exemplos, poderia me passar o mesmo? Quero ter uma base melhor.
Estou com uma tarefa na empresa de atualizar algumas tabelas no banco de dados dos clientes que estão com dados bem antigos, acho que o conceito de ETL irá me ajudar.
Olá, Pedro, boa noite!
Infelizmente não tenho mais o exemplo. De qualquer forma, o projeto de exemplo era um réplica do código que está no artigo, sem nada a acrescentar.
Caso você tenha alguma dúvida sobre o código ou sobre o conceito de ETL, sinta-se à vontade para enviar um e-mail para [email protected].
Abraço!