Skip to content

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.