Catalyst frente a Great Expectations: ¿cuál deberías usar?

Un monitor gestionado basado en contratos frente a un framework de Python de código abierto — qué hace bien cada uno, cuándo es la elección equivocada y cómo hay equipos que usan los dos.

· 11 min read

Usa Great Expectations si tu equipo escribe Python, si tus comprobaciones tienen su sitio dentro de pipelines que ya orquestas y si necesitas extender el framework con lógica que ningún lenguaje de reglas puede expresar. Usa Catalyst si quienes saben qué significa «datos buenos» no escriben Python, si quieres monitorización programada de las tablas del almacén sin operar un runner y si quieres las reglas guardadas como contratos ODCS portables en vez de como código en un repositorio. Great Expectations es un framework que ensamblas; Catalyst es un producto que conectas. La decisión tiene que ver sobre todo con quién escribe y posee las reglas, no con qué herramienta sabe expresar una comprobación de nulos.

Qué es Great Expectations

Great Expectations (habitualmente «GX») es un framework de Python de código abierto para validar datos. Lo instalas con pip, lo apuntas a una fuente de datos y escribes expectations —aserciones declarativas como expect_column_values_to_not_be_null o expect_column_values_to_be_between— agrupadas en Expectation Suites. Un Checkpoint ejecuta una suite contra un lote de datos y dispara acciones según el resultado. Los resultados se renderizan en Data Docs, un sitio HTML estático generado que describe qué se ejecutó y qué falló.

Tiene licencia Apache, es maduro y cuenta con diferencia con el catálogo de comprobaciones integradas más grande de esta categoría, además de una vía de primer nivel para escribir las tuyas en Python. La empresa que hay detrás vende también GX Cloud, una oferta gestionada que superpone una interfaz administrada, ejecuciones programadas y alertas sobre el motor de código abierto. A día de hoy, la API de Python ha cambiado de forma más de una vez entre versiones mayores —la API de la 1.x no es la de la 0.x— y esas migraciones han supuesto históricamente trabajo real, no un simple salto de versión.

Qué es Catalyst

Catalyst es un producto gestionado de calidad de datos. Conectas un usuario de base de datos en modo solo lectura, importa el esquema y construyes reglas en el navegador: not-null, unicidad, rangos, patrones, conjuntos de valores permitidos, frescura, integridad referencial y SQL personalizado para lo que sea a medida. Cada regla se guarda como un contrato del Open Data Contract Standard: el constructor visual y el YAML son dos vistas del mismo documento, y el YAML es la fuente de verdad, así que una regla añadida en la interfaz produce un diff de una línea que puedes revisar.

Las comprobaciones se ejecutan como SQL contra tu almacén según una programación. El dataset nunca sale de ahí: Catalyst guarda resultados, recuentos de violaciones y hasta cinco filas de ejemplo que fallan por comprobación, capturadas mientras la comprobación se ejecuta, nunca el dataset en sí. Conectores a día de hoy: PostgreSQL, MySQL, SQL Server, BigQuery, Redshift, Microsoft Fabric, más subida de ficheros CSV, JSON y Excel.

Cara a cara

Great ExpectationsCatalyst
Puesta en marchapip install, configurar un contexto, cablear un runnerConectar un usuario de solo lectura desde el navegador
Conocimientos necesariosPython, más configuración en YAML/JSONNinguno; SQL solo para reglas personalizadas
Dónde se ejecutan las comprobacionesAllá donde ejecutes Python — pandas, Spark o empujadas vía SQLAlchemyComo SQL en tu almacén
Fuentes de datosTodo lo que hable SQLAlchemy, más dataframes de pandas y SparkPostgres, MySQL, SQL Server, BigQuery, Redshift, Fabric, CSV/JSON/Excel
Formato de las reglasExpectation Suites, el formato propio de GXODCS v3 en YAML, un estándar abierto
ProgramaciónNinguna en la librería; pones tú Airflow, Dagster, Prefect o cron. GX Cloud la añadeIntegrada (plan Team)
Histórico de ejecucionesResultados de validación guardados donde tú configures; Data Docs muestra el últimoPass/warn/fail por regla, conservado en el producto
InterfazData Docs (HTML estático que alojas tú); GX Cloud tiene interfaz gestionadaAplicación gestionada, dashboards e histórico
Detalle de filas que fallanMuestreo configurable de valores inesperadosHasta cinco filas de ejemplo que fallan por comprobación
Roles y auditoríaNo en la librería; GX Cloud añade cuentasRBAC (admin/editor/viewer), registro de auditoría, SSO con Google/Microsoft
ExtensibilidadExpectations personalizadas en Python — la más profunda de la listaReglas SQL personalizadas
CosteCódigo abierto y gratuito; GX Cloud es comercialStarter gratis, Team 29 €/usuario/mes, Enterprise a medida — precios
AlojamientoAutoalojado; GX Cloud lo aloja el proveedorSaaS alojado en la UE

Puesta en marcha: cómo es la primera hora

Con Great Expectations, la primera hora es ingeniería. Instalar la librería en un entorno, crear un Data Context, definir una fuente de datos y un data asset, construir una suite, definir un checkpoint, decidir dónde se guardan los resultados de validación y los Data Docs, y luego decidir qué lo ejecuta. Ninguno de esos pasos es difícil; son seis, viven todos en código y hay que mantenerlos todos. Si ya tienes un repositorio de Python con un orquestador dentro, la mayor parte de ese andamiaje ya existe y el coste marginal es pequeño. Si no, estás montando un pequeño servicio antes de haber validado una sola fila.

Con Catalyst, la primera hora es configuración. Creas un rol de solo lectura, pegas los datos de conexión y eliges una tabla. La importación del esquema lee information_schema y propone un contrato de base a partir de lo que encuentra —las columnas obligatorias se convierten en reglas not-null, las claves primarias en reglas de unicidad, las marcas de tiempo en candidatas a frescura— y a partir de ahí editas. La guía de PostgreSQL tiene las sentencias GRANT exactas, incluida la línea ALTER DEFAULT PRIVILEGES que todo el mundo olvida.

El planteamiento honesto: el coste de puesta en marcha de GX te compra un framework de propósito general que puede validar cualquier cosa que un proceso de Python sea capaz de leer. El de Catalyst es menor porque su alcance es más estrecho: tablas en un almacén, comprobadas allí mismo.

Escribir las reglas

Esto es, a grandes rasgos, cómo se ve una suite en la API de Python actual de GX:

import great_expectations as gx

context = gx.get_context()
suite = context.suites.add(gx.ExpectationSuite(name="orders"))

suite.add_expectation(
    gx.expectations.ExpectColumnValuesToNotBeNull(column="order_id")
)
suite.add_expectation(
    gx.expectations.ExpectColumnValuesToBeInSet(
        column="status",
        value_set=["pending", "paid", "shipped", "refunded"],
    )
)

Y las mismas expectations como contrato ODCS:

apiVersion: v3.0.0
kind: DataContract
info:
  title: orders
  version: 1.0.0
  owner: data-platform
schema:
  - name: orders
    physicalType: table
    properties:
      - name: order_id
        logicalType: string
        quality:
          - rule: nullCount
            dimension: completeness
            severity: error
            mustBe: "0"
      - name: status
        logicalType: string
        quality:
          - rule: validValues
            dimension: conformity
            severity: error
            mustBe: "['pending', 'paid', 'shipped', 'refunded']"

Como texto, ninguno es obviamente mejor. La diferencia está en quién puede escribirlo y en qué pasa cuando la regla está mal. La versión en Python puede hacer cosas que el YAML no —llamar a un modelo, comparar contra un segundo sistema, calcular un estadístico sobre una ventana móvil— porque es un programa. La versión en YAML la puede leer y editar un analista, un data steward o un responsable de dominio que no abrirá jamás un terminal, y lleva una dimension, así que cien reglas se agregan en una vista de cobertura en lugar de en una lista.

La librería de expectations de GX es genuinamente extensa, y si necesitas expect_column_kl_divergence_to_be_less_than deberías usar GX, porque Catalyst no lo tiene y no va a fingir que sí. Catalyst cubre las comprobaciones que detectan la inmensa mayoría de los incidentes reales, y recurre al SQL personalizado para el resto.

Dónde viven las reglas

Esta es la parte que sobrevive a la elección de herramienta. Las expectation suites de GX están en el formato de GX: legible, pero escrito para un único runner y alojado en el repositorio de Python que sea dueño del pipeline. Eso está bien mientras GX sea la respuesta, y es una reescritura si deja de serlo.

Catalyst guarda los contratos en ODCS, una especificación abierta desarrollada dentro del proyecto Bitol de la Linux Foundation. El contrato describe la promesa del dataset con independencia de quién la haga cumplir, se exporta como fichero y se importa en cualquier otra cosa que hable el estándar. Si te vas de Catalyst, las reglas se van contigo, que es algo raro de anunciar por parte de un proveedor y la razón principal para confiar en el formato.

Elige Great Expectations si…

Elige Catalyst si…

Usar ambos

No son mutuamente excluyentes, y un buen número de equipos usa los dos a propósito. El reparto que funciona: GX dentro del pipeline, como puerta —comprobaciones que deben bloquear un build antes de que aterricen datos malos, más las expectations estadísticas exóticas—. Catalyst por encima del pipeline, como monitor: las promesas duraderas y revisables sobre las tablas de las que dependen los consumidores, ejecutándose según una programación con independencia de qué job las escribió hoy, con el histórico que un log de fallo de CI no te da.

Si ya tienes suites de GX, la migración no es automática —a día de hoy no hay importador—, pero la traducción es mecánica para las expectations comunes, e importar primero el esquema hace que la mayor parte del contrato se genere sola. Para la visión completa de qué comprobar y por qué, empieza por la guía para validar datos.

Preguntas frecuentes

¿Great Expectations es gratuito?

La librería de Python de Great Expectations es de código abierto bajo licencia Apache 2.0 y de uso gratuito, también comercialmente. GX Cloud, el producto gestionado de la misma empresa, es una oferta comercial con sus propios precios; consulta su web para ver las condiciones vigentes. «Gratis» en el sentido del código abierto sigue significando que pagas el cómputo sobre el que se ejecuta y el tiempo de ingeniería para operarlo.

¿Catalyst requiere Python?

No. Catalyst se conecta a tu base de datos con un usuario de solo lectura y las reglas se construyen en el navegador o se escriben como YAML de ODCS. No hay nada que instalar ni código que ejecutar. El SQL es opcional, y solo para reglas personalizadas que los tipos integrados no cubren.

¿Puedo usar Great Expectations y Catalyst juntos?

Sí, y es una arquitectura razonable. Usa Great Expectations como puerta del pipeline —aserciones que hacen fallar un build antes de que aterricen datos malos— y Catalyst como capa de monitorización y de contratos sobre las tablas que ya aterrizaron, con ejecuciones programadas e histórico pass/warn/fail. Leen los mismos datos y responden a preguntas distintas.

¿Puede Catalyst validar dataframes de pandas o Spark?

No. Catalyst valida datos en reposo: tablas y vistas de un almacén conectado, más ficheros CSV, JSON y Excel subidos. Los dataframes en memoria dentro de un proceso de Python en ejecución son exactamente el caso para el que existe Great Expectations.

¿Cuál es mejor para un equipo de datos pequeño?

Si el equipo son uno o dos ingenieros que viven en Python y ya tienen un orquestador en marcha, Great Expectations no cuesta nada y encaja en el flujo de trabajo existente. Si el equipo incluye analistas o responsables de dominio que deberían estar escribiendo las reglas, o si nadie quiere mantener otro servicio, una herramienta gestionada gana en tiempo total invertido. El plan Starter de Catalyst es gratuito para una conexión y un dataset (PostgreSQL y MySQL), suficiente para poner a prueba la premisa antes de comprometerte.