Construindo os Fluxos de Trabalho ETL de Dimensão
por Lorenz Verzosa, Krishna Satyavarapu, Peyman Mohajerian, Jesse Heravi e Bryan Smith
à medida que as organizações consolidam as cargas de trabalho de anÔlise para o Databricks, muitas vezes precisam adaptar técnicas tradicionais de armazém de dados. Esta série explora como implementar a modelagem dimensional - especificamente, esquemas estrela - no Databricks. O primeiro blog focou no design do esquema. Este blog percorre os pipelines ETL para tabelas de dimensão, incluindo Dimensões Lentamente MutÔveis (SCD) Tipo-1 e padrões Tipo-2. O último blog mostrarÔ como construir pipelines ETL para tabelas de fatos.
No último blog, definimos nosso esquema estrela, incluindo uma tabela de fatos e suas dimensões relacionadas. Destacamos uma tabela de dimensão em particular, DimCustomer, como mostrado aqui (com alguns atributos removidos para economizar espaço):
Os trĆŖs Ćŗltimos campos nesta tabela, ou seja, StartDate, EndDate e IsLateArriving, representam metadados que nos auxiliam na versionamento de registros. Ć medida que a renda, estado civil, propriedade de casa, nĆŗmero de filhos em casa ou outras caracterĆsticas de um determinado cliente mudam, queremos criar novos registros para esse cliente para que fatos como nossas transaƧƵes de vendas online em FactInternetSales estejam associados Ć representação correta desse cliente. A chave natural (tambĆ©m conhecida como chave de negócio), CustomerAlternateKey, serĆ” a mesma em todos esses registros, mas os metadados serĆ£o diferentes, permitindo-nos saber o perĆodo em que essa versĆ£o do cliente era vĆ”lida, assim como a chave substituta, CustomerKey, permitindo que nossos fatos se liguem Ć versĆ£o correta.Ā Ā
NOTA: Como a chave substituta Ć© comumente usada para vincular fatos e dimensƵes, as tabelas de dimensĆ£o sĆ£o frequentemente agrupadas com base nesta chave. Ao contrĆ”rio dos bancos de dados relacionais tradicionais que utilizam Ćndices b-tree em registros ordenados, o Databricks implementa um mĆ©todo de agrupamento Ćŗnico conhecido como agrupamento lĆquido. Embora os detalhes do agrupamento lĆquido estejam fora do escopo deste blog, usamos consistentemente a clĆ”usula CLUSTER BY na chave substituta de nossas tabelas de dimensĆ£o durante sua definição para aproveitar efetivamente esse recurso.
Esse padrão de versionamento de registros de dimensão à medida que os atributos mudam é conhecido como o Padrão de Dimensão Lentamente MutÔvel Tipo-2 (ou simplesmente padrão SCD Tipo-2). O padrão SCD Tipo-2 é preferido para registrar dados de dimensão na metodologia dimensional clÔssica. No entanto, existem outras maneiras de lidar com mudanças nos registros de dimensão.
Uma das maneiras mais comuns de lidar com a mudança de valores de dimensão é atualizar os registros existentes no local. Apenas uma versão do registro é criada, de modo que a chave de negócio permanece como o identificador único para o registro. Por vÔrios motivos, não menos importante são desempenho e consistência, ainda implementamos uma chave substituta e vinculamos nossos registros de fato a essas dimensões nessas chaves. Ainda assim, os campos de metadados DataInicial e DataFinal que descrevem os intervalos de tempo durante os quais um determinado registro de dimensão é considerado ativo não são necessÔrios. Isso é conhecido como o padrão SCD Tipo-1. A dimensão Promoção em nosso esquema estrela fornece um bom exemplo de uma implementação de tabela de dimensão Tipo-1:
Mas e o campo IsLateArriving de metadados visto na dimensão do Cliente do Tipo-2, mas ausente na dimensão da Promoção do Tipo-1? Este campo é usado para marcar registros como chegadas tardias. Um registro de chegada tardia é aquele para o qual a chave de negócio aparece durante um ciclo ETL de fatos, mas não hÔ registro para essa chave localizado durante o processamento de dimensão anterior. No caso dos SCDs do Tipo-2, este campo é usado para denotar que quando os dados para um registro de chegada tardia são observados pela primeira vez em um ciclo ETL de dimensão, o registro deve ser atualizado no local (assim como em um padrão SCD do Tipo-1) e então versionado a partir desse ponto. No caso dos SCDs do Tipo-1, este campo não é necessÔrio porque o registro serÔ atualizado no local, independentemente.
NOTA: O Grupo Kimball reconhece padrões SCD adicionais, a maioria dos quais são variações e combinações dos padrões Tipo-1 e Tipo-2. Como os SCDs Tipo-1 e Tipo-2 são os mais frequentemente implementados desses padrões e as técnicas usadas com os outros estão intimamente relacionadas ao que é empregado com estes, estamos limitando este blog a apenas esses dois tipos de dimensão. Para mais informações sobre os oito tipos de SCDs reconhecidos pelo Grupo Kimball, consulte a seção Técnicas de Dimensão Lentamente MutÔvel deste documento.
Com os dados sendo atualizados no local, o padrão de fluxo de trabalho SCD Tipo-1 é o mais direto dos padrões ETL bidimensionais. Para suportar esses tipos de dimensões, simplesmente:
Para ilustrar uma implementação SCD Tipo-1, definiremos o ETL para o preenchimento contĆnuo da tabela DimPromotion.
Nosso primeiro passo Ć© extrair os dados de nosso sistema operacional. Como nosso data warehouse Ć© baseado no banco de dados de exemplo AdventureWorksDW fornecido pela Microsoft, estamos usando o banco de dados de exemplo AdventureWorks (OLTP) como nossa fonte. Este banco de dados foi implantado em uma instĆ¢ncia do Azure SQL Database e tornou-se acessĆvel em nosso ambiente Databricks por meio de uma consulta federada. A extração Ć© entĆ£o facilitada com uma simples consulta (com alguns campos redigidos para economizar espaƧo), com os resultados da consulta persistidos em uma tabela em nosso esquema de staging (que Ć© acessĆvel apenas para os engenheiros de dados em nosso ambiente atravĆ©s de configuraƧƵes de permissĆ£o nĆ£o mostradas aqui). Esta Ć© apenas uma das muitas maneiras que podemos acessar os dados do sistema de origem neste ambiente:
Supondo que nĆ£o temos etapas adicionais de limpeza de dados para realizar (que poderĆamos implementar com um UPDATE ou outro comando CREATE TABLE AS), podemos entĆ£o lidar com nossas operaƧƵes de atualização/inserção de dados de dimensĆ£o em uma Ćŗnica etapa usando um comando MERGE, combinando nossos dados em estĆ”gio e dados de dimensĆ£o na chave de negócio:
Uma coisa importante a notar sobre a declaração, como foi escrita aqui, Ć© que atualizamos quaisquer registros existentes quando uma correspondĆŖncia Ć© encontrada entre os dados da tabela de dimensĆ£o em estĆ”gio e publicada. PoderĆamos adicionar critĆ©rios adicionais Ć clĆ”usula WHEN MATCHED para limitar as atualizaƧƵes Ć quelas instĆ¢ncias em que um registro em estĆ”gio tem informaƧƵes diferentes do que Ć© encontrado na tabela de dimensĆ£o, mas, dado o nĆŗmero relativamente pequeno de registros nesta tabela especĆfica, optamos por empregar a lógica relativamente mais enxuta mostrada aqui. (Usaremos a lógica adicional WHEN MATCHED com DimCustomer, que contĆ©m muito mais dados.)
O padrão SCD do tipo 2 é um pouco mais complexo. Para suportar esses tipos de dimensões, devemos:
Como no padrĆ£o SCD Tipo-1, nossos primeiros passos sĆ£o extrair e limpar os dados do sistema de origem. Usando a mesma abordagem acima, emitimos uma consulta federada e persistimos os dados extraĆdos em uma tabela em nosso staging schema:
Com esses dados carregados, agora podemos comparÔ-los com nossa tabela de dimensão para fazer quaisquer modificações de dados necessÔrias. A primeira delas é atualizar no local quaisquer registros marcados como chegadas tardias de processos ETL de tabela de fatos anteriores. Por favor, note que essas atualizações são limitadas àqueles registros marcados como chegadas tardias e a IsLateArriving flag estÔ sendo redefinida com a atualização para que esses registros se comportem como SCDs do Tipo-2 normais daqui para frente:
O próximo conjunto de modificações de dados é para expirar quaisquer registros que precisam ser versionados. à importante que o EndDate valor que definimos para estes corresponda ao StartDate da nova versão do registro que implementaremos na próxima etapa. Por essa razão, definiremos um timestamp variÔvel para ser usado entre essas duas etapas:
NOTA: Dependendo dos dados disponĆveis para vocĆŖ, pode optar por usar um valor EndDate originĆ”rio do sistema de origem, momento em que nĆ£o necessariamente declararia uma variĆ”vel como mostrado aqui.
Por favor, note os critĆ©rios adicionais usados na clĆ”usula WHEN MATCHED.Ā Como estamos realizando apenas uma operação com esta declaração, seria possĆvel mover essa lógica para a clĆ”usula ON, mas a mantivemos separada da lógica de correspondĆŖncia central, onde estamos correspondendo Ć versĆ£o atual do registro de dimensĆ£o para clareza e manutenibilidade.
Como parte desta lógica, estamos fazendo uso intensivo da função equal_null(). Esta função retorna TRUE quando o primeiro e o segundo valores são iguais ou ambos NULL; caso contrÔrio, retorna FALSE. Isso fornece uma maneira eficiente de procurar mudanças em uma base de coluna por coluna. Para mais detalhes sobre como o Databricks suporta semântica NULL, consulte este documento.
Nesta etapa, quaisquer versƵes anteriores de registros na tabela de dimensĆ£o que expiraram foram datadas para o fim.Ā Ā
Agora podemos inserir novos registros, tanto verdadeiramente novos quanto recƩm-versionados:
Como antes, isso poderia ter sido implementado usando uma declaração INSERT, mas o resultado é o mesmo. Com esta declaração, identificamos quaisquer registros na tabela de estÔgio que não têm um registro correspondente não expirado nas tabelas de dimensão. Esses registros são simplesmente inseridos com um valor StartDate consistente com quaisquer registros expirados que possam existir nesta tabela.
Com as dimensões implementadas e preenchidas com dados, agora podemos nos concentrar nas tabelas de fatos. No próximo blog, demonstraremos como o ETL para essas tabelas pode ser implementado.
Para saber mais sobre o Databricks SQL, visite nosso website ou leia a documentação. VocĆŖ tambĆ©m pode conferir o tour do produto Databricks SQL. Suponha que vocĆŖ queira migrar seu armazĆ©m existente para um armazĆ©m de dados sem servidor de alto desempenho, com uma ótima experiĆŖncia do usuĆ”rio e um custo total mais baixo. Nesse caso, o Databricks SQL Ć© a solução ā experimente gratuitamente.
Ā
(This blog post has been translated using AI-powered tools) Original Post
Assine nosso blog e receba os posts mais recentes diretamente na sua caixa de entrada.