Databricks Migration logo

Databricks Migration

OrganizationPopular
microsoft
databricks-migration

Ports existing Databricks notebooks and jobs to Fabric, covering dbutils to notebookutils, secret scopes to Key Vault, DBFS to OneLake, Unity Catalog mapping to schema-enabled Lakehouses, Jobs and Delta Live Tables to Spark Job Definitions and Pipelines, and Photon to the Native Execution Engine. Use whenever Databricks code has to be converted. For Fabric notebook code that is not being migrated, use spark-cli.

Overview

Publishermicrosoft
Repositoryskills-for-fabric
Skill namedatabricks-migration
Stars
1.2K
Forks
354
Bundled files
6
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 6 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by microsoft on GitHub. Read the source before you install it.

Installation

Install the Databricks Migration AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/microsoft/skills-for-fabric/tree/main/plugins/fabric-skills/skills/databricks-migration
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/microsoft/skills-for-fabric.git /tmp/skills-for-fabric
mkdir -p .claude/skills
cp -r /tmp/skills-for-fabric/plugins/fabric-skills/skills/databricks-migration .claude/skills/databricks-migration
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Databricks Migration in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Databricks Migration on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Databricks Migration is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Telemetry — MANDATORY. Every api.fabric.microsoft.com call must carry x-ms-fabric-skill: databricks-migration (az rest: --headers "x-ms-fabric-skill=databricks-migration"), including every LRO poll, fabric_lro and retry. Snippets omit it — add it anyway.

CRITICAL NOTES

  1. To find workspace details (including its ID) from a workspace name: list all workspaces, then use JMESPath filtering
  2. To find item details (including its ID) from workspace ID, item type, and item name: list all items of that type in that workspace, then use JMESPath filtering
  3. dbutils.widgets has no direct equivalent in Fabric — use notebook parameters (cell tag parameters); notebookutils.runtime.context is execution metadata, not parameter storage. If showing context fields, use documented names such as currentWorkspaceId, currentWorkspaceName, currentNotebookId, currentNotebookName, isForPipeline, and isForInteractive; activityId is the Livy job ID
  4. dbutils.library (runtime library install) has no equivalent — use Fabric Environments for reproducible library management
  5. Map each Unity Catalog catalog to a schema-enabled Lakehouse by default. This preserves the source schema.table hierarchy, with the Lakehouse representing the catalog; collisions arise only if multiple catalogs are intentionally consolidated into one Lakehouse
  6. For an under-specified workspace-wide migration, ask focused questions about inventory, workload topology, security, data locations, and runtime constraints before recommending a Fabric topology
  7. A completed Fabric migration must not retain executable dbutils.* calls in dual-runtime branches or try/except guards — replace the calls and Databricks paths outright

Databricks → Microsoft Fabric Migration

Prerequisite Knowledge

Read these companion documents before executing migration tasks:

  • COMMON-CORE.md — Fabric REST API patterns, authentication, token audiences, item discovery
  • COMMON-CLI.md — az rest, az login, token acquisition, Fabric REST via CLI
  • SPARK-AUTHORING-CORE.md — Notebook deployment, lakehouse creation, Spark job execution

For notebook and Lakehouse creation, see spark-cli. For Fabric Warehouse DDL/DML authoring, see sqldw-cli.


Table of Contents

TopicReference
Migration Orchestratormigration-orchestrator.md
Migration Workload Map§ Migration Workload Map
Complete dbutils → notebookutils Mappingdbutils-to-notebookutils.md
Unity Catalog → Fabric Lakehouse Schemascatalog-migration.md
Before/After Code Patternscode-patterns.md
Cluster Config → Fabric Spark Pools§ Cluster Config → Fabric Spark Pools
Databricks Jobs → Spark Job Definitions§ Databricks Jobs → Spark Job Definitions
Delta Sharing → Fabric External Data Sharing and OneLake Shortcuts§ Delta Sharing → Fabric External Data Sharing and OneLake Shortcuts
MLflow → Fabric ML Experiments§ MLflow → Fabric ML Experiments
Post-Migration Validation & Testingvalidation-testing.md
Migration Gotchas & Troubleshootingmigration-gotchas.md
Multi-Notebook Migration Protocol§ Multi-Notebook Migration Protocol
Failure Reporting§ Failure Reporting
Must / Prefer / Avoid§ Must / Prefer / Avoid
Authentication & Token AcquisitionCOMMON-CORE.md § Authentication
Lakehouse ManagementSPARK-AUTHORING-CORE.md § Lakehouse Management
Notebook ManagementSPARK-AUTHORING-CORE.md § Notebook Management

Context Loading Guide

IMPORTANT — Load only what you need. Do NOT read all resource files upfront. Load the specific file for the phase you are executing:

WhenRead This File
User asks to migrate a workspace (full orchestration)migration-orchestrator.md
Applying code transforms (dbutils, namespaces, paths)dbutils-to-notebookutils.md + code-patterns.md
Resolving Unity Catalog namespace collisionscatalog-migration.md
Post-migration verificationvalidation-testing.md
Troubleshooting failures or known issuesmigration-gotchas.md

Migration Workload Map

Databricks ComponentFabric TargetSeverityNotes
All-purpose cluster (notebooks, REPL)Fabric Notebook (Starter Pool or Custom Pool)InfoNo persistent cluster — Fabric provisions compute on session start
Job cluster (automated jobs)Spark Job Definition (SJD)InfoSJD maps one-to-one with Databricks Jobs on job clusters
Unity CatalogFabric Lakehouse (schema-enabled, one per catalog)InfoSchema-enabled Lakehouse preserves schema.table; default one-Lakehouse-per-catalog has no collision — see catalog-migration.md
Databricks Repos (Git-backed notebooks)Fabric Git IntegrationInfoConnect workspace to Azure DevOps or GitHub; notebooks are synced
Delta Live Tables (DLT)Fabric Notebooks + Data PipelinesBlockerNo DLT equivalent — rewrite DLT datasets as parameterized notebook cells with pipeline orchestration
Databricks SQL WarehousesFabric Warehouse or Lakehouse SQL EndpointInfoSQL warehouse sessions → Warehouse (for write) or SQL Endpoint (for read-only)
MLflow TrackingFabric ML ExperimentsInfoMLflow SDK is supported in Fabric — see § MLflow
Delta SharingOneLake Shortcuts + Fabric external data sharingWarningSee § Delta Sharing → Fabric External Data Sharing and OneLake Shortcuts
Databricks Feature StoreFeature engineering on Lakehouse/Delta tables + MLflowWarningFabric has no drop-in managed Feature Store; recreate feature tables as Delta tables in a Lakehouse and manage features via notebooks/MLflow. Verify current Fabric feature-store roadmap before committing an approach
dbutils (all sub-modules)notebookutils (most sub-modules)InfoSee dbutils-to-notebookutils.md for full mapping
Scala notebooksFabric Notebook (Spark/Scala)WarningScala is supported; swap cell magic %scala → %%spark and rewrite Databricks-specific APIs/libraries
R notebooksFabric Notebook (SparkR)WarningSparkR is supported; swap cell magic %r → %%sparkr, validate package availability, rewrite Databricks-specific APIs

Severity Definitions

LevelMeaningAction
BlockerCannot run in Fabric without redesign or user decisionStop — surface to user, require resolution
WarningMigratable but requires validation or architectural decisionMigrate with review flag
InfoDirect substitution-level changeAuto-migrate

dbutils → notebookutils Quick Reference

The complete side-by-side API table is in dbutils-to-notebookutils.md. The key mappings are:

dbutils Callnotebookutils EquivalentCompatibility Note
dbutils.fs.ls(path)notebookutils.fs.ls(path)Direct replacement
dbutils.fs.cp(src, dest)notebookutils.fs.cp(src, dest)Direct replacement
dbutils.fs.mv(src, dest)notebookutils.fs.mv(src, dest, create_path, overwrite=False)⚠️ Signature differs — see dbutils-to-notebookutils.md
dbutils.fs.rm(path, recurse)notebookutils.fs.rm(path, recurse)Direct replacement
dbutils.fs.mkdirs(path)notebookutils.fs.mkdirs(path)Direct replacement
dbutils.fs.put(path, contents)notebookutils.fs.put(path, contents)Direct replacement
dbutils.fs.head(path, maxBytes)notebookutils.fs.head(path, max_bytes)⚠️ Default differs — Python/Scala 100 KB, R 64 KB. See dbutils-to-notebookutils.md
dbutils.fs.mount(...)notebookutils.fs.mount(source, mountPoint, extraConfigs=None)✅ Supported — Microsoft Entra (default), accountKey, or sasToken auth. For cross-workspace / persistent sharing, prefer OneLake Shortcuts
dbutils.secrets.get(scope, key)notebookutils.credentials.getSecret(keyVaultUrl, secretName)Scope → Key Vault URL; key → secret name
dbutils.notebook.run(path, timeout, args)notebookutils.notebook.run(name, timeout, args)path → notebook name (relative to workspace)
dbutils.notebook.exit(value)notebookutils.notebook.exit(value)Direct replacement
dbutils.widgets.get(name)See § Widgets MigrationNo direct equivalent
dbutils.library.install(...)Not available at runtime — use Fabric Environmentsdbutils.library.restartPython() → notebookutils.session.restartPython()
dbutils.data.summarize(df)display(df.summary())Use display() or pandas describe()

Widgets Migration

dbutils.widgets has no direct equivalent in Fabric. Use these patterns instead:

Use CaseFabric Pattern
Pass parameter from parent notebookMark a cell in the child notebook as a parameters cell (notebook UI: cell "..." menu → "Mark cell as parameters"). The parent calls notebookutils.notebook.run("child", arguments={"param": "value"}) — at runtime the engine inserts a new cell beneath the parameters cell that overrides the defaults
Pipeline-driven parameterizationSame parameters-cell mechanism; the Fabric Pipeline notebook activity supplies override values via its Base parameters setting
Centralized cross-notebook configUse notebookutils.variableLibrary.getLibrary("<name>") to read values from a Variable Library item (deployment pipelines activate the right value set per stage)
Interactive selection in notebookUse display() with input cells, IPython widgets (Python only), or Fabric Data Activator

Note: notebookutils.runtime.context does not expose parameter values. It's for execution metadata (workspace/notebook/activity/user IDs, pipeline-vs-interactive flags, etc.). See dbutils-to-notebookutils.md § Runtime Context.


Cluster Config → Fabric Spark Pools

Databricks Cluster ConceptFabric Spark EquivalentNotes
All-purpose cluster (interactive)Starter PoolAuto-provisioned; no config; ideal for notebooks
Job cluster (single-use for jobs)Custom Pool (or Starter Pool) attached to SJDConfigure node size, autoscale in Fabric capacity settings
Node type (e.g., Standard_DS3_v2)Fabric node size (Small/Medium/Large/X-Large/XX-Large)Map by vCore/memory ratio
Autoscale min/max workersCustom Pool min/max node settingsAvailable in workspace Spark settings
spark.conf in cluster settingsFabric Environment Spark propertiesMove to Environment item; attach to workspace or notebook
init_scripts (cluster init)Fabric Environment install scriptNot fully equivalent — only library installs are supported
Databricks Runtime versionFabric Runtime (1.1 = Spark 3.3, 1.2 = Spark 3.4, 1.3 = Spark 3.5)Choose matching Spark version; test deprecated APIs
Photon acceleratorFabric Native Execution Engine (NEE)Enable in workspace Spark settings; vectorized execution similar to Photon

Databricks Jobs → Spark Job Definitions

Databricks Jobs ConceptFabric SJD EquivalentNotes
Job with single notebook taskSJD referencing a notebookAttach a default Lakehouse; pass parameters via SJD args
Multi-task job (DAG of tasks)Fabric Data Pipeline orchestrating multiple SJDs/notebooksPipeline activities map to job tasks; dependencies = activity dependencies
Job schedule (cron)Pipeline schedule triggerCron expression → recurrence trigger in pipeline
Job parametersSJD default arguments or notebook cell parametersParameters cell in notebook is injected at runtime
Job clusters per taskPool attached to SJDEach SJD can specify its Spark pool independently
Databricks WorkflowsFabric Data PipelinesFull DAG orchestration with conditions, loops, and failure branches

Delegate to spark-cli for SJD creation and notebook deployment.


Delta Sharing → Fabric External Data Sharing and OneLake Shortcuts

Databricks Delta Sharing PatternFabric Equivalent
Provider publishes a Delta shareFabric external data sharing for cross-tenant Fabric data, or a OneLake Shortcut to ADLS Gen2 where the Delta data resides
Recipient reads shared dataAccept the external data share into a Lakehouse (Fabric creates a read-only OneLake Shortcut), or create a direct OneLake Shortcut to accessible ADLS Gen2 data
Cross-workspace table sharing within orgOneLake Shortcuts pointing to another workspace's Lakehouse tables — no data copy
Cross-tenant sharingFabric external data sharing — live, read-only, in-place access through a shortcut in the recipient tenant

When producing a migration workload map, include both paths: direct OneLake Shortcuts for accessible ADLS or same-tenant OneLake data, and Fabric external data sharing for native cross-tenant recipient sharing.


MLflow → Fabric ML Experiments

Fabric ML Experiments are built on the MLflow SDK — most code is directly portable:

Databricks MLflow PatternFabric EquivalentMigration Action
mlflow.set_tracking_uri("databricks")Remove — Fabric tracking is automaticDelete this line in Fabric notebooks
mlflow.set_experiment("/path/exp")mlflow.set_experiment("experiment_name")Use name only (not path); Fabric creates the Experiment item
mlflow.log_metric(...)mlflow.log_metric(...) — identicalNo change
mlflow.log_artifact(...)mlflow.log_artifact(...) — identicalNo change
mlflow.autolog()mlflow.autolog() — identicalNo change
mlflow.register_model(...)mlflow.register_model(...) — identicalModel Registry is available in Fabric ML
Databricks Model ServingAzure ML Online Endpoints or Fabric Data ActivatorNo direct Fabric model serving yet — use Azure ML

Must / Prefer / Avoid

MUST DO

  • Inventory before prescribing a workspace topology — for workspace-wide requests that omit workload inventory, dependencies, security requirements, data locations, or runtime constraints, ask focused clarifying questions and present conditional choices before selecting a Fabric design
  • Replace all dbutils.* calls using the mapping in dbutils-to-notebookutils.md — dbutils is not available in Fabric notebooks
  • Migrate dbutils.fs.mount() to notebookutils.fs.mount() (✅ supported — Microsoft Entra default, or accountKey / sasToken from Key Vault). For cross-workspace or persistent sharing, prefer OneLake Shortcuts instead. Always pair mount() with unmount() in try/finally — Fabric mounts are not released automatically on session end
  • Replace dbutils.secrets.get(scope, key) with notebookutils.credentials.getSecret(keyVaultUrl, secretName) — secret scopes map to Azure Key Vault URLs
  • Redesign widget-based parameter passing using notebook parameters cells (cell "..." menu → "Mark cell as parameters"); use notebookutils.variableLibrary for centralized cross-notebook config. notebookutils.runtime.context does not expose parameter values
  • Replace dbutils.library.install*() with Fabric Environments — runtime library installs are not supported in production. dbutils.library.restartPython() maps to notebookutils.session.restartPython() (Python / PySpark only)
  • Map Unity Catalog namespaces deliberately — default to one schema-enabled Lakehouse per catalog so schema.table is preserved; require a user-approved naming policy only when consolidating multiple catalogs into one Lakehouse. See catalog-migration.md
  • Map Databricks cluster init scripts to Fabric Environments — cluster-level library installs must move to Environment items

PREFER

  • Fabric Native Execution Engine (NEE) as the Photon equivalent — enable in workspace Spark settings for vectorized execution on Delta Lake
  • OneLake Shortcuts over data copy for Delta tables that already exist in ADLS Gen2 — point directly without re-ingesting
  • Fabric Git Integration as the replacement for Databricks Repos — connect workspace to ADO or GitHub for notebook version control
  • Fabric ML Experiments for direct MLflow continuity — tracking code requires minimal changes (remove set_tracking_uri)
  • Medallion architecture when restructuring migrated Databricks catalogs — align bronze, silver, gold Unity Catalog schemas to separate Fabric Lakehouses
  • Starter Pool for migrating interactive notebook workflows — eliminates cluster startup time that was a common pain point in Databricks job clusters

AVOID

  • Do not prescribe a one-size-fits-all workspace topology when the source inventory and migration constraints are missing
  • Do not import dbutils or attempt dbutils = ... assignments in Fabric notebooks — import attempts fail with ModuleNotFoundError, while unresolved dbutils references raise NameError; always use notebookutils
  • Do not retain dbutils.* calls behind runtime-detection guards (try/except, if IS_DATABRICKS) — replace the calls and Databricks paths outright with notebookutils and Fabric paths
  • Do not assume Unity Catalog governance policies transfer automatically — RBAC, row-level security, and column masking must be reconfigured in Fabric using workspace roles and Lakehouse permissions
  • Do not use %pip install in production Fabric notebooks at runtime — use Fabric Environments for stable, versioned library management
  • Do not attempt to port Delta Live Tables (DLT) pipelines verbatim — DLT has no Fabric equivalent; rewrite as parameterized notebooks orchestrated by Fabric Pipelines
  • Do not rely on Databricks-specific Spark configurations (e.g., spark.databricks.*) — these are proprietary and will be silently ignored or raise errors in Fabric
  • Do not use DBFS paths (dbfs:/...) — there is no DBFS in Fabric; all paths must use OneLake abfss:// or Lakehouse-relative paths

Multi-Notebook Migration Protocol

For workspaces with >3 notebooks or individual notebooks >5KB, process one notebook at a time (enumerate → export → transform → summarize → deploy → release) to avoid context overflow. Track each notebook through a status lifecycle (inventory → analyzed → converted → deployed → validated, or failed).

Full protocol, status definitions, and per-notebook summary schema: migration-orchestrator.md § Phase 2.


Failure Reporting

When migration cannot complete (permission failures, unresolvable Blockers such as DLT or OS-level init scripts, namespace collisions with no user-chosen policy, or repeated API failures), emit a structured failure report — do not abandon silently. The report captures phase_reached, blockers[] (item / pattern / reason / recommendation), partial_success counts, and next_steps.

Full report schema and stopping conditions: migration-orchestrator.md § Failure Reporting.


Examples

See dbutils-to-notebookutils.md and code-patterns.md for the full mapping. Key quick references:

dbutils.fs → notebookutils.fs

python
# Databricks
dbutils.fs.ls("/mnt/bronze/orders/")
dbutils.fs.cp("/mnt/raw/file.csv", "/mnt/archive/file.csv")

# Fabric (replace DBFS/mount paths with OneLake relative paths)
notebookutils.fs.ls("Files/bronze/orders/")
notebookutils.fs.cp("Files/raw/file.csv", "Files/archive/file.csv")

dbutils.secrets → notebookutils.credentials

python
# Databricks
pwd = dbutils.secrets.get(scope="prod", key="db-password")

# Fabric (scope → Key Vault URL, key → secret name)
pwd = notebookutils.credentials.getSecret("https://myvault.vault.azure.net/", "db-password")

Unity Catalog namespace → Lakehouse schema

python
# Databricks
df = spark.read.table("prod.silver.customers")

# Fabric (ProdLakehouse represents the source catalog and is attached as context)
df = spark.read.table("silver.customers")

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Databricks Migration AI skill do?

Ports existing Databricks notebooks and jobs to Fabric, covering dbutils to notebookutils, secret scopes to Key Vault, DBFS to OneLake, Unity Catalog mapping to schema-enabled Lakehouses, Jobs and Delta Live Tables to Spark Job Definitions and Pipelines, and Photon to the Native Execution Engine. Use whenever Databricks code has to be converted. For Fabric notebook code that is not being migrated, use spark-cli.

Why use Databricks Migration on TypingMind?

Because you install it once and use it with any model. Databricks Migration is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Databricks Migration in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/microsoft/skills-for-fabric/tree/main/plugins/fabric-skills/skills/databricks-migration. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Databricks Migration?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Databricks Migration?

As many as you like. As long as a model supports skills, you can use Databricks Migration with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Databricks Migration AI skill free?

Yes. It is published on GitHub by microsoft under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇