Home > Tutorials > Palantir Foundry to Fabric Migration
🟣 Tutorial 55: Palantir Foundry → Microsoft Fabric Migration¶
Last Updated: 2026-05-21 | Status: ✅ Final | Maintainer: Platform Team
| Difficulty | ⭐⭐⭐⭐ Advanced |
| Time | ⏱️ 360-480 minutes (multi-component migration) |
| Focus | Palantir Foundry ontology, transforms, datasets, and pipelines → Microsoft Fabric medallion architecture, Fabric IQ ontology, OneLake, and Direct Lake reporting |
Third-party references — publicly sourced, good-faith comparison
This page references non-Microsoft products and services. That information is drawn from each vendor's publicly available documentation and is offered for honest, good-faith comparison only. This is a personal project written from a Microsoft Fabric and Azure perspective; it does not claim expertise in, or authority over, any third-party product, and nothing here is an official statement by, or endorsed by, those vendors. Capabilities, pricing, and features change often — always verify against the vendor's current official documentation. Where a third-party offering is the stronger choice, we say so plainly.
📋 Table of Contents¶
- Overview
- Why migrate
- Component mapping
- Reference architecture
- Prerequisites
- Step-by-step migration
- Ontology migration deep dive
- Egress, network, and cost considerations
- Validation checklist
- Troubleshooting
- References
📖 Overview¶
Palantir Foundry is an end-to-end data platform with a strong ontology layer (semantic objects + properties + links), transforms (Python or SQL), datasets (Parquet + Delta in the platform's object store), pipelines, and apps. It is a capable, mature platform, and the ontology and operational-decision tooling it pioneered are genuine strengths. The descriptions of Foundry here are based on Palantir's publicly available documentation (as of this page's date); always verify against Palantir's current official docs. Organizations choose to migrate from Foundry to Microsoft Fabric for several reasons — usually some combination of:
- License consolidation — collapsing Foundry, Power BI, and Azure analytics spend into a single Fabric F-SKU.
- Microsoft-native tooling — preferring Power BI, Purview, Entra ID, and Microsoft Defender over Foundry-native equivalents.
- OneLake gravity — operational systems already write to OneLake, and Foundry sits as an island.
- AI estate consolidation — using Fabric IQ, Data Agents, and Azure OpenAI rather than Foundry AIP.
This tutorial covers the canonical migration path: export Foundry datasets and ontology to OneLake, rebuild the ontology in Fabric IQ, port transforms to PySpark / Dataflows Gen2, and republish dashboards in Power BI Direct Lake.
📝 Scope: This is a technical migration tutorial. Contract, licensing, and procurement work should be sequenced ahead of any of the steps below — Foundry is typically an enterprise contract with a fixed term, and the migration timeline must align with renewal windows.
🎯 Why migrate¶
The table below maps common drivers for choosing Fabric to the Fabric capability that addresses them. It reflects Foundry behavior as described in Palantir's publicly available documentation; where Foundry is the better fit for a given need, stay on Foundry. This is a comparison from a Microsoft Fabric perspective, not an authoritative assessment of Foundry.
| Driver for considering Fabric | What Fabric offers |
|---|---|
| Want the semantic layer to be queryable outside the platform | Fabric IQ ontology — queryable from notebooks, agents, and Power BI |
| Prefer a single-SKU pricing model | F64 capacity covers all workloads under one SKU |
| Replacing Foundry Forge (apps) | Power Apps + Translytical Task Flows + Power BI |
| Replacing Foundry AIP (LLM agents) | Data Agents, Azure OpenAI, and the Fabric MCP server |
| Want data in an open table format | OneLake Delta tables (open Parquet + Delta Lake spec) |
| Deep Microsoft 365 / Teams / Entra integration is a priority | Native — Entra ID, Teams cards, Outlook embedded reports |
| Reducing egress when integrating non-Foundry sources | OneLake shortcuts (S3, GCS, ADLS, Dataverse) — zero copy |
🧭 Component mapping¶
The Foundry → Fabric translation below is based on Palantir's publicly documented component model (as of this page's date). Verify specifics against Palantir's current official documentation:
| Palantir Foundry component | Microsoft Fabric equivalent | Notes |
|---|---|---|
| Ontology (object types, properties, links) | Fabric IQ ontology + Knowledge Graph | Map object types → entities, properties → fields, links → relationships. See Fabric IQ. |
| Object Storage V2 datasets | OneLake Delta tables in Bronze/Silver/Gold lakehouses | Foundry datasets are already Parquet — bulk export to OneLake is straightforward. |
| Code Workbooks / Code Repositories (PySpark transforms) | Fabric notebooks in Data Engineering | Mostly drop-in; refactor foundry_* SDK imports to PySpark + pyspark.sql. |
| Pipeline Builder (visual SQL) | Dataflows Gen2 | Visual paradigm, same Power Query M language Power BI uses. |
| Object Explorer (search the ontology) | OneLake Catalog + Fabric IQ | Catalog handles discovery; IQ handles semantic queries. |
| Foundry Slate / Workshop / Foundry Forge (apps) | Power Apps + Translytical Task Flows + Power BI | Workshop write-back → Translytical task flows. |
| Quiver / Contour (interactive analysis) | Power BI + Fabric notebooks | Power BI for dashboards, notebooks for ad-hoc exploration. |
| AIP Logic / AIP Agents | Data Agents + Azure OpenAI | See Data Agents. |
| Health Checks / Data Lineage | Microsoft Purview + Fabric Workspace Monitoring | Native lineage from OneLake through PBI. |
| Foundry permissions (projects, marks, organizations) | Workspace RBAC + OneLake Security + Purview sensitivity labels | Marks → sensitivity labels; projects → workspaces; organizations → Entra groups. |
| Foundry user-defined functions (UDF) | PySpark UDFs / Fabric User Data Functions | Most UDFs translate without changes; review for any foundry_* calls. |
| Object Set syntax in code | Replace with pyspark.sql.DataFrame joins + Fabric IQ queries | Behavioral equivalence, not syntactic. |
🏗️ Reference architecture¶
flowchart LR
subgraph Foundry["🟣 Palantir Foundry (source)"]
FD[Datasets<br/>Object Storage V2]
FO[Ontology<br/>objects + props + links]
FP[Pipelines<br/>Code workbooks + Pipeline Builder]
FA[Apps<br/>Workshop / Forge / Quiver]
end
subgraph Bridge["🔄 Migration bridge"]
EXP[Foundry Export API<br/>+ object storage downloader]
SHC[OneLake shortcuts<br/>to S3/ADLS<br/>if Foundry is on AWS]
end
subgraph Fabric["🟦 Microsoft Fabric (target)"]
OL[(OneLake<br/>Bronze · Silver · Gold)]
IQ[Fabric IQ<br/>Ontology + Graph]
NB[Fabric Notebooks<br/>PySpark transforms]
DF[Dataflows Gen2<br/>Pipeline Builder replacement]
PA[Power Apps + Translytical<br/>Apps replacement]
PBI[Power BI<br/>Direct Lake reports]
DA[Data Agents<br/>AIP replacement]
PV[Microsoft Purview<br/>governance + lineage]
end
FD --> EXP --> OL
FD -.shortcut.- SHC -.- OL
FO --> IQ
FP --> NB
FP --> DF
FA --> PA
OL --> PBI
OL --> DA
Fabric --> PV The bridge is built once and torn down at the end of migration. The steady state is OneLake → Fabric IQ → Power BI / Data Agents, with Purview wrapping everything for governance.
📋 Prerequisites¶
- ✅ Fabric F64 capacity provisioned with workspace identity (Tutorial 00)
- ✅ Bronze/Silver/Gold lakehouses in OneLake (Tutorials 01-03)
- ✅ Foundry Administrator role and Data Engineer in the source workspace
- ✅ Foundry API token with read access to source datasets and the ontology
- ✅ A target landing location in OneLake (recommend a dedicated
lh_foundry_migrationlakehouse during the cutover, then promote to Bronze) - ✅ Migration assessment from Tutorial 13 signed off by stakeholders
🚀 Step-by-step migration¶
Step 1 — Inventory the Foundry estate¶
Pull a complete inventory before touching anything. Foundry's REST API lets you enumerate without exporting data.
# foundry_inventory.py
import requests, os, json
FOUNDRY = os.environ["FOUNDRY_HOSTNAME"] # e.g. yourtenant.palantirfoundry.com
TOKEN = os.environ["FOUNDRY_TOKEN"]
HDRS = {"Authorization": f"Bearer {TOKEN}"}
# 1. Datasets
datasets = requests.get(f"https://{FOUNDRY}/api/v2/datasets", headers=HDRS).json()
# 2. Ontology object types
objects = requests.get(f"https://{FOUNDRY}/api/v2/ontologies/default/objectTypes", headers=HDRS).json()
# 3. Code repos (transforms)
repos = requests.get(f"https://{FOUNDRY}/api/v2/codeRepositories", headers=HDRS).json()
inventory = {
"datasets": [{"rid": d["rid"], "name": d["name"], "size_gb": d.get("sizeBytes", 0) / 1e9} for d in datasets["data"]],
"object_types": [{"rid": o["rid"], "apiName": o["apiName"]} for o in objects["data"]],
"repositories": [{"rid": r["rid"], "name": r["name"]} for r in repos["data"]],
}
print(json.dumps(inventory, indent=2))
Save this inventory — it drives the wave plan in Step 2.
Step 2 — Build a wave plan¶
Group datasets into migration waves. Recommended waves:
- Wave 1 — Foundational reference data (small, low blast radius)
- Wave 2 — Core operational datasets (the ones every dashboard depends on)
- Wave 3 — Domain-specific marts
- Wave 4 — Ontology and applications (must come after data lands)
For each dataset, decide: bulk export (Parquet/JSON dump → OneLake) or shortcut (point OneLake at the underlying S3/ADLS Foundry storage if available).
Step 3 — Land Bronze data in OneLake¶
Two patterns: shortcut (preferred when possible) and export.
3a. OneLake shortcut (zero copy)¶
If Foundry is deployed on Azure or AWS and your administrator can grant read access to the underlying object store, point OneLake shortcuts directly at it. This avoids any data movement.
# notebook cell — register a shortcut to the Foundry Parquet location
mssparkutils.fs.mssparkutils.fs.mount(
"abfss://<container>@<foundry-storage>.dfs.core.windows.net/path/to/dataset",
"/lakehouse/default/Files/foundry_<dataset>"
)
3b. Bulk export via Foundry API¶
When shortcuts aren't viable (different cloud, network constraints, or contractual reasons), bulk export.
# foundry_export.py — sketch
from foundry_dev_tools import FoundryContext
import shutil, os
ctx = FoundryContext(token=os.environ["FOUNDRY_TOKEN"],
foundry_url=f"https://{os.environ['FOUNDRY_HOSTNAME']}")
DATASETS = [
"ri.foundry.main.dataset.<rid>",
# ...
]
for rid in DATASETS:
ds = ctx.dataset(rid)
parquet_dir = ds.transactions.last_committed.download_to_local("./tmp/" + rid)
# Upload to OneLake via Spark write
# (run from inside a Fabric notebook — write directly to lh_bronze)
df = spark.read.parquet("./tmp/" + rid)
df.write.format("delta").mode("overwrite").save(f"abfss://workspace@onelake.dfs.fabric.microsoft.com/lh_bronze.Lakehouse/Tables/foundry_{rid}")
💡 Foundry Dev Tools (
pip install foundry-dev-tools) is the open-source Palantir-published client library. It handles auth, transactions, and chunked downloads cleanly.
Step 4 — Port transforms¶
Foundry Code Workbooks are mostly PySpark with a few foundry_* SDK calls (mainly input/output decorators and Transforms lineage hooks).
Foundry transform:
from transforms.api import transform_df, Input, Output
@transform_df(
Output("ri.foundry.main.dataset.gold_cust"),
raw=Input("ri.foundry.main.dataset.bronze_cust"),
)
def compute(raw):
return raw.filter(raw.status == "active").select("id", "name", "tier")
Fabric notebook equivalent:
# notebook cell — same logic, no Foundry decorators
df_raw = spark.read.format("delta").table("lh_bronze.bronze_cust")
df_gold = df_raw.filter(df_raw.status == "active").select("id", "name", "tier")
df_gold.write.format("delta").mode("overwrite").saveAsTable("lh_gold.gold_cust")
Patterns to handle during port:
Input/Outputdecorators → Replace withspark.read.format("delta").table(...)/df.write.saveAsTable(...).Markings(PII / sensitivity) → Map to Purview sensitivity labels.Profiledefinitions → Translate to Delta partition + Z-ORDER strategies.- Custom validation hooks → Move to Great Expectations suites (validation framework).
- Foundry-native
expectationspackage → Replace with Great Expectations orpyspark.sql.dataframe-level assertions.
Step 5 — Rebuild the ontology in Fabric IQ¶
This is the highest-value piece of the migration. The Foundry ontology becomes a Fabric IQ ontology + Knowledge Graph.
Export the Foundry ontology to JSON, then map:
| Foundry concept | Fabric IQ concept |
|---|---|
| Object Type | Entity |
| Property | Field |
| Link | Relationship |
| Search index | Catalog index |
| Action (writeback) | Translytical task |
See Fabric IQ for the authoring workflow. The ontology is defined in YAML and round-trips through Git.
Step 6 — Republish dashboards¶
Foundry Quiver / Contour / Workshop dashboards become Power BI Direct Lake reports.
- Identify the source dataset for each Foundry dashboard.
- Build the Fabric semantic model on top of the Gold lakehouse table.
- Recreate visuals in Power BI Desktop.
- Connect via Direct Lake (preferred) or DirectQuery if the model exceeds Direct Lake limits.
See Direct Lake and Tutorial 05.
Step 7 — Replace Foundry Apps (Workshop / Forge / Slate)¶
Three replacement patterns depending on the app complexity:
| Foundry app type | Fabric replacement | When to use |
|---|---|---|
| Read-only dashboard (Quiver / Contour) | Power BI Direct Lake report | Default |
| Read + write-back (Workshop with Actions) | Power BI report + Translytical task flow | Operational write-back from the report itself |
| Custom UX with workflows (Forge / Slate) | Power Apps canvas + Power Automate + Fabric REST API | When the app is genuinely bespoke |
Step 8 — Cutover and decommission¶
- Run both platforms in parallel for one reporting cycle.
- Reconcile core KPIs to within an agreed tolerance (typically ≤ 0.5% drift).
- Repoint downstream consumers (BI, ML, external APIs).
- Freeze writes to Foundry.
- Take a final archive snapshot to OneLake
lh_archive. - Cancel the Foundry contract at the renewal boundary.
🧩 Ontology migration deep dive¶
The ontology is the highest-leverage piece of Foundry — and the trickiest piece to migrate. A naive table-level migration will lose the semantic layer entirely.
Pattern: Object Type → Fabric IQ Entity
# Fabric IQ ontology file (excerpt)
entities:
- name: Customer
primary_key: customer_id
fields:
- { name: customer_id, type: string, source: lh_gold.gold_customer.customer_id }
- { name: name, type: string, source: lh_gold.gold_customer.name }
- { name: tier, type: enum, values: [bronze, silver, gold, platinum] }
relationships:
- { name: orders, to: Order, cardinality: one_to_many, fk: orders.customer_id }
- { name: account, to: Account, cardinality: one_to_one, fk: account.customer_id }
This becomes queryable by Data Agents, Power BI semantic models, and Fabric REST APIs in one place.
💰 Egress, network, and cost considerations¶
| Concern | Mitigation |
|---|---|
| Foundry on AWS, Fabric in Azure | Cross-cloud egress charged by AWS. Use OneLake shortcuts where possible (zero copy). For bulk migration, use Azure Data Box or AWS Snowball. |
| Foundry on Azure, different tenant | Cross-tenant network paths via private link. Verify subscription RBAC. |
| Large dataset bulk export | Foundry's API rate-limits per token. Use multiple service accounts and parallel transactions; expect 4-6 hours per TB. |
| Re-derivation cost | Don't migrate computed datasets if the upstream sources are also being migrated — re-derive on Fabric. Saves 30-50% of migration time. |
✅ Validation checklist¶
- Every Foundry dataset has a corresponding OneLake Delta table
- Row counts match (Foundry vs. OneLake) for every Bronze table
- All transforms ported, tests added in
validation/ - Ontology rebuilt in Fabric IQ — each object type mapped
- Sensitivity labels (formerly Foundry marks) applied via Purview
- Every Foundry dashboard has an equivalent Power BI report
- All Foundry apps (Workshop / Forge) replaced or formally retired
- Downstream consumers repointed
- Reconciliation report signed off by data stewards
- Foundry account frozen and archived
🛠️ Troubleshooting¶
| Symptom | Likely cause | Fix |
|---|---|---|
| Foundry API rate limit (429) | Single service account exceeding RPS quota | Stripe across 4-8 service accounts; back off on 429 |
| OneLake write throughput drop during bulk export | Single-writer Spark job | Use repartition(N) to parallelize; size N to capacity vCores |
| Ontology fields don't appear in Fabric IQ | Source Delta tables not yet refreshed | Check the lineage from Bronze upward; refresh the materialized view |
| Power BI Direct Lake fallback to DirectQuery | Table size > Direct Lake SKU limit | Move to import mode or partition the table |
Foundry transform uses MultipassContext | Auth/identity context that Fabric doesn't have | Map to managed identity + Entra group claims |
📚 References¶
- Tutorial 13 — Migration Planning
- Fabric IQ — the ontology replacement for Foundry's ontology
- Data Agents — replacement for Foundry AIP
- OneLake Shortcuts — zero-copy bridging to AWS/GCP storage
- Translytical task flows — Workshop write-back replacement
- Best practices — Migration patterns
- Palantir Foundry Dev Tools (open source client)
- Fabric API for GraphQL — REST API replacement for Foundry's APIs
Navigation: ⬅️ 45 — On-Prem SSAS/SSIS/SSRS | Tutorials Home | 56 — Informatica → Fabric ➡️