top of page

Databricks: Como funciona o Column Mapping (Rename e Drop columns)

Fala dataholics, o post de hoje será bem divertido e vamos desmistificar o que é e como funciona o Column Mapping.


Primeiramente é importante ressaltar que as tabelas delta possuem um protocolo de versionamento para controlar a evolução das features, essa imagem mostra as features disponíveis para cada protocolo:

O que isso quer dizer? Isso significa que na maioria das vezes que você cria uma nova tabela, você esta criando com as funcionalidades básicas, ou seja, Writer = 2, Reader =1, nessa versão não tem CDF, Check Constraints ou o Column Mapping.

Se você já criar a tabela com CDF habilitado, sua versão será Writer = 4, Reader = 1.


Veja este exemplo:

Criei uma tabela simples, em seguida consultando sua versão, note que ela vem com Writer = 2, Reader = 1.


Bom, vamos seguir a partir deste exemplo, algum tempo depois da criação da tabela surgiu a necessidade de adicionar uma nova coluna para saber a idade da pessoa, então vamos lá adicionar essa coluna.


Até aqui, tudo certo, nova coluna chamada "idade" adicionada e populada.


Passado mais algum tempo, surge a necessidade de alterar o nome da coluna de "idade" para "age", para padronizar a tabela, mas, sua tabela já está bem grande e recriar seria uma dor imensa, então vamos apenas renomear a coluna certo?

Ops! Não conseguimos renomear uma coluna nessa versão da tabela, ele pede para usarmos o "Column Mapping" e como vimos na primeira imagem o column Mapping é apenas na versão mais recente Writer = 5, Reader = 2.


Aqui entra a primeira pergunta, por que não conseguimos renomear a coluna?


Vamos para os delta logs (não vou conseguir mostrar cada detalhezinho (vale um video?)), vou abrir o arquivo de log onde armazena o Schema (.crc) e vou abrir um arquivo físico de dados (.parquet) onde estão os dados da versão atual.


Esse é o trecho do schema atual, note as propriedades da coluna idade, nada de novo né?


Essa é a leitura direta do arquivo parquet (a tabela delta salva os dados em parquet, se é novo para você, long history rs). Aqui comprovamos que a coluna "idade" esta fisicamente no arquivo, guarde essa informação.



Ou seja, para eu renomear uma coluna, eu teria que alterar todos os arquivos parquet daquela tabela, sem dúvidas isso seria muito custoso e difícil de manter a integridade (ACID) sem um controle de locks por exemplo.

Então vou precisar realizar um upgrade da minha tabela delta para poder renomear a coluna, pois, nesse nosso exemplo ela é muito grande e não vai valer a pena uma recarga FULL.


Upgrade para Writer = 5 e Reader = 2, na terceira propriedade estamos habilitando o column mapping por name (nome da coluna, por Id ainda não está disponível).

Esse processo é irreversível, não existe downgrade, apenas recriando a tabela.


Pronto, agora bora para o Rename novamente e tudo certo conforme o esperado.


O que está por trás dos panos? Vamos buscar no delta log os segredos, vou pegar o novo .crc e vamos analisar.

Eis a mágica por trás dos panos, o column mapping cria um metadado e salva o nome da coluna física, basicamente ele cria um Alias (apelido) para a nova coluna.


Ou seja, fisicamente dentro do .parquet a coluna continua se chamando "idade", vamos confirmar?


Vou apenas inserir um novo registro para garantir, veja que nossa tabela agora tem 3 registros, um deles a coluna "age" esta null, pois foi o primeiro registro quando ela ainda não existia.


E olha só isso, no arquivo físico continua como "idade".

Estou lendo o arquivo parquet diretamente, se eu ler a tabela Delta a engine usará o Column Mapping e apresentará como "Age".


Então é tudo de bom essa feature, vou fazer Upgrade agora aqui!



Calma la, não é bem assim, vamos aos detalhes, primeiramente essa feature está em public preview, então estude bem antes de colocar em produção, isso não quer dizer que você não pode usá-la, com certeza em breve ela estará em GA, mas fique ciente que novas correções podem ser lançadas.


Existem limitações para trabalhar com Streaming ou Change Data feed + Column Mapping, segundo a documentação as leituras podem sofrer bloqueios nesse cenário, avalie com cuidado se é o seu caso.


Se você estiver usando CDF + Column Mapping e dropar ou renomear uma coluna, você pode quebrar o processo.


Referências:


Espero que esse post tenha agregado mais conhecimento, qualquer dúvida só chamar.


Fique bem e até a próxima.



446 visualizações0 comentário

Comments


Post: Blog2 Post
bottom of page