¿Qué es ODCS? El Open Data Contract Standard, explicado

Qué es el Open Data Contract Standard, qué contiene realmente un contrato v3, por qué un estándar abierto le gana al formato de reglas de un proveedor y cómo importar y exportar ODCS mantiene portables tus reglas de calidad de datos.

· 9 min read

El Open Data Contract Standard (ODCS) es una especificación abierta para describir lo que promete un dataset: su esquema, su propietario, sus niveles de servicio y —la parte que más le importa a la mayoría de los equipos— sus reglas de calidad de datos. Es un documento YAML, versionado como el código, legible por una persona y ejecutable por una herramienta. ODCS se desarrolla en abierto como parte del proyecto Bitol, bajo el paraguas de AI & Data de la Linux Foundation, lo que significa que ningún proveedor lo controla en solitario y que ningún proveedor puede dejar tus reglas tiradas.

El problema que resuelve

Cada herramienta de calidad de datos se inventa su propio formato de reglas. dbt tiene tests en un schema.yml. Great Expectations tiene expectation suites en JSON. Soda tiene SodaCL. Monte Carlo tiene monitores en su interfaz. Cada formato es razonable por separado y ninguno viaja.

Eso tiene tres consecuencias prácticas:

  1. Tus expectativas quedan atadas a un runner. Pasar de una herramienta a otra significa reescribir a mano todas las reglas, que es la razón por la que los equipos no se mueven, que es la razón por la que el formato conserva su público cautivo.
  2. Productores y consumidores no coinciden en qué se prometió. Las reglas viven en el repositorio del pipeline, en el formato del equipo del pipeline. El equipo de analítica que depende de la tabla no puede leerlas, y mucho menos revisar un cambio.
  3. Nada es revisable. Una regla modificada en la interfaz de un proveedor no deja diff. Si el umbral se movió porque cambió el negocio o porque alguien se cansó de la alerta es algo irrecuperable.

Un contrato de datos aborda los tres problemas convirtiendo la propia promesa en el artefacto: separada de la herramienta que la hace cumplir, versionada en el mismo repositorio que todo lo demás y escrita en un formato que pueden leer los dos lados de la interfaz.

Qué hay realmente en un contrato ODCS

Un contrato v3 es un documento YAML con un número reducido de bloques de primer nivel. Lo esencial:

apiVersion: v3.0.0
kind: DataContract
info:
  title: orders
  version: 1.2.0
  owner: data-platform
schema:
  - name: orders
    physicalName: orders
    physicalType: table
    properties:
      - name: order_id
        logicalType: string
        physicalType: uuid
        required: true
        primaryKey: true
        description: Business key, stable across restatements.
        quality:
          - rule: nullCount
            dimension: completeness
            severity: error
            mustBe: "0"
          - rule: duplicateCount
            dimension: uniqueness
            severity: error
            mustBe: "0"
      - name: status
        logicalType: string
        quality:
          - rule: validValues
            dimension: conformity
            severity: error
            mustBe: "['pending', 'paid', 'shipped', 'refunded']"
      - name: created_at
        logicalType: timestamp
        quality:
          - rule: freshness
            dimension: timeliness
            severity: error
            mustBe: "<= 24h"
    quality:
      - rule: rowCount
        dimension: consistency
        severity: warning
        mustBe: "> 0"

Leyéndolo de arriba abajo:

Anatomía de una regla de calidad

Cuatro campos hacen el trabajo:

CampoQué significa
ruleLa comprobación que se ejecuta: nullCount, duplicateCount, validValues, between, regex, freshness, rowCount, referentialIntegrity, customSql
dimensionA qué dimensión de calidad pertenece: completeness, uniqueness, conformity, accuracy, timeliness, consistency
severityerror hace fallar la ejecución; warning registra el incumplimiento y continúa
mustBeEl umbral, en una gramática breve y legible

mustBe es la parte que hace agradables de leer los contratos. No es un lenguaje de expresiones booleanas; es una abreviatura específica de cada regla:

Alguien que no haya usado nunca la herramienta puede leer mustBe: "<= 24h" en una regla freshness y saber exactamente qué va a pasar. De eso se trata.

Las dimensiones no son decoración

El campo dimension parece taxonomía por la taxonomía misma hasta que tienes cien reglas. Entonces se convierte en la única forma de responder a las preguntas que de verdad se hacen: *¿estamos cubiertos en actualidad en nuestros datasets críticos, o solo en completitud?* Las reglas agrupadas por dimensión se convierten en una matriz de cobertura, y los huecos de esa matriz suelen ser más informativos que cualquier comprobación fallida concreta.

Las seis dimensiones de uso común —completeness, uniqueness, conformity, accuracy, timeliness, consistency— están lo bastante asentadas como para que un informe de cobertura signifique lo mismo en todos los equipos.

Por qué merece la pena un estándar abierto

La portabilidad es la razón evidente. El mismo contrato describe el mismo dataset lógico tanto si aterriza en PostgreSQL como en BigQuery o en SQL Server. El runner compila nullCount al SQL de ese motor. Migrar de warehouse deja de ser una migración de reglas.

La revisabilidad es la razón infravalorada. Como el contrato es un archivo, un cambio de umbral es un diff en un pull request, con un autor y un motivo. La propiedad más valiosa de un contrato de datos no es que una máquina pueda ejecutarlo, sino que una persona pueda discutirlo antes de que se fusione.

La independencia es la razón estratégica. Las reglas escritas en un estándar abierto no son un activo de quien las ejecuta. Si cambias de herramienta de validación, los contratos se van contigo. Eso cambia la posición negociadora, y cambia cuánto estás dispuesto a invertir en escribir reglas para empezar.

Interoperabilidad con los catálogos. Como ODCS también recoge la propiedad, las descripciones y los niveles de servicio, el mismo documento alimenta un catálogo, una herramienta de linaje y un runner de calidad sin que tres fuentes de la verdad separadas se vayan desalineando.

Importar y exportar, en la práctica

Un estándar vale exactamente lo que valga la facilidad para entrar y salir de él. Dos reglas prácticas:

La importación debe venir a buscarte donde estés. Apunta una herramienta a una tabla existente y debería leer information_schema, inferir las columnas y los tipos, proponer un contrato de partida a partir de lo que encuentre —las columnas obligatorias se convierten en reglas nullCount, las claves primarias en reglas duplicateCount, las marcas de tiempo en candidatas a freshness— y dejarte editar desde ahí. Partir de un borrador generado de treinta reglas y borrar diez es una experiencia muy distinta de partir de un archivo en blanco.

La exportación debe ser byte a byte lo que editas. Aquí es donde la mayoría de las herramientas fallan discretamente. Si el YAML es la representación de una fila de base de datos, cada ida y vuelta por la interfaz reformatea el archivo, reordena las claves y se come tus comentarios, y el diff de tu pull request se convierte en ruido ilegible. El contrato tiene que *ser* el formato de almacenamiento, no una proyección de él.

Catalyst se toma el segundo enfoque al pie de la letra. El YAML es la fuente de la verdad; el constructor visual de reglas edita el documento en el sitio, preservando comentarios y orden de claves, de modo que una regla añadida desde la interfaz produce un diff de una línea. La exportación es una descarga de archivo, la importación acepta cualquier documento v3 válido, y nada se guarda en una forma de la que no puedas recuperarlo.

Versionar un contrato

Usa versionado semántico en info.version, y en serio:

La disciplina se paga sola en el momento en que alguien pregunta si puede eliminar una columna sin riesgo. Con contratos versionados y un diff, eso es una conversación de cinco minutos en lugar de una semana de grep.

Dónde encajan los contratos junto a los dbt tests

No son competidores, y conviene ser preciso con la diferencia.

Los dbt tests se ejecutan dentro de una build de dbt y cubren los modelos que dbt controla. Son excelentes exactamente en eso y, si todas las tablas que te importan son modelos de dbt, puede que sean todo lo que necesitas.

Un contrato de datos está un nivel por encima. Describe la garantía del dataset con independencia de lo que lo haya producido —dbt, Airflow, un notebook de Spark, la herramienta de replicación de un proveedor, un cargador escrito a mano— y con independencia de quién ejecute la comprobación. Es la interfaz entre un productor y un consumidor, versionada como artefacto de primera clase.

En la práctica, los equipos que usan ambos ponen aserciones rápidas y baratas en los dbt tests, donde hacen fallar la build, y ponen las promesas duraderas en el contrato, donde se revisan, se versionan y se monitorizan de forma programada sin importar qué pipeline escribió la tabla hoy.

Preguntas frecuentes

¿Qué significa ODCS?

Open Data Contract Standard. Es una especificación abierta para describir el esquema, la propiedad, los niveles de servicio y las expectativas de calidad de datos de un dataset en un único documento YAML versionado, desarrollada como parte del proyecto Bitol bajo el paraguas de AI & Data de la Linux Foundation.

¿Es ODCS lo mismo que un contrato de datos?

“Contrato de datos” es el concepto: una promesa acordada y versionada entre un productor de datos y sus consumidores. ODCS es un formato concreto y abierto para poner esa promesa por escrito. Puedes tener contratos de datos sin ODCS, en un formato propio; usar un estándar abierto es lo que los hace portables entre herramientas.

¿Cuál es la diferencia entre ODCS y los dbt tests?

Los dbt tests son aserciones dentro de un proyecto de dbt, limitadas a los modelos que dbt construye, y se ejecutan como parte de una build de dbt. Un contrato ODCS describe las garantías del dataset con independencia de la herramienta que lo produjo o que lo comprueba, se versiona como artefacto propio y puede hacerse cumplir por cualquier runner compatible. Muchos equipos usan ambos.

¿Qué reglas de calidad de datos admite ODCS?

El bloque quality de la especificación es lo bastante abierto como para llevar cualquier regla que un runner entienda. En la práctica, el conjunto habitual es completitud (nullCount), unicidad (duplicateCount), valores permitidos (validValues), rangos numéricos (between), coincidencia de patrones (regex), frescura (freshness), recuentos de filas (rowCount), integridad referencial y una vía de escape para SQL personalizado. Cada una lleva una dimensión y una severidad para que los resultados se agreguen en una vista de cobertura.

¿Puedo importar un contrato ODCS existente en Catalyst?

Sí. Catalyst lee cualquier documento ODCS v3 válido, lo valida contra las columnas importadas del dataset —de modo que una regla que referencia una columna inexistente se detecta al guardar, con número de línea— y almacena el propio YAML como fuente de la verdad. La exportación te devuelve el mismo archivo, con los comentarios y el orden intactos.