Evolución de Esquemas en Delta Lake

La evolución de esquemas en Delta Lake o Delta Lake Schema Evolution se centra en la gestión de cambios en la estructura de datos a lo largo del tiempo sin perturbar los flujos de datos existentes o requerir alteraciones en los datos almacenados. Este artículo proporciona una guía detallada sobre cómo configurar Delta Lake para admitir la evolución de esquemas, destacando los beneficios de esta funcionalidad, así como los momentos adecuados para su implementación y las precauciones a tener en cuenta.

Beneficios de la evolución de esquemas en Delta Lake

Habilitar la evolución de esquemas en Delta Lake ofrece la ventaja de permitir cambios en la estructura de las tablas sin necesidad de reescribir por completo los datos almacenados. Esto se traduce en una mayor flexibilidad para agregar DataFrames con cualquier esquema a las tablas Delta existentes, incluso cuando contienen columnas adicionales o faltantes. La evolución de esquemas es especialmente útil para añadir o escribir datos de forma selectiva, proporcionando una flexibilidad que debe ser utilizada con prudencia.

Ejemplo de evolución del esquema Delta Lake

Vamos a empezar creando un DataFrame y luego añadiendo datos con un esquema diferente para ilustrar la funcionalidad de evolución del esquema.

Empezamos creando una tabla Delta con el ID del empleado y su nombre como columnas:

df = spark.createDataFrame([(1,"Jorge"), (2,"Marcos"), (3,"Lucía")]).toDF(
    "id_empleado", "nombre"
)

df.write.format("delta").saveAsTable("empleados")

Ahora intentamos añadir un DataFrame con un esquema diferente a la tabla Delta existente. Este DataFrame contendrá las columnas id_empleado, nombre y fecha_contratación.

Este código da error con una AnalysisException. Delta Lake no permite añadir datos con esquemas no coincidentes de forma predeterminada. Esta función se denomina «schema enforcement«.

df = spark.createDataFrame([(4,"Miranda","2024-01-02"), (5,"Gabriela","2024-01-15")]).toDF(
    "id_empleado", "nombre", "fecha_contratación"
)

df.write.format("delta").mode("append").saveAsTable("empleados")

Evolución del esquema de Delta Lake – mergeSchema

Se puede establecer la opción mergeSchema en true para escribir en una tabla Delta y permitir que se añadan datos con un esquema no coincidente


df.write.option("mergeSchema", "true").format("delta").mode("append").saveAsTable("empleados")

A continuación se muestra el contenido de la tabla Delta una vez añadidos los datos. La tabla Delta tiene ahora tres columnas, antes sólo tenía dos.

Los datos «que faltan» en la columna de la fecha de contratación para los datos existentes simplemente se marcan como nulos cuando se añaden nuevas columnas.

Configurar mergeSchema a true cada vez que se desea escribir con un esquema no coincidente puede ser tedioso. Veamos cómo habilitar la evolución de esquemas por defecto.

Evolución del esquema de Delta Lake – autoMerge

Se puede activar la evolución del esquema por defecto estableciendo autoMerge en true:


spark.conf.set("spark.databricks.delta.schema.autoMerge.enabled", "true")

Con autoMerge establecido en true, puede añadir DataFrames con diferentes esquemas sin establecer mergeSchema.

df = spark.createDataFrame([(6,"Pepe")]).toDF("id_empleado","nombre")
df.write.format("delta").mode("append").saveAsTable("empleados")

Esta adición ilustra dos conceptos:

  • autoMerge permite evitar la configuración explícita de mergeSchema cada vez que anexa datos.

  • La evolución del esquema también permite añadir DataFrames con menos columnas que la tabla Delta existente.

Vamos a crear un DataFrame con un esquema completamente diferente al de la tabla Delta existente y veamos qué ocurre cuando se anexa.

df = spark.createDataFrame([(36,),(24,)]).toDF("edad")
df.write.format("delta").mode("append").saveAsTable("empleados")

Cuando la evolución del esquema está habilitada, Delta Lake incluso anexará este DataFrame con un esquema que no se superpone en absoluto. Como se puede ver, la evolución del esquema es muy permisiva.

Consideraciones para evitar la evolución de esquemas de Delta Lake

Aunque la evolución de esquemas es una herramienta potente, es importante tener en cuenta algunas consideraciones antes de habilitarla. En situaciones donde se requiere que los nuevos datos mantengan un esquema coherente con el de la tabla existente, la evolución de esquemas puede no ser la mejor opción. Además, la activación de esta funcionalidad desactiva las comprobaciones de cumplimiento del esquema, lo que puede representar un riesgo en términos de integridad de los datos. Por último, la evolución del esquema puede interrumpir los procesos posteriores, por lo que es crucial asegurarse de que todos los lectores de datos seguirán funcionando correctamente antes de implementarla en entornos de producción.

Comparación entre Delta Lake mergeSchema y autoMerge

Delta Lake ofrece dos opciones para la evolución de esquemas: mergeSchema y autoMerge. La primera se aplica a una única escritura en una única tabla, lo que la hace ideal para escenarios donde se requiere controlar específicamente la evolución del esquema. Por otro lado, la opción autoMerge activa la evolución del esquema para escrituras en cualquier tabla, ofreciendo una mayor flexibilidad pero también un mayor riesgo. Se recomienda activar autoMerge solo cuando sea estrictamente necesario, optando por mergeSchema cuando se desee una implementación más segura y controlada de la evolución del esquema.

Conclusión

La evolución de esquemas en Delta Lake es una herramienta valiosa para gestionar cambios en la estructura de datos de manera flexible y eficiente. Sin embargo, es esencial comprender sus beneficios y consideraciones, así como las opciones disponibles, para tomar decisiones informadas sobre su implementación. Al seguir las mejores prácticas y evaluar cuidadosamente las necesidades específicas de cada caso de uso, los usuarios pueden aprovechar al máximo esta funcionalidad sin comprometer la integridad y la coherencia de sus datos.

0
Subscribe to my newsletter

Read articles from Kilian Baccaro Salinas directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Kilian Baccaro Salinas
Kilian Baccaro Salinas