Lakeflow, lección 7 de 17

Data Quality con Expectations

Christian Herrera10 min de lectura orientativa

1. ¿Qué son las Expectations?

Una Expectation es una regla de calidad de datos que declaras directamente en un dataset de Lakeflow.

Por ejemplo:

python
@dp.expect("valid_amount", "amount > 0")

Esta regla comprueba que todos los tickets tengan un importe positivo.

Lo interesante es que Lakeflow permite decidir qué hacer cuando un registro incumple la regla, además de medir cuántos registros pasan o fallan. Databricks on AWS

2. Los tres comportamientos: warn, drop y fail

WARN — @dp.expect

El registro inválido se guarda igualmente, pero Lakeflow registra que ha incumplido la regla.

Útil cuando quieres observar la calidad sin perder datos.

DROP — @dp.expect_or_drop

El registro inválido no se escribe en la tabla destino. Lakeflow registra cuántos se han descartado.

Útil para evitar que datos incorrectos lleguen a Silver.

FAIL — @dp.expect_or_fail

La violación provoca el fallo de la actualización del flow afectado.

Útil para errores críticos que no deben pasar inadvertidos.

3. Simulador: ¿qué sucede con nuestros tickets?

Imagina que recibimos estos cuatro tickets desde Kafka.

Selecciona una política de calidad

Warn

Drop

Fail

Ticket

Importe

Resultado

T001

100 €

Válido

T002

-10 €

Guardado

T003

50 €

Válido

T004

0 €

Guardado

2

Válidos

2

Inválidos

4

Escritos

Resultado: actualización correcta

Los cuatro tickets llegan a Silver. Lakeflow contabiliza dos violaciones de calidad.

Importante: fail no significa necesariamente que todos los flows independientes del pipeline se detengan. En modo Triggered puede fallar únicamente el flow afectado; en Continuous también se detienen sus dependientes. Databricks on AWS

4. El código real en Lakeflow

Volvemos a nuestra tabla Silver de tickets, que creamos en la lección anterior.

python

from pyspark import pipelines as dp
from pyspark.sql import functions as F

@dp.table(name="silver_tickets")
@dp.expect("valid_ticket_id", "ticket_id IS NOT NULL")
@dp.expect_or_drop("valid_amount", "amount > 0")
def silver_tickets():
    return (
        spark.readStream.table("bronze_deserialized_tickets")
        .select(
            "ticket_id",
            "pharmacy_id",
            "amount",
            "kafka_timestamp"
        )
    )

En este ejemplo asumimos que bronze_deserialized_tickets contiene los datos ya deserializados de Avro. Así nos concentramos exclusivamente en las reglas de calidad.

Tenemos dos expectativas distintas:

  • valid_ticket_id: registra si falta un identificador, pero conserva ese ticket.

  • valid_amount: descarta tickets cuyo importe sea cero, negativo o nulo.

Un detalle fundamental: si un ticket incumple ambas reglas, se descarta por valid_amount aunque valid_ticket_id tenga política warn.

Si quisiéramos que un identificador nulo detuviera la actualización, sustituiríamos @dp.expect por @dp.expect_or_fail.

5. ¿Dónde veo las métricas de calidad?

Lakeflow registra métricas como:

Métrica

Ejemplo

passed_records

98.500

failed_records

1.500

dropped_records

1.500

Las dos primeras corresponden a una expectativa concreta. dropped_records contabiliza los registros descartados por las expectativas del flow, evitando contar dos veces una misma fila que incumple varias reglas. Databricks on AWS

Puedes consultar las métricas de dos maneras:

Opción A. Interfaz de Databricks

Entra en Jobs & Pipelines → tu pipeline → selecciona Silver → Data quality. Verás los resultados de las expectativas cuando las métricas estén disponibles.

Opción B. Consultar el Event Log con SQL

sql

SELECT
    timestamp,
    origin.flow_name,
    from_json(
        details:flow_progress.data_quality
            :expectations::STRING,
        'ARRAY<STRUCT<
            name: STRING,
            dataset: STRING,
            passed_records: BIGINT,
            failed_records: BIGINT
        >>'
    ) AS expectations
FROM event_log('<pipeline-id>')
WHERE event_type = 'flow_progress'
ORDER BY timestamp DESC
LIMIT 20;

Sustituye <pipeline-id> por el identificador real. La disponibilidad de métricas depende del tipo de flow, de que haya registros procesados y de la configuración de métricas. Las violaciones con política fail no generan las métricas habituales del lote fallido.

Databricks on AWS+1

6. ¿Qué haría en vuestra Data Platform?

En una arquitectura Bronze → Silver → Gold, propondría esta distribución inicial:

Regla

Acción

Motivo

event_id IS NOT NULL

Fail

No podemos identificar el evento correctamente

pharmacy_id IS NOT NULL

Drop + cuarentena

No podemos atribuir ventas a una farmacia

amount >= 0

Warn

Un negativo podría representar una devolución

event_time IS NOT NULL

Drop + cuarentena

Necesario para KPIs temporales

Atención: son ejemplos de políticas, no reglas de negocio confirmadas. Especialmente para los tickets, debemos averiguar cómo se representan las devoluciones y cancelaciones antes de descartar importes negativos.

Una estrategia más robusta es implementar una tabla de cuarentena que guarde los registros inválidos y el motivo del rechazo, en lugar de perderlos definitivamente. Databricks documenta este patrón. Databricks on AWS

7. Mini ejercicio

Estás procesando 100.000 tickets por hora. Unos 200 llegan con un pharmacy_id nulo.

Quieres que:

  • El pipeline continúe funcionando.

  • Los registros incorrectos no lleguen a Silver.

  • Puedas medir cuántos registros se han descartado.

¿Qué expectativa utilizarías?

¡Correcto!

expect_or_drop permite mantener el procesamiento y contabilizar los registros descartados. En producción añadiríamos una cuarentena si necesitamos conservarlos.

Qué debes recordar: Expectations no son simples filtros. Son reglas declarativas con comportamiento configurable y métricas de calidad integradas en Lakeflow.

En la lección 8 abordaremos uno de los temas más interesantes: cómo mantener una tabla Silver actualizada cuando un cliente cambia sus datos, utilizando AUTO CDC, SCD Type 1 y SCD Type 2.

Una idea más en tu cuaderno.

Marca esta lección cuando hayas terminado de repasarla.

Material importado del curso original. Simulaciones conservadas como ejemplos estáticos; para sus controles interactivos, consulta el original.