DP-700 · MÓDULO 2 🏠

Lakehouses en Microsoft Fabric

El elemento fundamental del data engineering en Fabric: Tables vs Files, Delta Lake a fondo, managed vs external, schemas, ingesta, SQL analytics endpoint, Direct Lake y seguridad. 🌸

Principiante Intermedio
🎯

1. Objetivos y encaje en el DP-700

¿Qué te enseña este módulo?

Este es el módulo donde vemos el elemento fundamental del data engineering en Fabric: el lakehouse. Los objetivos oficiales del módulo son:

  1. Describir características y capacidades de los lakehouses en Fabric.
  2. Crear un lakehouse.
  3. Ingestar y transformar datos en un lakehouse.
  4. Consultar y analizar los datos con SQL y Spark.

Peso en el examen DP-700

El lakehouse es el corazón de la DP-700. Aparece transversalmente en los tres dominios:

Dominio%Cómo aparece el lakehouse
Implement and manage30–35%Workspace, roles sobre lakehouse, item-level sharing, seguridad (RLS/CLS/OLS), CI/CD sobre lakehouse
Ingest and transform30–35%Ingesta a Tables/Files, notebooks PySpark, Dataflows Gen2, pipelines, shortcuts, mirroring, dimensional modeling en lakehouse
Monitor and optimize30–35%Optimización de Delta tables (V-Order, OPTIMIZE, VACUUM), partitioning, performance del SQL analytics endpoint

🎯 Qué cambia respecto a la DP-600

En la DP-600 el lakehouse se cubre desde la perspectiva del consumo Power BI: Direct Lake, semantic models, medidas DAX. En DP-700 el enfoque cambia radicalmente y aparecen conceptos que ANTES no se profundizaban:

  • 🆕 Managed vs external tables (a nivel Spark)
  • 🆕 Schema-enabled lakehouses (feature moderna)
  • 🆕 SQL analytics endpoint sync: cómo funciona el metadata sync y cómo forzarlo
  • 🆕 Delta Lake profundo: transaction log, time travel, ACID en detalle
  • 🆕 Automatic table discovery en Tables
  • 🆕 Cambio importante 2025: los default semantic models YA NO se crean automáticamente
🏠

2. ¿Qué es un lakehouse en Fabric?

Definición

Un lakehouse en Microsoft Fabric es un item de storage que combina lo mejor de dos mundos:

  • 🌊 Flexibilidad del data lake: puede almacenar cualquier tipo de dato (estructurado, semi-estructurado, no estructurado) en su formato nativo.
  • 🏛️ Capacidad analítica del data warehouse: puedes definir tablas con schema, aplicar transacciones ACID, y consultar con SQL.

La idea fundamental: puentear la brecha entre data lake y data warehouse trayendo capacidades de base de datos directamente sobre tu data lake, eliminando la necesidad de mantener sistemas separados.

¿Dónde vive un lakehouse?

Un lakehouse vive en un workspace de Fabric y físicamente sus datos se almacenan en OneLake (que como vimos en el Módulo 1, está construido sobre ADLS Gen2). Cada lakehouse ocupa una parte del OneLake del tenant.

¿Qué hace un lakehouse diferente de un data lake tradicional?

Un data lake tradicional (por ejemplo, un contenedor ADLS Gen2 sin más) es un almacén de ficheros. No sabe qué es una "tabla", no soporta transacciones, y para consultar sus datos necesitas un motor externo (Spark, Hive, etc.).

Un lakehouse añade encima:

  • Un metastore que registra qué carpetas son tablas.
  • Un formato de tabla (Delta Lake) que aporta ACID, schema, versionado, time travel.
  • Un SQL analytics endpoint para consultar con T-SQL sin configurar nada.
  • Integración nativa con el resto del ecosistema Fabric (Power BI, notebooks, pipelines, etc.).
🎁

3. Qué se crea al crear un lakehouse (¡cambio 2025!)

⚠️ AVISO CRÍTICO: cambio de septiembre 2025

Este punto es super importante porque en muchos materiales antiguos (incluida la DP-600) se dice que al crear un lakehouse se generan 3 items: lakehouse, SQL analytics endpoint y semantic model por defecto.

⚠️ ESO YA NO ES CIERTO desde el 5 de septiembre de 2025:

"Since September 5, 2025, Power BI default semantic models are no longer created automatically when a warehouse, lakehouse, or mirrored item is created."

"By November 30, 2025, all Power BI default semantic models are disconnected from their item and become independent semantic models."

Qué se crea AHORA al crear un lakehouse

Solo se crean 2 items en tu workspace:

  1. 🏠 El lakehouse propiamente dicho (contiene Tables, Files y shortcuts).
  2. 🔎 El SQL analytics endpoint (auto-provisionado, read-only, permite T-SQL).

Si quieres un semantic model, tienes que crearlo tú explícitamente después. Ya no es automático.

🎯 Impacto en el examen: ojo cosita, si en dumps antiguos ves una respuesta que dice "se crean 3 items automáticamente" → está desactualizada. La respuesta correcta con la doc actual es 2 items. Aun así, pueden aparecer preguntas legacy que consideren los 3; mira si el enunciado menciona features post-septiembre 2025.

Qué eran los default semantic models (contexto)

Solo por si te aparecen en preguntas antiguas: un default semantic model era un modelo Power BI que se creaba automáticamente al crear el lakehouse, contenía las mismas tablas, estaba acoplado al lakehouse (si borrabas el lakehouse, se borraba el modelo) y usaba Direct Lake mode. Ahora los semantic models son items independientes que tú creas cuando los necesitas.

📂

4. Estructura interna: Tables vs Files

Este es un tema muy examinable. Un lakehouse organiza los datos en dos carpetas top-level: Tables y Files.

La carpeta Tables

Propósito: almacenar tablas Delta Lake estructuradas y consultables.

  • ✅ Soporta queries SQL vía el SQL analytics endpoint
  • Enforcea schemas (rechaza escrituras que no cumplan el schema)
  • Soporta transacciones ACID
  • ✅ Accesible desde Power BI para reporting
  • ✅ Se auto-optimiza con V-Order compression
  • Automatic table discovery: cuando pones datos Delta en Tables, Fabric los registra automáticamente en el metastore
⚠️ Limitación: solo formato Delta. Si pones ficheros CSV, Parquet o JSON en Tables, no se registrarán como tabla.

La carpeta Files

Propósito: almacenar datos raw o semi-estructurados en su formato nativo.

  • ✅ Soporta cualquier formato de fichero: CSV, JSON, Parquet, imágenes, PDFs, XML, TXT, etc.
  • ✅ Flexible para exploración y procesamiento
  • ✅ Ideal para staging antes de transformar a Tables
  • NO enforcea schema
  • NO soporta queries T-SQL directas (Files no aparece en SQL endpoint)
  • ✅ Spark puede leerlos programáticamente

🎯 Comparativa esencial

AspectoTablesFiles
Formatos soportados para "ver como tabla"Solo DeltaCualquiera
Schema enforcement✅ Sí❌ No
Transacciones ACID✅ Sí❌ No
SQL analytics endpoint✅ Sí❌ No
Power BI Direct Lake✅ Sí❌ No
Optimización automática (V-Order)✅ Sí❌ No
Uso típicoDatos curados, silver/goldRaw, staging, bronze
Registro automático como tabla✅ Automático (Delta only)❌ Nunca

🎯 Automatic table discovery (importante)

Cuando pones datos Delta en la carpeta Tables, Fabric hace automáticamente:

  1. Valida el formato (Delta).
  2. Extrae metadata: nombres de columnas, tipos, compresión, particiones.
  3. Registra la tabla en el metastore.
  4. La expone en el SQL analytics endpoint y en el Lakehouse explorer.

No tienes que escribir CREATE TABLE manualmente para los datos que "aterrizas" en Tables.

Cuándo usar cada uno (regla práctica)

  • Files → datos raw sin procesar, staging, bronze de medallion, ficheros no estructurados (PDFs, imágenes, logs), datos que quieres reprocesar más tarde.
  • Tables → datos ya limpios y con schema definido, silver/gold de medallion, todo lo que quieras consumir desde SQL o Power BI.
🌊

5. Delta Lake a fondo

Delta Lake es la tecnología subyacente de todas las tablas de un lakehouse. Vamos a profundizar porque en DP-700 te van a preguntar por sus features específicas.

¿Qué es Delta Lake?

Delta Lake es un formato de tabla open-source desarrollado por Databricks que aporta fiabilidad y capacidades relacionales sobre ficheros Parquet en un data lake. En Fabric es el formato por defecto para tablas y es la base de toda tabla del lakehouse.

Estructura física de una Delta table

Tables/mi_tabla/
├── part-00000-....parquet    ← Ficheros de datos (Parquet)
├── part-00001-....parquet
├── ...
└── _delta_log/               ← Transaction log (JSON)
    ├── 00000000000000000000.json
    ├── 00000000000000000001.json
    └── ...
  • Los datos son ficheros Parquet (columnar, comprimido).
  • El transaction log es una carpeta _delta_log con ficheros JSON que registran cada cambio a la tabla.
  • Cada operación (insert, update, delete, merge) genera una nueva entrada en el log.

Los cuatro superpoderes de Delta Lake 🌟

🎯 A) ACID Transactions. Delta garantiza Atomicity (una operación se completa entera o no se ejecuta), Consistency (los datos siempre están en un estado válido), Isolation (múltiples usuarios pueden leer/escribir sin corromper datos) y Durability (los cambios persisten aunque el sistema falle). Esto es lo que hace que puedas escribir concurrentemente desde varios notebooks sin corromper la tabla.

🎯 B) Schema Enforcement. Delta valida cada escritura contra el schema definido. Si intentas escribir una fila que no cumple el schema (tipo distinto, columna extra sin declararla, etc.), la operación falla. Esto previene data corruption por schema drift.

🎯 C) Time Travel. Delta mantiene el historial de todas las versiones de una tabla. Puedes consultar cómo estaba la tabla en un punto pasado:

# PySpark, por número de versión
df = spark.read.format("delta").option("versionAsOf", 5).load("Tables/mi_tabla")
-- Spark SQL, por timestamp
SELECT * FROM mi_tabla TIMESTAMP AS OF '2026-04-01T10:00:00'

Uso práctico: auditar cambios, revertir errores, análisis histórico, debugging. Por defecto, las versiones se guardan 30 días (configurable con logRetentionDuration). Después, VACUUM puede purgar ficheros viejos y ya no tendrás time travel a esos puntos.

🎯 D) Efficient Updates and Deletes. Los data lakes tradicionales con Parquet no soportan updates ni deletes (los ficheros son inmutables). Delta permite UPDATE, DELETE y MERGE INTO (upsert) de forma eficiente añadiendo nuevos ficheros y marcando los antiguos como obsoletos en el log.

🎯 V-Order (feature exclusiva de Fabric)

V-Order es una optimización de escritura específica de Fabric (no está en Delta open-source estándar) que reordena y comprime los ficheros Parquet para acelerar las lecturas desde motores columnar (VertiPaq de Power BI, engine del Warehouse, etc.).

  • Está activado por defecto en Fabric (spark.sql.parquet.vorder.enabled = true).
  • Añade un pequeño overhead al escribir, pero acelera muchísimo las lecturas (especialmente desde Direct Lake y SQL analytics endpoint).
  • Recomendación oficial: dejarlo activado para tablas que se leen mucho.

🎯 OPTIMIZE y VACUUM (mantenimiento crítico)

Con el tiempo, las tablas Delta acumulan muchos ficheros pequeños (por muchas operaciones de escritura pequeñas) y ficheros obsoletos que ya no se necesitan (por updates/deletes). Dos comandos clave para mantener el rendimiento:

OPTIMIZE: compacta ficheros pequeños en ficheros más grandes.

OPTIMIZE mi_tabla

Opcional: Z-ORDER para co-localizar datos por columnas frecuentemente filtradas:

OPTIMIZE mi_tabla ZORDER BY (columna_frecuente)

VACUUM: elimina ficheros obsoletos que ya no forman parte de la tabla activa.

VACUUM mi_tabla RETAIN 168 HOURS  -- Retiene 7 días de historial
⚠️ Trampa: VACUUM por defecto retiene 7 días (168 horas). No puedes bajarlo por debajo sin desactivar una protección, porque borrar ficheros más recientes rompe el time travel y puede corromper lecturas concurrentes.
🔧

6. Managed vs External tables

Este es un tema con matices sutiles que hay que dominar.

Managed tables (el caso normal)

Una managed table es una tabla donde Fabric controla tanto el metadata como los ficheros de datos.

# La ruta no se especifica; Fabric la gestiona
df.write.format("delta").saveAsTable("mi_tabla_managed")

Comportamiento: los ficheros se guardan en Tables/mi_tabla_managed/, aparece en el Lakehouse explorer bajo Tables, y si haces DROP TABLE se borran también los ficheros de datos. 🎯 Es el enfoque recomendado y "estándar" para lakehouses en Fabric.

External tables (matices importantes)

Una external table es una tabla donde Fabric controla solo el metadata, pero los ficheros de datos viven en otra ubicación.

# Se especifica una ruta externa (por ejemplo en Files o en ADLS)
df.write.format("delta").saveAsTable(
    "mi_tabla_external",
    path="Files/mi_carpeta/mi_tabla_external"
)

# O apuntando a ADLS Gen2 directamente
df.write.format("delta").saveAsTable(
    "mi_tabla_external",
    path="abfss://container@storage.dfs.core.windows.net/mi_tabla"
)

Comportamiento: el metadata se registra en el metastore, los datos viven en la ruta especificada (fuera de Tables/), y si haces DROP TABLE se borra solo el metadata, los ficheros permanecen.

⚠️ Matiz crítico: la documentación oficial DP-700

⚠️ En la documentación de troubleshooting de lakehouse aparece esta nota importantísima:

"Lakehouses support only managed tables. External tables with CREATE TABLE ... LOCATION aren't supported. To access Delta tables in other storage locations, use shortcuts instead."

Cómo entender esta aparente contradicción:

  1. Con CREATE TABLE nombre USING DELTA LOCATION '...' (SQL DDL puro) → NO soportado en lakehouses.
  2. Con df.write.format("delta").saveAsTable(nombre, path='...') desde Spark → SÍ funciona técnicamente (Spark lo crea), pero es un enfoque que puede darte problemas.
  3. La recomendación oficial para acceder a datos externos es usar shortcuts, no external tables.
🎯 Regla de oro para el examen: si te preguntan "¿cómo accedo a datos Delta que están en ADLS Gen2 desde un lakehouse?" → la respuesta esperada es shortcut, no external table. Si te preguntan "¿qué pasa cuando dropeas una tabla?" → distingue managed (borra datos) vs external (deja datos).
AspectoManagedExternal
Ubicación datosTables/ (gestionado por Fabric)Ruta que tú especificas
Metadata gestionado porFabricFabric
DROP borra datos✅ Sí❌ No
Soporte oficial en lakehouse✅ Recomendado⚠️ Limitado
Alternativa recomendada para "external"Shortcut
🗄️

7. Lakehouse schemas (schema-enabled)

¿Qué son?

Los schemas en un lakehouse permiten agrupar tablas en colecciones nombradas (como sales, marketing, hr). Es equivalente al concepto de "schema" en SQL Server. Cuando creas un lakehouse nuevo, los schemas están habilitados por defecto desde el portal. Se crea automáticamente un schema llamado dbo.

Por qué usar schemas (6 beneficios oficiales)

  1. 🎯 Organizar tablas por dominio — más manejable cuando crece el número de tablas.
  2. 🎯 Control de acceso a nivel schema — dar permisos por schema, aplicar RLS/CLS a tablas dentro del schema.
  3. 🎯 Consultas cross-workspace con el four-part namespace: workspace.lakehouse.schema.table.
  4. 🎯 Schema shortcuts — mapear todo un schema a una carpeta con múltiples tablas Delta en otro lakehouse o ADLS.
  5. 🎯 Features avanzadas — como materialized lake views requieren schema-enabled lakehouses.
  6. 🎯 Naming rules — los nombres de schema solo pueden contener letras, números y guiones bajos (_).

Cómo se crean

Desde el portal: es el default al crear un lakehouse (schemas enabled by default). Desde la REST API: hay que especificarlo:

POST https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/lakehouses

{
  "displayName": "Lakehouse_created_with_schema",
  "description": "A schema enabled lakehouse.",
  "creationPayload": {
    "enableSchemas": true
  }
}

🎯 Four-part namespace (cross-workspace queries)

Con schemas puedes referenciar tablas en cualquier workspace desde un notebook:

-- Referenciar una tabla en otro workspace + lakehouse + schema
SELECT * FROM mi_workspace.mi_lakehouse.sales.orders

Esto es super poderoso para arquitecturas donde distintos workspaces tienen distintos dominios de datos.

Uso desde notebooks

# Notación completa
df = spark.sql("SELECT * FROM sales.orders")

# Notación completa cross-workspace
df = spark.sql("SELECT * FROM ws_ventas.lh_gold.sales.orders")

# Notación simplificada (usa el default lakehouse y schema dbo)
df = spark.sql("SELECT * FROM orders")  # Equivale a dbo.orders del default lakehouse

Schema shortcuts

Un schema shortcut crea un schema en tu lakehouse que referencia todas las tablas Delta de una carpeta en otro lakehouse o en ADLS Gen2. Al referenciar, no copia datos. Uso típico: publicar un "catálogo de datos" desde un workspace maestro a workspaces de consumo.

⚠️ Limitaciones actuales

LimitaciónDescripciónWorkaround
Shared lakehousesUn schema-enabled lakehouse NO se puede compartir directamente vía workspace sharingUsa shortcuts desde un workspace donde el usuario sí tenga rol
External ADLS tablesExternal table metadata sobre ADLS NO soportado directamente en schema-enabledUsa shortcuts para referenciar Delta tables externas
Lakehouses antiguosLos creados antes de la feature no tienen schemas. No hay tool de migración automática todavíaPrepararse usando four-part naming (ws.lh.dbo.table) en el código

Compatibilidad con lakehouses no-schema: Spark puede consultar y hacer joins entre lakehouses schema-enabled y no-schema en el mismo código. No hay incompatibilidad total, pero la migración manual sigue siendo la única opción.

📥

8. Ingesta de datos

En Fabric hay cinco métodos oficiales para meter datos en un lakehouse:

1. Upload manual

Cuándo: pruebas, exploración, ficheros pequeños ad-hoc. Desde el Lakehouse explorer: menú → Upload → seleccionas fichero/carpeta local. Los ficheros van a Files por defecto (no a Tables).

2. Load to Table

Cuándo: quieres una tabla Delta rápida sin código desde un CSV o Parquet. Desde el Lakehouse explorer: seleccionas un fichero en Files → botón derecho → Load to Table. Soporta Parquet y CSV, puedes append u overwrite, es no-code, ideal para pruebas rápidas.

3. Dataflows Gen2

Cuándo: quieres transformar con Power Query en modo low-code, o cuando el equipo viene de Excel/Power BI. Usa la interfaz visual de Power Query M, conecta a más de 300 fuentes, y al final escribe a Lakehouse (o Warehouse) como destino.

4. Notebooks (PySpark, Spark SQL, Scala, R)

Cuándo: transformaciones complejas, código personalizado, ML, integración con librerías Python.

# Leer un CSV desde Files y escribirlo como tabla Delta
df = spark.read.option("header", "true").csv("Files/mi_csv.csv")
df.write.format("delta").mode("overwrite").saveAsTable("mi_tabla")

5. Data Factory pipelines

Cuándo: mover datos desde fuentes externas (on-prem, otra cloud, SaaS), orquestación con dependencias, retry logic, movimientos batch masivos. Usa la actividad Copy Data dentro de un pipeline.

🎯 Regla del pulgar para el examen

Necesito...Herramienta óptima
Mover datos de A a B sin transformarCopy activity en pipeline
Transformación low-code con Power QueryDataflow Gen2
Transformación con código (Python/Spark)Notebook
Orquestar múltiples pasos con dependenciasPipeline
Fichero individual pequeño manualmenteUpload o Load to Table
Datos que ya viven en otro storage sin copiarShortcut
Datos que viven en BBDD operacional y quiero copia continuaMirroring
🔗

9. Shortcuts en el contexto del lakehouse

Como ya vimos los shortcuts en profundidad en el Módulo 1, aquí solo repasamos lo específico del lakehouse:

Dónde crear shortcuts

  • En Tables: solo top-level, y si es Delta → se registra automáticamente como tabla.
  • En Files: en cualquier nivel, cualquier formato, pero no se registra como tabla.

Tres tipos de shortcut en Tables

  • New table shortcut: apunta a una única tabla Delta.
  • New schema shortcut: apunta a una carpeta con múltiples tablas Delta → aparece como un schema con todas las tablas.
  • New shortcut (Files): para cualquier formato y estructura.

Por qué usar shortcuts en un lakehouse

Reduce copias de datos, permite consultar datos entre workspaces/tenants sin duplicar, acceder a storage externo (ADLS, S3, GCS) sin ingesta, combinar datos multi-fuente sin ETL y reducir costes de storage.

🔄

10. Transformación: notebooks, dataflows, pipelines

Ya vimos los métodos de ingesta. Para transformación las herramientas son las mismas pero con distinta filosofía:

Notebooks (favorito del data engineer)

  • Lenguajes: PySpark, Spark SQL, Scala, SparkR.
  • Interactivos: cell-by-cell, con visualizaciones inline.
  • Copilot en notebooks: genera código PySpark/Spark SQL desde lenguaje natural y explica código existente.
  • Ideal para: lógica compleja, machine learning, integración con librerías Python.

Dataflows Gen2 (favorito del analista)

  • Interfaz Power Query M (misma que Excel y Power BI).
  • Low-code visual, 300+ conectores.
  • Ideal para: usuarios familiarizados con Power BI, transformaciones tabulares.

Pipelines (orquestación visual)

  • Interfaz visual para diseñar workflows.
  • Actividades: Copy Data, Notebook, Dataflow, Stored Procedure, etc.
  • Ejecución secuencial o paralela con dependencias.
  • Ideal para: orquestar el pipeline completo (ingesta → transformación → carga).
🎯 En DP-700 te van a preguntar: "Un equipo de analistas familiarizados con Power Query necesita ingestar y transformar datos de SharePoint. ¿Qué herramienta?" → Dataflow Gen2. "Un data engineer necesita una transformación compleja con librerías Python y entrenar un modelo ML" → Notebook (PySpark).
🔎

11. SQL analytics endpoint

Este es uno de los temas más importantes y examinables del módulo. Presta atención especial.

¿Qué es?

El SQL analytics endpoint es una interfaz T-SQL read-only sobre las tablas Delta del lakehouse. Se auto-provisiona con cada lakehouse al crearlo, no hay que configurar nada. Detrás del capó corre en el mismo motor que Fabric Data Warehouse, así que tiene rendimiento comparable a un warehouse relacional para consultas.

Otros items que también auto-provisionan SQL analytics endpoint

No es exclusivo del lakehouse. También lo tienen Warehouses (obvio), Mirrored databases, SQL databases in Fabric y Azure Cosmos DB in Fabric. Un workspace puede tener más SQL analytics endpoints que lakehouses, porque cada item cuenta.

🎯 Es READ-ONLY sobre las tablas Delta

Puedes hacer:

  • ✅ SELECT (consultas)
  • ✅ CREATE VIEW (vistas)
  • ✅ CREATE FUNCTION (funciones)
  • ✅ CREATE PROCEDURE (procedimientos)
  • ✅ Aplicar seguridad SQL (RLS, CLS, OLS)

NO puedes hacer:

  • ❌ INSERT / UPDATE / DELETE / MERGE en las tablas Delta (para eso usa Spark)
  • ❌ CREATE TABLE sobre las tablas auto-generadas (son gestionadas por el sistema)
  • ❌ DROP TABLE sobre las auto-generadas

Para modificar datos debes usar Spark desde un notebook.

🎯 Solo aparecen tablas Delta en el SQL endpoint. Ficheros CSV o Parquet en Tables no aparecen, hay que convertirlos a Delta primero. Las tablas accedidas vía shortcut en Tables sí aparecen (si el shortcut apunta a datos Delta).

🎯 Metadata sync (importantísimo)

Cuando cambias las tablas Delta desde Spark (creas una nueva, insertas filas, etc.), el SQL endpoint tiene que sincronizarse para reflejar esos cambios.

  • Un proceso background lee los Delta logs del /Tables y actualiza el schema SQL.
  • Es automático y transparente.
  • La latencia normal es de segundos a menos de un minuto.
  • El proceso corre solo cuando el SQL endpoint está activo. Se detiene tras 15 minutos de inactividad.

⚠️ Cuándo hay delays significativos

  1. Muchos lakehouses en el mismo workspace → un solo proceso de auto-discovery para todo el workspace. Solución: mover cada lakehouse a su propio workspace.
  2. Muchos ficheros pequeños en la tabla Delta (fragmentación) → el escaneo es más lento. Solución: OPTIMIZE regular.
  3. Alto volumen de cambios simultáneos durante ETL grande → delay esperado hasta procesar todo.
  4. Alta cardinalidad de particiones → escaneo más lento. Solución: elegir particiones con menor cardinalidad, target ~1 GB por partición.

🎯 Cómo forzar refresh del metadata (3 formas)

A) Desde el portal: en el SQL analytics endpoint editor → botón Refresh en el ribbon.

B) Vía REST API:

POST https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/sqlEndpoints/{sqlEndpointId}/refreshMetadata

C) Vía T-SQL stored procedure (feature reciente): Fabric expone un stored procedure para forzar el refresh desde T-SQL.

🎯 Workaround típico en pipelines: en un pipeline Copy Data → Lakehouse → Dataflow que lee vía SQL endpoint, el dataflow puede leer datos viejos porque el sync no ha terminado. Solución oficial: añadir una Script activity entre la Copy y el Dataflow que "despierte" el SQL endpoint y fuerce el sync antes de leer.

Casos de uso típicos

  • Consultas ad-hoc: investigar datos rápidamente.
  • Conexión desde BI: Power BI, Excel, Azure Data Studio, SSMS.
  • Validación de datos: verificar resultados de transformaciones.
  • Vistas curadas: crear CREATE VIEW con joins y business logic para consumidores.
💻

12. Query con Spark notebooks

Los notebooks son la herramienta principal del data engineer en Fabric.

Spark SQL vs PySpark

Spark SQL (sintaxis SQL familiar):

%%sql
SELECT * FROM sales.orders WHERE order_date >= '2026-01-01'

O desde una celda Python:

df = spark.sql("SELECT * FROM sales.orders WHERE order_date >= '2026-01-01'")
display(df)

PySpark (API programática con DataFrames):

from pyspark.sql.functions import col

df = (spark.table("sales.orders")
      .filter(col("order_date") >= "2026-01-01"))

display(df)

Cuándo usar cada uno

  • Spark SQL: cuando ya sabes SQL y la lógica es analítica pura (SELECT, JOIN, GROUP BY…).
  • PySpark: cuando necesitas lógica programática, loops, funciones Python personalizadas, ML, integración con librerías Python.

Copilot en notebooks

Puede generar código PySpark o Spark SQL desde lenguaje natural, explicar código existente y sugerir optimizaciones. Útil especialmente si estás aprendiendo PySpark: solo tienes que escribir un comentario # Filtra pedidos del último trimestre y te sugiere el código.

Cross-workspace queries

-- Join entre lakehouses de distintos workspaces
SELECT o.order_id, c.customer_name
FROM ws_ventas.lh_gold.sales.orders o
JOIN ws_maestros.lh_maestros.dim.customers c
  ON o.customer_id = c.customer_id

Esta es una feature muy potente para arquitecturas de data mesh.

📊

13. Power BI: Direct Lake y DirectQuery fallback

En la DP-600 este tema es central. Aquí lo repasamos con los detalles que aparecen en DP-700.

Cómo Power BI conecta al lakehouse

A) Query directo al SQL analytics endpoint: analistas pueden conectar Power BI o Excel directamente al SQL endpoint para consultas ad-hoc. B) Crear un semantic model: modelo con relaciones, medidas y business logic. Desde septiembre 2025 hay que crearlo manualmente (ya no es automático).

Direct Lake (modo por defecto)

Direct Lake es un modo revolucionario donde Power BI lee directamente los ficheros Parquet de Delta sin importar ni copiar datos. Ventajas: rendimiento de Import mode (in-memory), sin necesidad de refresh (los datos siempre reflejan el estado del lakehouse) y sin duplicación de storage. Requiere: capacidad Fabric (F SKUs) o Premium (P SKUs).

🎯 Direct Lake on SQL vs Direct Lake on OneLake

Direct Lake on SQL endpoints: va a través del SQL analytics endpoint, puede hacer fallback a DirectQuery si se dan ciertas condiciones, es el modo tradicional / más común.

Direct Lake on OneLake: va directamente a los ficheros Delta en OneLake, NO soporta fallback a DirectQuery. Si algo falla → error (report visuals fail to render). Es el modo recomendado para modelos nuevos.

🎯 DirectQuery Fallback (Direct Lake on SQL)

Qué es: cuando Direct Lake no puede satisfacer la query, cae automáticamente a DirectQuery, que va al SQL endpoint. La query funciona, pero más lento.

Escenarios que provocan fallback (te lo pueden preguntar):

  1. La tabla tiene RLS a nivel SQL en el SQL endpoint.
  2. La tabla tiene Dynamic Data Masking (DDM) en el SQL endpoint.
  3. La tabla tiene OLS a nivel SQL en el SQL endpoint.
  4. La tabla se basa en una SQL view no materializada.
  5. La tabla excede los guardrails de la capacity (número de parquet files, row groups, filas).
  6. No has hecho refresh (framing) después de modificar la tabla Delta subyacente.

🎯 Controlar el fallback: DirectLakeBehavior

ValorComportamiento
Automatic (default)Silent fallback a DirectQuery. Reports funcionan, pueden ir más lentos. Para producción.
DirectLakeOnlySi falla Direct Lake → error explícito. Para desarrollo, identificar problemas.
DirectQueryOnlySiempre usa DirectQuery. Para medir performance del fallback.

Se configura en el modelo (Properties del semantic model) o programáticamente con TOM/TMSL.

Diagnosticar fallback

EVALUATE TABLETRAITS()

La columna [DirectLakeFallbackInfo] muestra el motivo. None = está usando Direct Lake.

Cómo evitar fallback

  • Ejecutar OPTIMIZE y VACUUM regularmente en las Delta tables (para no exceder guardrails).
  • Materializar vistas como Delta tables en vez de dejarlas como SQL views.
  • Mover RLS/OLS al semantic model en lugar de al SQL endpoint.
  • Refresh (framing) del semantic model después de cambios.
  • Escalar la capacity si los datos exceden guardrails del SKU actual.
🔐

14. Seguridad del lakehouse

Este apartado toca el Dominio 1 del examen. Lo profundizaremos en la Fase 4, aquí introducimos.

Niveles de acceso

A) Workspace roles (colaboradores): como vimos en el Módulo 1, Admin, Member, Contributor, Viewer. Aplican a todo el workspace. B) Item-level sharing: si quieres dar acceso solo a un lakehouse sin darle acceso a todo el workspace. Ideal para analistas o report developers.

Permisos del SQL analytics endpoint

Sobre el SQL endpoint puedes aplicar:

  • 🎯 Row-Level Security (RLS): filtrar filas por usuario.
  • 🎯 Column-Level Security (CLS): ocultar columnas por usuario.
  • 🎯 Object-Level Security (OLS): ocultar tablas o vistas.
  • 🎯 Dynamic Data Masking (DDM): mostrar datos enmascarados a usuarios sin permiso.
⚠️ Ojo importante: aplicar cualquiera de estos en el SQL endpoint puede provocar DirectQuery fallback en modelos Direct Lake on SQL. Recomendación: si es posible, mover la seguridad al semantic model.

Schema-level permissions

Si tu lakehouse tiene schemas habilitados, puedes dar permisos por schema, no solo por tabla. Útil para separar acceso por dominio de negocio.

Sensitivity labels

Puedes aplicar Microsoft Purview sensitivity labels al lakehouse. Los labels se propagan a los items downstream (semantic models, reports basados en el lakehouse).

Integración con Purview

Fabric se puede extender con Microsoft Purview para: data lineage (rastreo de origen a consumo), data catalog, data classification y compliance policies.

🔮

15. Lakehouse y Fabric IQ (novedad DP-700)

Este apartado es nuevo respecto a DP-600. Del módulo oficial:

Datos bien estructurados = base para AI

La documentación explica que la calidad de tus tablas del lakehouse impacta directamente en la calidad de las capacidades AI de Fabric. Cuando creas tablas con schemas claros, nombres consistentes, columnas descriptivas y documentación, las haces accesibles tanto para analistas humanos como para Fabric IQ data agents y Copilot.

Fabric IQ Data Agents

Los data agents de Fabric IQ pueden consultar tus tablas del lakehouse a través del SQL analytics endpoint, traduciendo preguntas en lenguaje natural a queries SQL. La calidad de las respuestas depende directamente de cómo estructures y documentes tus datos.

Copilot en Power BI

Cuando el semantic model está bien construido sobre tablas de lakehouse con relaciones claras y medidas de negocio, Copilot puede generar visualizaciones y responder preguntas razonando sobre tus datos.

🎯 Take away: buena ingeniería de datos en el lakehouse = base reutilizable para experiencias inteligentes en toda la plataforma. En el examen puede aparecer "¿Qué prácticas mejoran la efectividad de Fabric IQ agents sobre un lakehouse?" → respuesta esperada: nombres descriptivos, schema consistente, uso de schemas para dominios, documentación de tablas y columnas.
⚠️

16. Trampas típicas y confusiones frecuentes

  • Trampa 1: "Al crear un lakehouse se crean 3 items" → ❌ Desde septiembre 2025 solo se crean 2: el lakehouse y el SQL analytics endpoint. El default semantic model ya no es automático.
  • Trampa 2: "Ficheros Parquet o CSV en Tables se ven como tabla" → ❌ NO. Solo Delta tables aparecen automáticamente. Parquet/CSV en Tables no se registran; hay que convertirlos a Delta primero (o hacer Load to Table).
  • Trampa 3: "Puedo modificar datos desde el SQL analytics endpoint" → ❌ NO. Es read-only sobre las tablas Delta. Para escribir: Spark.
  • Trampa 4: "Los cambios del lakehouse aparecen instantáneamente en el SQL endpoint" → ❌ Hay metadata sync que puede tardar de segundos a varios minutos. Si necesitas datos ya, hay que forzar refresh.
  • Trampa 5: "External tables son la forma recomendada de acceder a datos externos" → ❌ La recomendación oficial es shortcuts.
  • Trampa 6: "Direct Lake siempre funciona" → ❌ Puede hacer fallback a DirectQuery (RLS, DDM, OLS, views, guardrails excedidos, framing pendiente).
  • Trampa 7: "V-Order hay que activarlo manualmente" → ❌ Está activado por defecto en Fabric.
  • Trampa 8: "VACUUM se puede bajar por debajo de 7 días" → ⚠️ Se puede pero no debes, porque rompe el time travel y puede corromper lecturas concurrentes.
  • Trampa 9: "Un shortcut a datos no-Delta en Tables aparece como tabla SQL" → ❌ Solo aparecen como tabla los shortcuts que apuntan a datos Delta.
  • Trampa 10: "Puedo compartir un schema-enabled lakehouse directamente" → ❌ Actualmente NO vía workspace sharing. Workaround: usar shortcuts.
  • Trampa 11: "El default semantic model existe y se puede seguir creando" → ❌ Ya no se crean automáticamente desde sept 2025; los existentes fueron decoupled en nov 2025 como items independientes.
🆚

17. Comparativas clave (chuleta)

Lakehouse vs Warehouse

LakehouseWarehouse
Storage principalDelta + FilesDelta (solo tablas)
Ingesta con código✅ Spark nativo⚠️ Preferentemente T-SQL
Puede almacenar ficheros no estructurados✅ Sí❌ No
Interfaz principalSpark + SQL endpointT-SQL puro
Escritura T-SQL❌ Read-only endpoint✅ Total
Ideal paraData engineering, ML, análisis mixtoBI relacional, DWH tradicional

Managed vs External tables

ManagedExternal
Ubicación datosTables/ (Fabric)Ruta especificada
DROP borra datos✅ Sí❌ No
Recomendado en lakehouse✅ Sí⚠️ Prefiere shortcuts

Tables vs Files

TablesFiles
FormatoSolo Delta se registraCualquiera
SQL endpoint
Schema enforcement
ACID
Uso típicoSilver/GoldBronze/staging/raw

Direct Lake on SQL vs on OneLake

Direct Lake on SQLDirect Lake on OneLake
RutaVia SQL endpointDirecto a ficheros Delta
Fallback DirectQuery✅ Soportado❌ NO soportado
Si excede guardrailsFallback silenciosoError explícito
Recomendado para nuevos modelos⚠️ Solo si necesitas fallback✅ Sí (recomendado)

Métodos de ingesta

MétodoCuándo
UploadManual, pequeño, ad-hoc
Load to TableCSV/Parquet a Delta sin código
Dataflow Gen2Low-code con Power Query
NotebookCódigo Spark/PySpark
Pipeline (Copy Data)Batch de fuentes externas, orquestación
ShortcutDatos que ya existen en storage compatible
MirroringReplicación continua desde BBDD operacional
🎀

18. Mini-quiz de cierre

Responde con calma para autoevaluarte. Las respuestas correctas las repasamos en la Guía Maestra de Tips y Trampas. 💕

Pregunta 1. Creas un nuevo lakehouse en Fabric hoy (año 2026). ¿Cuántos items se crean automáticamente en tu workspace y cuáles son?

  1. 3 items: lakehouse, SQL analytics endpoint y default semantic model
  2. 2 items: lakehouse y SQL analytics endpoint
  3. 1 item: solo el lakehouse
  4. 4 items: lakehouse, SQL analytics endpoint, default semantic model y default report

Pregunta 2. Un data engineer necesita borrar una tabla Delta del lakehouse pero preservar los ficheros de datos. La tabla se creó con df.write.format("delta").saveAsTable("mi_tabla", path="Files/mi_tabla"). Ejecuta DROP TABLE mi_tabla. ¿Qué pasa?

  1. Se borra el metadata y los ficheros de datos
  2. Se borra solo el metadata, los ficheros permanecen
  3. La operación falla porque no se pueden dropear tablas externas
  4. Se borra solo si el usuario tiene permiso de Contributor

Pregunta 3. Tienes una tabla Delta sales consultada por Power BI en Direct Lake mode. Aplicas Row-Level Security a nivel SQL en el SQL analytics endpoint sobre esa tabla. ¿Qué ocurre cuando un usuario abre el report?

  1. El report falla con error de permisos
  2. La query hace fallback a DirectQuery automáticamente
  3. La query sigue funcionando en Direct Lake ignorando el RLS
  4. Se muestra un mensaje pidiendo autenticación adicional

Pregunta 4. Después de un Copy Data que insertó 1M de filas en una tabla del lakehouse, un Dataflow Gen2 posterior lee datos viejos vía SQL analytics endpoint. ¿Causa más probable y workaround oficial?

  1. El pipeline falló silenciosamente. Reintentar la ejecución
  2. El SQL endpoint está pausado. Iniciar sesión manualmente
  3. El metadata sync no ha terminado. Añadir una Script activity entre la Copy y el Dataflow para forzar sync
  4. Faltan permisos ReadData al Dataflow. Añadir workspace role Contributor

Pregunta 5. En un lakehouse schema-enabled, ¿cuál es la sintaxis correcta para consultar la tabla orders del schema sales en el lakehouse lh_gold del workspace ws_ventas desde un notebook en OTRO workspace?

  1. SELECT * FROM lh_gold.sales.orders
  2. SELECT * FROM ws_ventas.lh_gold.sales.orders
  3. SELECT * FROM ws_ventas..sales.orders
  4. SELECT * FROM ws_ventas/lh_gold/sales/orders

Pregunta 6. Tienes datos Delta en un contenedor de ADLS Gen2 y quieres consultarlos desde un lakehouse en Fabric sin copiar los datos y con la recomendación oficial. ¿Qué haces?

  1. Crear una external table con CREATE TABLE ... USING DELTA LOCATION 'abfss://...'
  2. Configurar un pipeline con actividad Copy Data
  3. Crear un shortcut a la carpeta ADLS Gen2 en la sección Tables del lakehouse
  4. Usar Dataflow Gen2 con conector ADLS Gen2

Pregunta 7. Ejecutas VACUUM en una tabla Delta muy grande. Notas que las lecturas concurrentes empiezan a fallar con errores de "file not found". ¿Causa más probable?

  1. La tabla no es Delta, es Parquet plano
  2. Ejecutaste VACUUM RETAIN 0 HOURS (o menos de 168h) y borraste ficheros aún referenciados por transacciones activas
  3. VACUUM requiere modo exclusivo, no permite lecturas concurrentes
  4. Faltan permisos ReadAll sobre la tabla

BONUS (más chunga). Un semantic model en Direct Lake on OneLake referencia una tabla del lakehouse que tiene RLS a nivel SQL definido en el SQL analytics endpoint. Un usuario intenta abrir un report. ¿Qué ocurre?

  1. La query hace fallback silencioso a DirectQuery, todo funciona pero más lento
  2. La query se ejecuta en Direct Lake ignorando el RLS
  3. Los visuals del report fallan con error porque Direct Lake on OneLake NO soporta fallback
  4. Se muestra el report con RLS aplicado normalmente
🚀 ¡Módulo 2 completado! Ya dominas el lakehouse a fondo. Sigue con el Módulo 3: Apache Spark en Fabric. 🌸