← Volver al blog
Delta LakePySparkACID

Arquitectura medallón en Fabric (parte 4): limpiando los datos y creando la tabla Delta

Cómo eliminar duplicados, tratar nulos y guardar la tabla Delta fato_vendas en Fabric, y qué hay debajo de una tabla Delta: Parquet, Delta log y ACID.

MA
Allen87Data Engineer
· 5 min de lectura
Portada oscura con el texto en portugués Medalhão no Fabric, Parte 4: tratando dados e tabela Delta, y un fragmento de código

Esta es la parte 4 de la serie sobre arquitectura medallón en Microsoft Fabric. En la parte 3 leímos el CSV en silver, todavía en bruto. Ahora vamos a tratar los datos y guardarlos como una tabla Delta.

En una frase: limpiamos los datos con PySpark y los guardamos como tabla Delta, un formato confiable.

Mapa de la serie: la capa silver está destacada

Tratando los datos

En una segunda celda del notebook nb_transformacao_silver, trato los problemas del CSV y guardo el resultado como tabla Delta:

# Celda 2: Limpieza de datos y escritura de la tabla Delta
from pyspark.sql.functions import col

df_limpo = (
    # Elimina transacciones repetidas, usando id_transacao como clave
    df_raw.dropDuplicates(["id_transacao"])
    # Descarta registros sin valor. Es una decisión de negocio: en otros escenarios
    # puedes completar el valor, marcar el registro o enviarlo a una tabla de rechazados
    .filter(col("valor").isNotNull())
    # Garantiza el tipo numérico. Para valores monetarios, en proyectos reales
    # prefiere decimal a double, para evitar errores de redondeo
    .withColumn("valor", col("valor").cast("double"))
)

# Escritura como tabla Delta administrada
(
    df_limpo.write.format("delta")
    # overwrite: sobrescribe la tabla en cada ejecución (Delta registra una nueva versión en el log)
    .mode("overwrite")
    # saveAsTable: escribe y registra la tabla por nombre en el lakehouse (aparece en Tables)
    .saveAsTable("fato_vendas")
)

print("¡Tabla Delta 'fato_vendas' creada con éxito en lh_silver!")

Qué hace cada paso

  • dropDuplicates(["id_transacao"]): elimina los registros repetidos, usando el ID de la transacción como clave. Es el caso de la transacción 105.
  • filter(col("valor").isNotNull()): mantiene solo los registros con valor completo. La transacción 103, sin valor, queda afuera.
  • cast("double"): convierte la columna valor al tipo numérico double, garantizando que se trate como número.

Antes y después: de seis registros, quedan cuatro (101, 102, 104 y 105). Los comentarios del código recuerdan que descartar registros sin valor es una decisión de negocio y que, para dinero, decimal suele ser mejor que double.

Animación del tratamiento: dropDuplicates elimina la fila duplicada, filter elimina la fila sin valor y la tabla fato_vendas queda con cuatro filas

Guardando la tabla Delta

  • format("delta"): escribe en formato Delta.
  • mode("overwrite"): sobrescribe el contenido de la tabla en cada ejecución. Eso permite correr el notebook varias veces sin duplicar datos. Delta registra la sobrescritura como una nueva versión en el log.
  • saveAsTable("fato_vendas"): escribe los datos y registra la tabla por nombre en el lakehouse. Con eso aparece en Tables y se puede consultar por nombre, incluso con SQL. Si usara solo save() con una ruta, los archivos se escribirían, pero la tabla no quedaría registrada por nombre en el catálogo.

La animación muestra qué ocurre por debajo cuando se escribe: la primera vez crea un archivo Parquet y una entrada en el Delta log; correrlo de nuevo con overwrite crea una nueva versión.

Animación de la escritura Delta: la primera escritura crea un archivo Parquet y una entrada en el Delta log; el overwrite crea una nueva versión

Como lh_silver es el lakehouse predeterminado del notebook, la tabla se crea en Tables, como tabla administrada: Fabric se encarga tanto de los archivos como de los metadatos.

Resultado

En silver, en Tables, aparece la tabla fato_vendas. El ícono con un triángulo indica que está en formato Delta.

Panel de lh_silver con la tabla fato_vendas en Tables, marcada con el ícono de triángulo del formato Delta

Esto cierra la explicación del shortcut de la parte 3: podría haber convertido el CSV a Delta al crear el shortcut, pero preferí mantenerlo en CSV, tratar los datos en el notebook y solo entonces guardarlos en Delta.

Por debajo del capó: qué es una tabla Delta

Todo lo que está en Tables es una tabla Delta. Por debajo, está formada por dos partes:

  • Archivos Parquet: guardan los datos en formato columnar y comprimido, lo que permite almacenar y consultar grandes volúmenes de forma optimizada.
  • Delta log (la carpeta _delta_log): el registro de cada transacción de escritura hecha en la tabla.
Anatomía de una tabla Delta: archivos Parquet con los datos y la carpeta _delta_log con los archivos JSON de cada transacción

Parquet y Delta no son lo mismo. Los datos se guardan en Parquet, pero lo que los convierte en una tabla Delta es el log de transacciones que acompaña a los archivos. Por eso hablamos de "tablas Delta" o "datos en formato Delta", y no solo de Parquet.

Transacciones ACID

Es el Delta log el que permite las transacciones ACID en las tablas del lakehouse:

  • Atomicidad: la operación ocurre completa o no ocurre. Si algo falla a mitad de camino, nada se escribe a medias.
  • Consistencia: los datos pasan de un estado válido a otro estado válido, respetando las reglas definidas.
  • Aislamiento: las transacciones simultáneas no interfieren entre sí.
  • Durabilidad: una vez confirmada, la escritura es permanente, incluso si hay un corte de energía o de internet.
Las cuatro propiedades ACID: atomicidad, consistencia, aislamiento y durabilidad

Preguntas frecuentes

¿Cuál es la diferencia entre save y saveAsTable?

saveAsTable escribe los datos y registra la tabla por nombre en el lakehouse, así que aparece en Tables y se puede consultar por nombre, incluso con SQL. save con una ruta escribe los archivos, pero no registra la tabla por nombre en el catálogo.

¿Qué pasa si vuelvo a ejecutar el notebook?

Con mode("overwrite"), la tabla se reemplaza por el nuevo resultado y los datos no se duplican. Delta registra la sobrescritura como una nueva versión en el log.

¿Parquet y Delta son lo mismo?

No. Parquet es el formato de archivo que guarda los datos, de forma columnar y comprimida. Delta es Parquet más el Delta log, el registro de transacciones que respalda ACID.

¿Se puede volver a la versión anterior de la tabla?

En general sí. Como cada escritura se convierte en una versión en el Delta log, se pueden consultar versiones anteriores (time travel) mientras los archivos antiguos no hayan sido eliminados por una limpieza (VACUUM). Ese tema merece un capítulo propio.

Para profundizar (documentación de Microsoft)

Resumen

  • Tratamos los datos con PySpark: eliminamos el duplicado, descartamos el registro sin valor y garantizamos el tipo numérico.
  • Guardamos el resultado como la tabla Delta fato_vendas, en Tables, con saveAsTable.
  • Una tabla Delta está hecha de archivos Parquet más el Delta log, y es el log el que garantiza las transacciones ACID.

En la parte 5, vamos a consultar fato_vendas con el SQL analytics endpoint.

MA
Allen87 Data Engineer & Data Analyst

Escribo sobre Power BI, ingeniería de datos e IA aplicada. Mira el perfil completo, los 66 dashboards de Power BI publicados y GitHub.