Gold — Modelagem Dimensional Kimball
A camada GOLD implementa um modelo dimensional em estrela (Star Schema) segundo Ralph Kimball, lendo dados do SILVER.
Posição no pipeline
flowchart LR
SV[Silver limpo] --> GL[Gold Star Schema]
Modelo Dimensional (Star Schema)
O modelo consiste em 5 dimensões e 1 tabela de fatos.
Diagrama do Star Schema (Kimball)
flowchart LR
dim_cat[dim_categoria]
dim_aut[dim_autor]
dim_liv[dim_livro]
dim_mem[dim_membro]
dim_tmp[dim_tempo]
FATO[fato_emprestimo]
dim_cat --> dim_liv
dim_aut --> dim_liv
dim_mem --> FATO
dim_liv --> FATO
dim_tmp --> FATO
Dimensões
- dim_categoria — Categorias de livros
- dim_autor — Autores
- dim_livro — Livros (com FKs naturais para categoria e autor)
- dim_membro — Membros da biblioteca
- dim_tempo — Dimensão temporal com atributos (ano, mês, trimestre, etc.)
Tabela de Fatos
- fato_emprestimo — Eventos de empréstimo com chaves surrogate para as dimensões aplicáveis
Surrogate Keys — exemplo real (dim_categoria)
Trecho do notebook notebooks/03_silver_to_gold/gold.py:
df_categoria = spark.table("SILVER.categoria").drop("dt_processamento")
window_spec = Window.orderBy("id_categoria")
df_dim_categoria = (
df_categoria
.withColumn(
"sk_categoria",
F.row_number().over(window_spec)
)
)
(
df_dim_categoria.write
.format("delta")
.mode("overwrite")
.option("overwriteSchema", "true")
.saveAsTable("GOLD.dim_categoria")
)
Fato com joins às dimensões — exemplo real
Construção de fato_emprestimo com surrogate keys e enriquecimento (trecho representativo do mesmo notebook):
df_emp = spark.table("SILVER.emprestimo").drop("dt_processamento")
df_dim_membro = spark.table("GOLD.dim_membro")
df_dim_livro = spark.table("GOLD.dim_livro")
df_dim_tempo = spark.table("GOLD.dim_tempo")
df_fato = (
df_emp
.join(
df_dim_membro.select("id_membro", "sk_membro"),
on="id_membro",
how="inner"
)
)
df_fato = (
df_fato
.join(
df_dim_livro.select("id_livro", "sk_livro"),
on="id_livro",
how="inner"
)
)
df_fato = (
df_fato
.join(
df_dim_tempo.select("sk_tempo", "data").withColumnRenamed("data", "data_emprestimo_join"),
on=F.col("data_emprestimo") == F.col("data_emprestimo_join"),
how="inner"
)
.drop("data_emprestimo_join")
)
df_fato = df_fato.withColumnRenamed("sk_tempo", "sk_tempo_emprestimo")
Notebook: notebooks/03_silver_to_gold/gold.py
O notebook Gold cria as dimensões, a dimensão tempo a partir das datas de empréstimo, monta fato_emprestimo com integridade referencial verificável e materializa tudo no schema GOLD em Delta Lake.
Automação
A materialização Gold é a última etapa típica do Job: após Silver bem-sucedido, executa-se o notebook Gold para entregar o esquema em estrela pronto para consumo analítico. Veja Jobs & Pipelines.