Buenas prácticas
Cierra el recorrido: /data/events como lago versionado, /data/customers actualizado con MERGE, streams con checkpoint propio. Las decisiones de abajo son operativas; no son un checklist de producto Databricks.
Documentación: docs.delta.io, optimizaciones, utilidades, Delta Kernel.
Diseño
- Esquema explícito en ingestión (sobre todo streaming). Enforcement por defecto; evolución con
ALTER TABLEoWITH SCHEMA EVOLUTION/withSchemaEvolution()cuando el contrato lo permite. No dejesmergeSchema=trueen todos los writes. - Particiona solo si el predicado estable y el volumen por partición lo justifican. Evita high-cardinality (
user_id, ids de evento). - Delta Lake no es Medallion. Si usas bronze/silver/gold, es un patrón de pipelines, no una obligación del formato.
- Spark es el motor de este manual. Flink, Trino, Presto, Hive, Athena o un conector Kernel pueden leer/escribir Delta; el soporte de OPTIMIZE, CDF, deletion vectors o clustering no es idéntico. Comprueba el conector.
Escrituras
- Evita tiny files: no hagas un append de 40 filas cada segundo sin compactar después. Agrupa micro-batches o programa
OPTIMIZEen particiones calientes. overwritees un snapshot nuevo, no un update. El historial queda; el actual no.MERGEcon predicados que acoten ficheros (y particiones). Deduplica el source. No prometas que el merge es barato.- Varios writers: entiende conflictos (capítulo 3). No lances dos streams con el mismo checkpoint.
Operación
- Compaction OSS:
OPTIMIZE/executeCompaction(). Z-Order solo en columnas de filtro real, con stats. VACUUMcon retención segura (default 7 días de data files).DRY RUNantes en tablas grandes. No usesRETAIN 0 HOURSfuera de un lab marcado como destructivo.- Observa
DESCRIBE DETAIL(ficheros, tamaño, protocol) eHISTORY(qué operaciones hinchan el log). - Storage: S3, ADLS, GCS, HDFS. Configura el filesystem/Hadoop según la guía actual de Delta; no copies LogStore de 2019 sin verificar si tu release aún lo necesita.
Evolución
- Añadir columnas es barato y explícito. Renombrar/quitar/cambiar tipo suele exigir
overwriteSchemao table features (column mapping) que suben el protocolo. - CDF, deletion vectors, clustering, identity columns: actívalos porque un lector/writer los necesita, no por moda. Un reader antiguo dejará de abrir la tabla.
- Distingue Delta Lake OSS de Databricks Runtime, Unity Catalog (producto), Predictive Optimization y Auto Optimize gestionado.
Streaming
checkpointLocationpersistente, no un/tmpdel driver. Distinto de_delta_log.- Exactly-once del sink Delta ≠ exactly-once de todo el sistema.
- Source append-only:
skipChangeCommitssi la fuente recibe DML y no te importan esos commits; CDF si sí te importan los cambios de fila. foreachBatch+ MERGE: idempotencia (txnAppId/txnVersiono merge por clave estable). Sin side effects sueltos.
Recovery
- Time travel y
RESTOREayudan a inspeccionar y revertir dentro de la retención. No sustituyen backups (otro bucket, replicación, export). - Si el log o los Parquet desaparecen del prefix, no hay snapshot que consultar.
- No edites
_delta_logpara “recuperar”. Restaura una copia o unRESTOREa una versión que aún tenga ficheros.
Recorrido del manual
text
Parquet + _delta_log
→ tabla events
→ commits / snapshots
→ MERGE customers
→ VERSION AS OF / VACUUM
→ OPTIMIZE / particiones
→ readStream / writeStream
→ operaciónIceberg se documenta aparte: mismo tipo de problema (tabla lakehouse), otro protocolo. No mezcles recetas.
