Ir al contenido principal

Profundizando en Delta Lake: cumplimiento y evolución del esquema

Diving Into Delta Lake: Schema Enforcement & Evolution

Publicado: 24 de septiembre de 2019

Soluciones11 min de lectura

Pruebe esta serie de cuadernos en Databricks

Los datos, al igual que nuestras experiencias, siempre están evolucionando y acumulándose. Para mantenernos al día, nuestros modelos mentales del mundo deben adaptarse a los nuevos datos, algunos de los cuales contienen nuevas dimensiones: nuevas formas de ver cosas que antes no concebíamos. Estos modelos mentales no son diferentes del esquema de una tabla, que define cómo categorizamos y procesamos la nueva información.

Esto nos lleva a la administración de esquemas. A medida que los problemas y requisitos empresariales evolucionan con el tiempo, también lo hace la estructura de sus datos. Con Delta Lake, a medida que cambian los datos, incorporar nuevas dimensiones es fácil. Los usuarios tienen acceso a una semántica sencilla para controlar el esquema de sus tablas. Estas herramientas incluyen la aplicación del esquema, que evita que los usuarios contaminen accidentalmente sus tablas con errores o datos basura, así como la evolución del esquema, que les permite agregar automáticamente nuevas columnas de datos enriquecidos cuando esas columnas pertenecen. En este blog, profundizaremos en el uso de estas herramientas.

Descripción de los esquemas de tabla

Cada DataFrame en Apache Spark™ contiene un esquema, un plano que define la forma de los datos, como los tipos de datos y las columnas, y los metadatos. Con Delta Lake, el esquema de la tabla se guarda en formato JSON dentro del registro de transacciones.

¿Qué es la aplicación del esquema?

La aplicación del esquema, también conocida como validación del esquema, es una protección en Delta Lake que garantiza la calidad de los datos al rechazar las escrituras en una tabla que no coinciden con el esquema de la tabla. Al igual que el administrador de la recepción en un restaurante concurrido que solo acepta reservas, comprueba si cada columna de los datos insertados en la tabla está en su lista de columnas esperadas (en otras palabras, si cada una tiene una "reserva") y rechaza cualquier escritura con columnas que no estén en la lista.

¿Cómo funciona la aplicación del esquema?

Delta Lake utiliza la validación del esquema al escribir, lo que significa que todas las escrituras nuevas en una tabla se comprueban para verificar la compatibilidad con el esquema de la tabla de destino en el momento de la escritura. Si el esquema no es compatible, Delta Lake cancela la transacción por completo (no se escriben datos) y genera una excepción para informar al usuario sobre la falta de coincidencia.

Para determinar si una escritura en una tabla es compatible, Delta Lake utiliza las siguientes reglas. El DataFrame que se va a escribir:

  • No puede contener ninguna columna adicional que no esté presente en el esquema de la tabla de destino. Por el contrario, está bien si los datos entrantes no contienen todas las columnas de la tabla; a esas columnas simplemente se les asignarán valores nulos.
  • No puede tener tipos de datos de columna que difieran de los tipos de datos de columna en la tabla de destino. Si la columna de una tabla de destino contiene datos StringType, pero la columna correspondiente en el DataFrame contiene datos IntegerType, la aplicación del esquema generará una excepción y evitará que se realice la operación de escritura.
  • No puede contener nombres de columna que difieran solo en mayúsculas y minúsculas. Esto significa que no puede tener columnas como "Foo" y "foo" definidas en la misma tabla. Si bien Spark se puede usar en modo sensible a mayúsculas y minúsculas o no sensible a mayúsculas y minúsculas (predeterminado), Delta Lake conserva las mayúsculas y minúsculas, pero no distingue entre mayúsculas y minúsculas al almacenar el esquema. Parquet distingue entre mayúsculas y minúsculas al almacenar y devolver información de columna. Para evitar posibles errores, corrupción de datos o problemas de pérdida (que hemos experimentado personalmente en Databricks), decidimos agregar esta restricción.

Para ilustrarlo, eche un vistazo a lo que sucede en el código a continuación cuando se intenta agregar algunas columnas recién calculadas a una tabla de Delta Lake que aún no está configurada para aceptarlas.

En lugar de agregar automáticamente las nuevas columnas, Delta Lake aplica el esquema y evita que se produzca la escritura. Para ayudar a identificar qué columnas causaron la falta de coincidencia, Spark imprime ambos esquemas en el seguimiento de la pila para compararlos.

¿Cómo es útil la aplicación del esquema?

Debido a que es una comprobación tan estricta, la aplicación del esquema es una excelente herramienta para usar como guardián de un conjunto de datos limpio y totalmente transformado que está listo para la producción o el consumo. Por lo general, se aplica en las tablas que alimentan directamente:

  • Algoritmos de aprendizaje automático
  • Paneles de BI
  • Herramientas de visualización y análisis de datos
  • Cualquier sistema de producción que requiera esquemas semánticos fuertemente tipados, altamente estructurados

Para preparar sus datos para este obstáculo final, muchos usuarios emplean una arquitectura simple de "múltiples saltos" que agrega progresivamente estructura a sus tablas. Para obtener más información, consulte la publicación titulada Producción de aprendizaje automático con Delta Lake.

Por supuesto, la aplicación del esquema se puede usar en cualquier parte de su canalización, pero tenga en cuenta que puede ser un poco frustrante que su escritura de transmisión a una tabla falle porque olvidó que agregó una sola columna a los datos entrantes, por ejemplo.

Prevención de la dilución de datos

En este punto, podría preguntarse, ¿de qué se trata todo este alboroto? Después de todo, a veces un error inesperado de "falta de coincidencia de esquema" puede tropezar con su flujo de trabajo, especialmente si es nuevo en Delta Lake. ¿Por qué no simplemente dejar que el esquema cambie como sea necesario para que pueda escribir mi DataFrame pase lo que pase?

Como dice el viejo refrán, "más vale prevenir que curar". En algún momento, si no aplica su esquema, los problemas de compatibilidad de tipos de datos levantarán sus feas cabezas: las fuentes aparentemente homogéneas de datos sin procesar pueden contener casos extremos, columnas dañadas, asignaciones mal formadas u otras cosas aterradoras que chocan en la noche. Un enfoque mucho mejor es detener a estos enemigos en las puertas, utilizando la aplicación del esquema, y lidiar con ellos a la luz del día en lugar de más adelante, cuando estarán al acecho en los recovecos sombríos de su código de producción.

La aplicación del esquema proporciona la tranquilidad de que el esquema de su tabla no cambiará a menos que tome la decisión afirmativa de cambiarlo. Evita la "dilución" de datos, que puede ocurrir cuando se agregan nuevas columnas con tanta frecuencia que las tablas anteriormente ricas y concisas pierden su significado y utilidad debido al diluvio de datos. Al alentarlo a ser intencional, establecer altos estándares y esperar alta calidad, la aplicación del esquema está haciendo exactamente lo que fue diseñado para hacer: mantenerlo honesto y sus tablas limpias.

Si, después de una revisión adicional, decide que realmente quería agregar esa nueva columna, es una solución fácil de una línea, como se analiza a continuación. ¡La solución es la evolución del esquema!

LÍDER 5X

Gartner®: Databricks, líder en bases de datos en la nube

¿Qué es la evolución del esquema?

La evolución del esquema es una característica que permite a los usuarios cambiar fácilmente el esquema actual de una tabla para adaptarse a los datos que cambian con el tiempo. Más comúnmente, se usa al realizar una operación de anexión o sobrescritura, para adaptar automáticamente el esquema para incluir una o más columnas nuevas.

¿Cómo funciona la evolución del esquema?

Siguiendo el ejemplo de la sección anterior, los desarrolladores pueden usar fácilmente la evolución del esquema para agregar las nuevas columnas que antes se rechazaron debido a una falta de coincidencia de esquema. La evolución del esquema se activa agregando .option('mergeSchema', 'true') a su comando .write o .writeStream de Spark.

Para ver el gráfico, ejecute la siguiente instrucción Spark SQL.

Alternativamente, puede establecer esta opción para toda la sesión de Spark agregando spark.databricks.delta.schema.autoMerge = True a su configuración de Spark. Úselo con precaución, ya que la aplicación del esquema ya no le advertirá sobre las faltas de coincidencia de esquema no deseadas.

Al incluir la opción mergeSchema en su consulta, cualquier columna que esté presente en el DataFrame pero no en la tabla de destino se agrega automáticamente al final del esquema como parte de una transacción de escritura. También se pueden agregar campos anidados, y estos campos también se agregarán al final de sus respectivas columnas struct.

Los ingenieros y científicos de datos pueden usar esta opción para agregar nuevas columnas (tal vez una métrica recién rastreada o una columna de las cifras de ventas de este mes) a sus tablas de producción de aprendizaje automático existentes sin romper los modelos existentes que dependen de las columnas antiguas.

Los siguientes tipos de cambios de esquema son elegibles para la evolución del esquema durante las anexiones o sobrescrituras de tablas:

  • Agregar nuevas columnas (este es el escenario más común)
  • Cambio de tipos de datos de NullType -> cualquier otro tipo, o upcasts de ByteType -> ShortType -> IntegerType

Otros cambios, que no son elegibles para la evolución del esquema, requieren que el esquema y los datos se sobrescriban agregando .option("overwriteSchema", "true"). Por ejemplo, en el caso de que la columna "Foo" fuera originalmente un tipo de datos integer y el nuevo esquema fuera un tipo de datos de cadena, entonces todos los archivos Parquet (datos) deberían volver a escribirse. Esos cambios incluyen:

  • Eliminar una columna
  • Cambiar el tipo de datos de una columna existente (en su lugar)
  • Cambiar el nombre de las columnas que difieren solo en mayúsculas y minúsculas (por ejemplo, "Foo" y "foo")

Finalmente, con el próximo lanzamiento de Spark 3.0, DDL explícito (usando ALTER TABLE) será totalmente compatible, lo que permitirá a los usuarios realizar las siguientes acciones en los esquemas de tabla:

  • Agregar columnas
  • Cambiar los comentarios de las columnas
  • Establecer las propiedades de la tabla que definen el comportamiento de la tabla, como establecer la duración de retención del registro de transacciones

¿Cómo es útil la evolución del esquema?

La evolución del esquema se puede usar en cualquier momento que tenga la intención de cambiar el esquema de su tabla (a diferencia de donde agregó accidentalmente columnas a su DataFrame que no deberían estar allí). Es la forma más fácil de migrar su esquema porque agrega automáticamente los nombres de columna y los tipos de datos correctos, sin tener que declararlos explícitamente.

Resumen

La aplicación del esquema rechaza cualquier columna nueva u otros cambios de esquema que no sean compatibles con su tabla. Al establecer y mantener estos altos estándares, los analistas e ingenieros pueden confiar en que sus datos tienen los niveles más altos de integridad y razonar sobre ellos con claridad, lo que les permite tomar mejores decisiones comerciales.

En el otro lado de la moneda, la evolución del esquema complementa la aplicación al facilitar que los cambios de esquema previstos se realicen automáticamente. Después de todo, no debería ser difícil agregar una columna.

La aplicación del esquema es el yin del yang de la evolución del esquema. Cuando se usan juntos, estas características hacen que sea más fácil que nunca bloquear el ruido y sintonizar la señal.

También nos gustaría agradecer a Mukul Murthy y Pranav Anand por sus contribuciones a este blog.

¿Está interesado en el Delta Lake de código abierto?
Visite el centro en línea de Delta Lake para obtener más información, descargar el código más reciente y unirse a la comunidad de Delta Lake.

Relacionado

Artículos de esta serie:
Inmersión en Delta Lake #1: Desembalaje del registro de transacciones
Inmersión en Delta Lake #2: Aplicación y evolución del esquema
Inmersión en Delta Lake #3: Internos de DML (Actualizar, Eliminar, Combinar)

Producción de aprendizaje automático con Delta Lake
¿Qué es un Data Lake?

(Esta entrada del blog ha sido traducida utilizando herramientas basadas en inteligencia artificial) Publicación original

No te pierdas ninguna publicación de Databricks.

Suscríbete a nuestro blog y recibe las últimas publicaciones en tu bandeja de entrada.