Modelos de datos semiestructurados
En este artículo se recomiendan patrones para almacenar datos semiestructurados en función de cómo use los datos la organización. Azure Databricks proporciona funciones, tipos de datos nativos y sintaxis de consulta para trabajar con datos semiestructurados, anidados y complejos.
Las siguientes consideraciones afectan al patrón que debe usar:
- ¿Los campos o los tipos del origen de datos cambian con frecuencia?
- ¿Cuántos campos únicos en total están incluidos en el origen de datos?
- ¿Necesita optimizar las cargas de trabajo para escrituras o lecturas?
Databricks recomienda almacenar datos como tablas delta para consultas de nivel inferior.
Uso de variante
En Databricks Runtime 15.3 y versiones posteriores, puede usar el tipo VARIANT
para almacenar datos JSON semiestructurados mediante una codificación optimizada que supera las cadenas JSON para lecturas y escrituras.
El tipo VARIANT
tiene aplicaciones similares a las cadenas JSON. Algunas cargas de trabajo se siguen beneficiando del uso de estructuras, mapas y matrices, especialmente para los datos con esquemas conocidos que se beneficiarían del diseño de datos optimizado y la colección de estadísticas.
Para obtener más detalles, vea los siguientes artículos:
- Consulta de datos variantes
- ¿En qué se diferencia la variante de las cadenas JSON?
- Ingesta de datos como tipo de variante semiestructurada
Uso de cadenas JSON
Puede almacenar datos en una sola columna de cadena mediante el formato JSON estándar y, después, consultar campos en el código JSON mediante la notación :
.
Muchos sistemas generan registros como registros JSON codificados por cadenas o bytes. La ingesta y el almacenamiento de estos registros como cadenas tiene una sobrecarga de procesamiento muy baja. También puede usar la función to_json
para convertir cualquier estructura de datos en una cadena JSON.
Tenga en cuenta los puntos fuertes y débiles siguientes al elegir almacenar datos como cadenas JSON:
- Todos los valores se almacenan como cadenas sin información de tipo.
- JSON admite todos los tipos de datos que se pueden representar mediante texto.
- JSON admite cadenas de longitud arbitraria.
- No hay límites en el número de campos que se pueden representar en una sola columna de datos JSON.
- Los datos no requieren procesamiento previo antes de escribir en la tabla.
- Puede resolver problemas de tipo presentes en los datos en cargas de trabajo de nivel inferior.
- JSON proporciona el peor rendimiento de lectura, ya que debe analizar toda la cadena para cada consulta.
Las cadenas JSON proporcionan una gran flexibilidad y una solución fácil de implementar para obtener datos sin procesar en una tabla de almacén de lago. Puede optar por usar cadenas JSON para muchas aplicaciones, pero son especialmente útiles cuando el resultado más importante de una carga de trabajo es almacenar una representación completa y precisa de un origen de datos para el procesamiento posterior. Algunos casos de uso pueden incluir:
- Ingesta de datos de streaming desde un servicio de cola como Kafka.
- Grabación de respuestas a consultas de la API REST.
- Almacenamiento de registros sin procesar desde un origen de datos ascendente no controlado por el equipo.
Suponiendo que la lógica de ingesta es flexible, el almacenamiento de datos como una cadena JSON debe ser resistente aunque encuentre nuevos campos, cambios en la estructura de datos o cambios de tipo en el origen de datos. Aunque es posible que se produzca un error en las cargas de trabajo de nivel inferior debido a estos cambios, la tabla contiene un historial completo de los datos de origen, lo que significa que puede corregir los problemas sin necesidad de volver al origen de datos.
Uso de structs
Puede almacenar datos semiestructurados con estructuras y habilitar toda la funcionalidad nativa de las columnas mientras mantiene la estructura anidada del origen de datos.
Delta Lake trata los datos almacenados como estructuras igual que cualquier otra columna, lo que significa que no hay ninguna diferencia funcional entre las estructuras y las columnas. Los archivos de datos parquet usados por Delta Lake crean una columna para cada campo de una estructura. Puede usar campos de estructura como columnas de agrupación en clústeres o como columnas de partición, y puede recopilar estadísticas en estructuras para omitir datos.
Las estructuras suelen proporcionar el mejor rendimiento en la lectura, ya que admiten todas las optimizaciones de omisión de datos y almacenan campos individuales como columnas. El rendimiento puede empezar a verse afectado cuando el número de columnas presentes llega a los cientos.
Cada campo de una estructura tiene un tipo de datos, que se aplica en la escritura, igual que las columnas. Por lo tanto, las estructuras requieren un procesamiento previo completo de los datos. Esto puede ser beneficioso cuando solo quiere que los datos validados se confirmen en una tabla, pero esto puede provocar la eliminación de datos o trabajos con errores al procesar registros con formato incorrecto desde sistemas ascendentes.
Las estructuras son menos flexibles que las secuencias JSON para la evolución del esquema, ya sea para la evolución de los tipos de datos o para agregar nuevos campos.
Uso de mapas y matrices
Puede usar una combinación de mapas y matrices para replicar formatos de datos semiestructurados de forma nativa en Delta Lake. No se pueden recopilar estadísticas en campos definidos con estos tipos, pero proporcionan un rendimiento equilibrado tanto en lectura como en escritura para conjuntos de datos semiestructurados que tienen alrededor de 500 campos.
Tanto la clave como el valor de los mapas tienen tipos, por lo que los datos se procesan previamente y se aplica el esquema en la escritura.
Para acelerar las consultas, Databricks recomienda almacenar campos que a menudo se usan para filtrar los datos como columnas independientes.
¿Necesito aplanar mis datos?
Si va a almacenar los datos mediante JSON o mapas, considere la posibilidad de almacenar los campos que se usan a menudo para filtrar consultas como columnas. La colección de estadísticas, la creación de particiones y la agrupación en clústeres no están disponibles para los campos dentro de cadenas o mapas JSON. No es necesario hacerlo para los datos almacenados como estructuras.
Sintaxis para trabajar con datos anidados
Revise los siguientes recursos para obtener información sobre cómo trabajar con datos anidados: