Real-world SaaS deployments rarely deal with a single data shape. UrbanPulse needs to bring in file-based, relational, and NoSQL data, and Fabric provides a distinct ingest pattern for each. This module walks through all three:
Files zone, then convert to a managed Delta table.All three patterns converge on a single Bronze Lakehouse with a single SQL endpoint, ready for downstream analytics and AI in later modules.
Files zone.Real SaaS deployments hit data in many shapes. Fabric's value is that you don't have to pick one tool - you pick the right pattern per source and they all converge on OneLake.
From your workspace home, click + New item → type "Lakehouse" in the search box → pick Lakehouse.
In the dialog:
lh_urbanpulse_bronzeTables/ + Files/ layoutClick Create. Fabric opens the new, empty Lakehouse Explorer.
lh_urbanpulse_bronze filled inThe Explorer pane should now show two top-level folders: Tables (empty) and Files (empty). You're ready to ingest.
The facility catalog is provisioned in an Azure Storage account. The container facilitycatalog contains:
facility_catalog.parquet - the 5-row facility table you'll promote to Deltafacilities/ - a folder of 5 facility photo JPGs (referenced by the photo_path column)Fabric supports two patterns for getting this data into your Lakehouse. Both are valid; pick the one that matches your scenario:
| Pattern | When to use it | Data movement |
|---|---|---|
| Option A - Shortcut | Source data already lives in ADLS Gen2 / Blob Storage and you want a live, virtualized view with no copy. Recommended for production SaaS deployments. | Zero copy - data stays in the source storage account; OneLake reads it on demand. |
| Option B - Upload | You need a local copy in OneLake (e.g., the source will be decommissioned, or you want full control over the file lifecycle). | One-time copy from local disk into the Lakehouse Files zone. |
This option requires a short-lived Shared Access Signature (SAS) token on the container. Generate it first, then create the shortcut.
Generate the SAS token (Azure portal):
facilitycatalog → Generate SAS.Key 1. Permissions: select Read and List.HTTPS only.sp=r&st=...; not the full URL).Create the shortcut (Fabric Lakehouse Explorer):
https://<storage-acct>.blob.core.windows.net/facilitycatalog.Shared Access Signature (SAS).facilitycatalog and leave the sub-path blank to mount the container root.Files/facilitycatalog/ with both facility_catalog.parquet and facilities/ visible immediately - no copy, no upload.Organizational account (Entra) authentication is also supported if your identity has Storage Blob Data Reader on the container.
facilitycatalog shortcut expanded, showing facility_catalog.parquet and facilities/ mounted from Azure Blob Storagefacilitycatalog visible alongside the standard Files folderTwo ways to grab the source files:
urbanpulse-lab-data.zip bundle. The Parquet file and the five facility photos are inside it.facilitycatalog. Select facility_catalog.parquet and the facilities/ folder → Download.In the Fabric Lakehouse Explorer, right-click Files → Upload → Upload files for the parquet, and Upload folder for the facilities directory.
facility_catalog.parquet and facilities / uploaded directly under FilesFiles/facilitycatalog/facility_catalog.parquet and with Option B it lives at Files/facility_catalog.parquet.
In Files, right-click facility_catalog.parquet (whether under the shortcut folder or directly under Files) → Load to Tables → New table.
Name it facility_catalog and click Load.
Tables/facility_catalog. Takes ~30 seconds.
facility_catalog before clicking LoadRefresh the Tables list. Click facility_catalog. You should see rows with columns including facility_id, facility_name, region_id, photo_path, beds_total, beds_icu.
facility_catalog with all columnsMirroring brings your operational SQL data into Fabric continuously, with no ETL pipelines to author. Fabric reads the source's CDC log and writes Delta into OneLake.
lh_urbanpulse_bronze. Right-click Tables → New shortcut → Microsoft OneLake.mir_urbanpulse_cityops).Hospitals, Wards, and Staff and click Create.From the workspace, click + New item → search "Mirrored". Choose Mirrored Azure SQL Database.
Name it: mir_urbanpulse_cityops.
Open the Azure SQL database resource in the Azure portal under your assigned resource group. Copy the server name, database name, and SQL admin credentials from the resource blades (see Module 0 · Setup & Environment Check) and paste them into the connection wizard:
Server: (from Azure portal → SQL database → Connection strings)
Database: (from Azure portal → SQL database overview)
Auth: SQL authentication
Username: (SQL admin login from your SQL server)
Password: (SQL admin password from your SQL server)
Tick all three: Hospitals, Wards, Staff. Click Mirror database.
The mirror creates a snapshot first, then switches to incremental CDC. Status pane should reach Replicated in under two minutes.
Hospitals, Wards, and Staff with status Replicated and row counts populatedOpen lh_urbanpulse_bronze. Right-click Tables → New shortcut → Microsoft OneLake. Pick mir_urbanpulse_cityops and select Hospitals, Wards, and Staff. Click Create.
The three SQL tables now appear in the Bronze Lakehouse alongside the Parquet upload, ready to be joined with the Cosmos and uploaded data in a single SQL query.
Hospitals, Wards, and Staff from mir_urbanpulse_cityops visible in the Tables treeMirroring brings Cosmos DB documents into Fabric continuously with no ETL pipelines to author. Fabric reads the Cosmos change feed and lands the documents as managed Delta tables in OneLake, queryable through the same SQL endpoint as your Lakehouse.
lh_urbanpulse_bronze. Right-click Tables → New shortcut → Microsoft OneLake.mir_urbanpulse_routing).regions and trainRoutes and click Create.From the workspace, click + New item → search "Mirrored". Choose Mirrored Azure Cosmos DB.
Name it: mir_urbanpulse_routing.
Open your Azure Cosmos DB account in the Azure portal (under your assigned resource group). Go to Settings → Keys, copy the URI and primary key (or read-only key), and paste them into the connection pane. See Module 0 · Setup & Environment Check for context.
Choose database: urbanpulse.
urbanpulse database selectedTick regions and trainRoutes. Click Mirror database.
Initial snapshot lands within ~1 minute; the change feed keeps the Delta copy current after that.
regions and trainRoutes selected, ready to click Mirror databaseOpen the Mirrored database item. The Replication status page lists both containers as replicated tables once the initial snapshot completes. Status should read Running with row counts populated for regions and trainRoutes.
regions and trainRoutes replicated with status RunningOpen lh_urbanpulse_bronze. Right-click Tables → New shortcut → Microsoft OneLake. Pick mir_urbanpulse_routing and select both regions and trainRoutes. Click Create.
This makes both Cosmos collections appear as tables in the same Bronze Lakehouse alongside the Parquet upload and the SQL mirror, so a single SQL query in the next step can join all three sources.
regions and trainRoutes from mir_urbanpulse_routing visible in the Tables treeThe payoff. Three different ingest mechanisms, but to a downstream consumer they're all just tables in your Lakehouse SQL endpoint.
Top-right of the Lakehouse, click the dropdown that says Lakehouse and choose SQL analytics endpoint.
Click New SQL query and paste:
-- A query that proves the three sources unify into one Lakehouse view.
-- Hospital, its mirrored ward count, its region, and the train routes that serve that region.
SELECT
h.hospitalId,
h.name AS hospital_name,
h.facilityType,
f.beds_total,
f.beds_icu,
f.photo_path AS sample_photo, -- uploaded Parquet → Delta
(
SELECT COUNT(*) FROM dbo.Wards w WHERE w.hospitalId = h.hospitalId
) AS ward_count, -- mirrored from Azure SQL
r.name AS region_name, -- mirrored from Cosmos
r.population AS region_population,
(
SELECT STRING_AGG(tr.color, ', ')
FROM trainRoutes tr
CROSS APPLY OPENJSON(tr.regionsServed) WITH (rid VARCHAR(16) '$') s
WHERE s.rid = h.regionId
) AS train_lines_serving_region
FROM dbo.Hospitals AS h -- mirrored from Azure SQL
JOIN dbo.facility_catalog AS f ON f.facility_id = h.hospitalId -- uploaded Parquet → Delta
JOIN regions AS r ON r.regionId = h.regionId -- mirrored from Cosmos
ORDER BY h.hospitalId;
You should see one row per hospital, with bed counts from the uploaded Parquet, ward counts from the mirrored SQL DB, and region + train-line info from the mirrored Cosmos DB. That's three different physical data stores in one query.
Tables shows facility_catalog (uploaded), Hospitals/Wards/Staff (mirrored from SQL), and regions + trainRoutes (mirrored from Cosmos).| Object | Type | How it got there | Use case |
|---|---|---|---|
facility_catalog |
Delta | Parquet file upload + Load to Tables | Static reference data, region/photo lookups |
Hospitals / Wards / Staff |
Mirrored Delta | Mirrored Azure SQL DB (CDC) | Operational OLTP data, near-real-time |
regions / trainRoutes |
Mirrored Delta | Mirrored Azure Cosmos DB for NoSQL (change feed) | NoSQL data (geo + nested arrays), zero-ETL CDC |
Module 3 brings in the real-time half of the medallion: live Event Hub data flowing through Eventstream into the Eventhouse.