top of page

Delta Lake - Nunca mais leia Parquets

Fala dataholics, esse post é da série de dicas rápidas e da mesma série "O óbvio precisa ser dito", vamos falar um pouco sobre Parquet Files.


O que veremos nesse post:

  • Delta Engine

  • Lendo arquivos Parquet de tabelas Delta

  • Delta vs Parquet

  • delta.formatCheck.enabled

  • Considerações finais


 

Delta Engine


Sem dúvidas o formato de arquivo Parquet é um dos mais aceitos no mundo de Big data, é suportado por quase todas as ferramentas de ETL\ELT e Data Warehouses, trabalha com formato colunar, logo sua compressão de dados é altamente eficiente, extremamente performático para nosso mundo de Analytics onde precisamos ler grandes massas de dados, é open source e agnóstico a linguagem de programação.


Ora, se ele é tão bom assim, logo esse post é apenas clickbait?!


Não, deixa explicar alguns pontos importantes e interessantes.


O Delta Lake que é uma engine de processamento, utilizando como base os Data Lakes (Storages), para a criação do Delta eles precisaram escolher um formato de arquivo para armazenar os dados, assim como SGBDs como SQL Server tem seus próprios formatos de arquivos, o propósito principal era criar uma engine poderosa com features de um SGBD, mas, precisavam escolher um formato de arquivo aberto (open source) e que fosse mais eficiente para a maioria dos cenários de Analytics, o formato de arquivo escolhido foi o PARQUET.

Leia mais sobre ele nesse link:


Logo, nossas tabelas Delta são basicamente compostas por arquivos Parquets (Dados) e arquivos Jsons (Logs).

Então, agora ao invés de criar tabelas puramente no formato Parquet como era antigamente, passamos a criar tabelas no formato Delta, que internamente usa Parquet para armazenar os dados.

 

Lendo arquivos Parquet


Para quem está migrando agora para o Delta, ou até mesmo para quem já usa Delta, mas também usa tabelas Parquet em outros ambientes, pode em algum momento se confundir, pois, você pode ler diretamente os arquivos parquets da tabela Delta, eles são formato aberto e qualquer ferramenta consegue ler, aqui é onde alguns podem cometer equívocos.


Deixa eu exemplificar.


Vamos criar nossa tabela Delta usando o Azure Databricks.


Agora vamos olhar no Storage, note que temos a pasta de logs (_delta_log) e os arquivos de dados na raiz, poderiam estar dentro de subpastas caso sua tabela fosse particionada, são arquivos Parquets convencionais.


E se eu ler os Parquets ao invés de ler Delta?


Funciona "perfeitamente", olha retornou as mesmas 5165 linhas.

Obs: Note que estou usando SQL, informando o formato da tabela através da palavra parquet.


Onde esta a armadilha então?


Vamos executar 1 Update na nossa tabela Delta, na imagem abaixo após o Update estou fazendo o Select logo em seguida e veja que lendo a tabela delta diretamente, tenho os mesmos 5165 registros e com o Update aplicado.


Porém, agora no Storage tenho 2 arquivos de dados, praticamente com o mesmo tamanho, então agora temos possibilidade de Time Travel.


Vamos relembrar o funcionamento da engine Delta, ela não faz alteração em arquivos, o que ela executa é a remoção e adição de novos arquivos, observe na imagem abaixo o Json dessa transação de Update, note que no REMOVE (linha 40) ele informa que o arquivo não faz mais parte da tabela e no ADD (linha 56), ele cria um novo arquivo com os mesmos 5165 registros, pelo fato da tabela ser bem pequena, esta tudo em 1 arquivo.


Vamos ler os Parquets novamente, e agora note que todos os dados estão duplicados, mais de 10 mil registros.

Isso pelo fato que o mecanismo que faz a leitura do Parquet não consegue interpretar o Transacion Log (_delta_log) para saber quais arquivos são de fato elegíveis para a versão mais recente da tabela, então ele faz a leitura de todos como se fossem uma única tabela.


Por esse motivo, sempre que você trabalhar com tabelas Delta, nunca se deve ler diretamente os arquivos Parquet, você estará lendo uma versão totalmente incorreta dos dados.

 

Tabelas Parquets vs Delta

Ambas as tabelas serão baseadas em arquivos Parquet, o que muda é a Engine que efetua o processamento dos dados.


Quando falamos de Delta, não estamos falando de um formato de arquivo e sim de uma Engine de processamento que traz features de um SGBD, exemplo o ACID, para poder garantir o ACID o Delta cria uma pasta chamada _delta_log, conhecida como Transaction Log, onde todas as operações na sua tabela Delta são registradas.


Quando você trabalha com arquivos Parquet, a engine não tem capacidade de aplicar ACID, simplesmente porque ela não foi preparada para isso, ela não tem um Transaction Log para garantir tais funcionalidades e o seu mecanismo é bem mais simples, tanto que você não consegue nem realizar um UPDATE em uma tabela no formato Parquet.


Então comparar Parquet vs Delta é simplesmente uma comparação de engine de processamento e não de formato de arquivo!


Entenda engine de processamento como uma aplicação, o Delta é como se fosse uma aplicação embutida dentro do Spark e várias outras ferramentas, trazendo para elas muitas features de SGBDs operando sobre Data Lakes.

 

delta.formatCheck.enabled

Mas de tanto isso acontecer, acredite, acontecia e pode acontecer até hoje com outras ferramentas além do Spark, a Databricks criou um bloqueio para isso, então sempre que alguém tentar ler parquets de uma tabela Delta, ela tomara o erro abaixo:

[UNSUPPORTED_DATASOURCE_FOR_DIRECT_QUERY] Unsupported data source type for direct query on files: parquet


Nesse caso o óbvio é explicitamente dito, informando que você não pode fazer isso.


Para o exemplo que mostrei, ajustei esse parâmetro para false, assim conseguimos ler os parquets, para um caso de troubleshooting ou fins de estudos ele pode ser útil.

SET spark.databricks.delta.formatCheck.enabled=false

Mas, Reginaldo esse parâmetro é só no Databricks? Sim! Se você estiver lendo com outras engines exemplo o Azure Synapse, você conseguirá ler os Parquets de uma tabela Delta, por isso o conhecimento sobre o funcionamento das tabelas Delta é extremamente importante, para que você não cometa esse equivoco.

 

Resumindo o post, o ponto que quis trazer é sobre o funcionamento da engine Delta, se você estiver utilizando tabelas Delta nunca leia os parquets diretamente.

Não estou falando para você não utilizar mais parquet em nada, ele é um formato de arquivo poderoso e você vai utilizá-lo em vários outros pontos da sua arquitetura, mas quando se trata de Delta, mesmo sabendo que os dados estão em parquets, abstraia isso, sempre entenda como uma tabela Delta.


Fique bem e até a próxima.


Link github.

Referencias:





725 visualizações0 comentário

Comments


Post: Blog2 Post
bottom of page