Spark CLI
MicrosoftOfficialPublished by Microsoft
- Skill
- Tool integration
- Software development
- MIT
- Low risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
spark-cli is a mode-based dispatcher designed to handle the full lifecycle of Fabric Spark operations. It provides structured guidance for authoring notebook code, managing interactive Livy sessions, diagnosing Spark job failures, and operating Materialized Lake Views (MLV). The skill enforces strict operational boundaries, requiring users to select a specific mode (authoring, consumption, operations, or mlv) and consult the corresponding reference documentation before executing any commands to ensure correct API usage and payload construction.
What it does
- Authors and manages Fabric notebook cell code including PySpark, Scala, and %%sql.
- Facilitates interactive data analysis through Livy session management.
- Diagnoses failed, slow, or OOM Spark jobs and pipeline runs.
- Manages the complete lifecycle of Materialized Lake Views, including definition, scheduling, and refresh monitoring.
- Provides standardized patterns for data engineering, schema management, and error handling in Fabric.
- Ensures proper telemetry and authentication for all Fabric API interactions.
When to use it
- When writing or updating code within Fabric notebooks.
- When performing ad-hoc data analysis using interactive Livy sessions.
- When investigating performance bottlenecks or failures in Spark jobs.
- When creating, scheduling, or troubleshooting Materialized Lake Views.
- When you need to ensure your Fabric API calls follow mandatory telemetry and authentication standards.
Advantages
- Provides a structured, mode-based approach to prevent configuration errors.
- Centralizes complex Spark and MLV management tasks into a single interface.
- Enforces best practices for data engineering and schema management.
- Reduces ambiguity by clearly defining the scope of Spark-related operations versus other CLI tools.
Usage examples
- “Write a notebook cell that reads a bronze table and writes a silver Delta table.”
- The agent enters 'authoring' mode, reads the relevant reference, and generates the appropriate PySpark code using Delta Lake patterns.
- “My notebook run failed with an OOM error, can you help me diagnose it?”
- The agent enters 'operations' mode, reads the diagnostic workflow reference, and guides the user through analyzing the job logs and metrics.
- “Schedule a nightly refresh for the lakehouse MLV and show me its run history.”
- The agent enters 'mlv' mode, reads the MLV reference, and executes the necessary API calls to configure the schedule and retrieve the history.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/microsoft/spark-cli/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip spark-cli.zip -d .agents/skills
Documentation by Microsoft
Telemetry — MANDATORY. Every
api.fabric.microsoft.comcall must carryx-ms-fabric-skill: spark-cli(az rest:--headers "x-ms-fabric-skill=spark-cli"), including every LRO poll,fabric_lroand retry. Snippets omit it — add it anyway.
CRITICAL NOTES
To find the workspace details (including its ID) from workspace name: list all workspaces and, then, use JMESPath filtering
To find the item details (including its ID) from workspace ID, item type, and item name: list all items of that type in that workspace and, then, use JMESPath filtering
Skill disambiguation: use
spark-clifor notebook cell code (including%%sqlcells), named notebook runs, Livy sessions, Spark failure triage, and everything about a Materialized Lake View -- writing the definition, reviewing a query for incremental-refresh readiness, and scheduling, refreshing, monitoring or diagnosing an existing one. A KQL materialized view in an Eventhouse iseventhouse-cli; plain read-only T-SQL against a Warehouse or Lakehouse SQL endpoint issqldw-cli.Hard routing boundary: never execute an Eventhouse/KQL materialized-view request from this skill. Route it to
eventhouse-cli; if that skill is unavailable, state that the request cannot be completed in the current skill context and stop without calling Fabric APIs or creating artifacts.
Fabric Spark and Materialized Lake Views -- CLI Skill
This one skill owns Fabric Spark: notebook cell authoring, notebook runs, Livy-session analysis, Spark failure diagnostics, and the whole Materialized Lake View lifecycle.
It is a mode dispatcher and contains NO procedures. Pick the mode that matches the request from the table below, then read the matching references/<mode>.md file end to end with your file-reading tool BEFORE issuing a single command. That file holds the endpoints, payload shapes, templates and gotchas; acting without it produces wrong payloads and wrong results.
Mode selection
| Mode | Use when the request ... | Example triggers | Read this first |
|---|---|---|---|
authoring | writes notebook cell code (PySpark, Scala, SparkR, %%sql, %%configure), runs a notebook by name and reports a NORMAL run status, or authors a Materialized Lake View definition or reviews an MLV query for incremental-refresh readiness | write notebook code, notebook cell code, %%sql cell, run notebook, execute notebook, notebookutils, create materialized lake view, is this MLV query incremental-refresh ready | references/authoring.md |
consumption | runs interactive ad-hoc PySpark in a Lakehouse Livy session -- never a notebook | create a Livy session, run calculation in Livy, PySpark, DataFrame analysis, join tables across lakehouses, Delta time-travel | references/consumption.md |
operations | diagnoses a FAILED, unhealthy, throttled or slow Spark notebook / pipeline / Livy run | failed notebook, Spark Livy health, Spark OOM, why is my notebook slow, job diagnostics, 430 throttling | references/operations.md |
mlv | discovers or operates EXISTING Materialized Lake Views: Spark SQL discovery, refresh schedules, on-demand refresh, run history, cancellation, and refresh-failure classification | discover MLVs, list materialized lake views, schedule MLV, MLV run history, cancel refresh, trigger MLV refresh, diagnose MLV refresh failure | references/mlv.md |
Mode boundary rule
Mode is decided by the artefact and the outcome, not by the language. A notebook cell is always authoring even when the cell is %%sql. A Livy session is always consumption. A Spark run that FAILED or is unhealthy is operations; a run that succeeded is reported by authoring. For a Materialized Lake View the VERB decides: writing or reviewing the definition is authoring, while discovering, scheduling, refreshing, monitoring or diagnosing existing MLVs is mlv. If discovery must be executed, switch to consumption for Livy or authoring for a notebook only after reading the discovery command from references/mlv.md.
If a request genuinely spans modes, handle them one at a time and read each reference before you start that part. If the mode is ambiguous after reading this table, ask one short clarifying question instead of guessing.
Terminal write -- the step you must not skip
Reading the reference and planning the change is NOT completing the task. Each mutating mode ends with one state-changing call. If you did not issue it, nothing was persisted -- say so explicitly rather than reporting success.
| Mode | Terminal write |
|---|---|
authoring | for an EXISTING notebook, POST .../notebooks/{id}/updateDefinition to save the cell; a NEW notebook needs POST /v1/workspaces/{ws}/items first; for a run request, trigger the job via the Jobs API. Printing cell code into the chat is not saving or running it. |
consumption | none -- this mode is read-only |
operations | none -- this mode is read-only |
mlv | POST /v1/workspaces/{ws}/lakehouses/{lakehouse}/jobs/refreshMaterializedLakeViews/instances for an on-demand refresh, or the schedule create/update/delete call for a scheduling request. Reporting what the schedule would be is not creating it. |
Before you report the task done, confirm the terminal call returned success and, where the reference documents a readback, read the artefact back to prove the change landed.
Shared essentials (all modes)
Resolve the workspace and item first; every mode depends on it.
| Task | Reference | Notes |
|---|---|---|
| Finding Workspaces and Items in Fabric | COMMON-CLI.md | Mandatory -- read before resolving any workspace or item id |
| Fabric Topology & Key Concepts | COMMON-CORE.md | Item types, workspaces, capacities |
| Environment URLs | COMMON-CORE.md | Sovereign / non-public cloud hosts |
| Authentication & Token Acquisition | COMMON-CORE.md | Wrong audience = 401; read before any auth issue |
| Authentication Recipes | COMMON-CLI.md | az login flows and token acquisition |
| Core Control-Plane REST APIs | COMMON-CORE.md | Pagination, LRO polling, rate limiting |
| Gotchas & Troubleshooting | COMMON-CLI.md | az rest audience, shell escaping, token expiry |
Rules
MUST
Select exactly one mode from the table above before doing anything else.
Treat vague requests such as "set up my data" as insufficiently scoped. Ask what artefact, source, destination, and outcome the user wants; never infer intent by finding and running an existing notebook or job.
Read
references/<mode>.mdend to end, as your FIRST tool call, before the first command of that mode. Read it ONCE, in a single full read: do not re-open it, do not grep it again, and do not page through it. You already have it.Apply the same read-once discipline to every other file you load, including nested
references/<mode>/*.mdsub-references and sharedcommon/*.mdfiles: open only the ones you actually need, read each ONCE end to end, and never grep or re-open one you already loaded.Resolve workspace and item ids by listing and filtering, never by guessing a GUID.
Stop after routing any Eventhouse/KQL materialized-view request. Unavailable sibling skills are a blocking boundary, not permission to implement their workload directly.
Announce a mode switch explicitly when the request crosses a boundary.
Treat the reference as instructions, never as the deliverable. After reading it, RUN the documented commands against the live workspace and report the real results. Quoting what the reference says instead of executing it does not answer the request.
PREFER
The narrowest mode that satisfies the request.
Reading exactly ONE mode reference. Load a second only when the request genuinely spans modes, and say so before you do.
Reporting the mode you chose in your first response so the user can correct you.
AVOID
Acting from this dispatcher alone -- it intentionally omits the operational detail.
Answering with a summary of the reference instead of executing it.
Re-reading or re-grepping a reference you already loaded; it costs turns and tokens.
Mutating anything while in a read-only mode.
Loading a different skill for work this family already owns (see CRITICAL NOTES 3).
Attempting an out-of-scope request through raw REST calls when the owning skill is unavailable. Name the owning skill and stop; do not improvise by creating Fabric artefacts outside
spark-cli's scope.
Examples
| User request | Mode | Reference to read |
|---|---|---|
| "Write a notebook cell that reads the bronze table and writes a silver Delta table." | authoring | references/authoring.md |
| "Create a Livy session and count the distinct customers in the lakehouse." | consumption | references/consumption.md |
| "My notebook run failed with an OOM -- work out why." | operations | references/operations.md |
| "Is this materialized lake view query ready for incremental refresh?" | authoring | references/authoring.md |
| "Show me the Spark SQL command that lists the MLVs in schema silver." | mlv | references/mlv.md |
| "Schedule a nightly refresh for the lakehouse MLV lineage and show me its run history." | mlv | references/mlv.md |
Files
- ATTRIBUTION.mdAdded by AutoGineer863 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md10.1 KiB
- apm.yml430 B
- references/authoring.md32.9 KiB
- references/authoring/resources/data-engineering-patterns.md24.3 KiB
- references/authoring/resources/development-workflow.md7.4 KiB
- references/authoring/resources/infrastructure-orchestration.md10.4 KiB
- references/authoring/resources/materialized-lake-view-patterns.md20.1 KiB
- references/authoring/resources/mlv-incremental-refresh-patterns.md11.4 KiB
- references/authoring/resources/notebook-api-operations.md14.2 KiB
- references/consumption.md12.3 KiB
- references/mlv.md32.8 KiB
- references/operations.md20.3 KiB
- references/operations/automated-diagnostic-workflow.md12.7 KiB
- references/operations/diagnostic-workflow.md7.3 KiB
- references/operations/job-diagnostics.md17.7 KiB
- references/operations/jobinsight-api.md7.2 KiB
- references/operations/performance-patterns.md17.4 KiB
- references/operations/pipeline-diagnosis.md20.8 KiB
- references/operations/session-health.md8.7 KiB
- references/operations/spark-history-server.md6.5 KiB
references/authoring.md
<!-- Mode reference for the `spark-cli` skill. Loaded on demand from `skills/spark-cli/SKILL.md` when the request matches the `authoring` mode. -->
Spark Authoring — CLI Skill
This skill covers two complementary areas: (1) managing Fabric Spark artifacts via REST APIs (workspaces, lakehouses, notebooks, jobs, pipelines) and (2) writing code inside Fabric Notebook cells (PySpark, Scala, SparkR, SQL with correct lakehouse access, notebookutils, and Spark configuration). For notebook code authoring fundamentals and shared modules, MUST see SPARK-NOTEBOOK-AUTHORING-CORE.md.
Notebook Codegen Invariants
Apply these before following any deeper link; the shared common/ modules might not be present in a packaged skill runtime.
Offline notebook code generation: answer from this file and its bundled resources; do not web-search for API alternatives. Read the relevant local resource once, then return the requested code. If an API is not documented locally, state that limitation instead of repeatedly searching.
Pipeline detection: use
context = notebookutils.runtime.context, then readcontext["isForPipeline"]andcontext["currentWorkspaceId"]. Do not parse the context as JSON or infer pipeline execution fromcurrentJobType.Built-in resources: use
notebookutils.nbResPathwith/builtin/; Spark paths require thefile:prefix, for examplef"file:{notebookutils.nbResPath}/builtin/config.json". Do not inventnotebookutils.resources.getPath.Variable Libraries: use
library = notebookutils.variableLibrary.getLibrary("AppConfig"), then read variables through dot notation such aslibrary.lakehouse_nameandlibrary.enable_feature.Default lakehouse in
%%configure: for session-scoped attachment, use the documenteddefaultLakehouseobject in the first%%configurecell, for example"defaultLakehouse": {"name": "LakehouseName"}. Notebookmetadata.dependencies.lakehouseis the persistent definition binding; do not claim%%configurelacks a lakehouse option.Session memory and native execution: put
%%configurein the first cell, keepdriverMemoryandexecutorMemoryat the JSON top level, and set"spark.native.enabled": "true"underconf. Native execution must be enabled before the Spark session starts.Cross-workspace Spark SQL: use the four-part backtick-qualified name
`workspace`.`lakehouse`.`schema`.`table`.Non-default ABFSS paths: obtain the endpoint with
notebookutils.conf.get("trident.onelake.endpoint")and keep the identifier order exact:abfss://{workspaceId}@{endpoint}/{lakehouseId}/Tables/.... The workspace ID is the authority before@; the lakehouse ID is the first path segment after the endpoint. Do not reverse them or hardcodeonelake.dfs.fabric.microsoft.com.Fabric connections: copy the exact API spelling
credential = notebookutils.connections.getCredential("{connectionId}")for PostgreSQL, Azure SQL, S3, and other Fabric-managed connections. Do not renamenotebookutils, substitutecredentials.getConnectionString, or hardcode credentials.Large cross-lakehouse copies: use
notebookutils.fs.fastcp(...), notfs.cp(...).ABFSS identifiers: never mix a workspace ID with a lakehouse name. When notebook code receives a workspace ID plus lakehouse name, it MUST acquire a Fabric token with
notebookutils.credentials.getToken("pbi"), list/v1/workspaces/{workspaceId}/lakehouses, select the exactdisplayName, fail if it is missing or ambiguous, and use the returned lakehouse ID in the ABFSS path. Do not send the user to the portal, leave an ID placeholder, ask for an ID the API can resolve, or switch to all-name syntax.
Table of Contents
| Task | Reference | Notes |
|---|---|---|
| RULES — Read these first, follow them always | SKILL.md § RULES | MUST read — 4 rules for this skill |
| Finding Workspaces and Items in Fabric | COMMON-CLI.md § Finding Workspaces and Items in Fabric | Mandatory — READ link first [needed for finding workspace id by its name or item id by its name, item type, and workspace id] |
| Fabric Topology & Key Concepts | COMMON-CORE.md § Fabric Topology & Key Concepts | |
| Environment URLs | COMMON-CORE.md § Environment URLs | |
| Authentication & Token Acquisition | COMMON-CORE.md § Authentication & Token Acquisition | Wrong audience = 401; read before any auth issue |
| Core Control-Plane REST APIs | COMMON-CORE.md § Core Control-Plane REST APIs | |
| Pagination | COMMON-CORE.md § Pagination | |
| Long-Running Operations (LRO) | COMMON-CORE.md § Long-Running Operations (LRO) | |
| Rate Limiting & Throttling | COMMON-CORE.md § Rate Limiting & Throttling | |
| OneLake Data Access | COMMON-CORE.md § OneLake Data Access | Requires storage.azure.com token, not Fabric token |
| Definition Envelope | ITEM-DEFINITIONS-CORE.md § Definition Envelope | Definition payload structure |
| Per-Item-Type Definitions | ITEM-DEFINITIONS-CORE.md § Per-Item-Type Definitions | Support matrix, decoded content, part paths — REST specs, CLI recipes |
| Job Execution | COMMON-CORE.md § Job Execution | |
| Capacity Management | COMMON-CORE.md § Capacity Management | |
| Gotchas & Troubleshooting | COMMON-CORE.md § Gotchas & Troubleshooting | |
| Best Practices | COMMON-CORE.md § Best Practices | |
| Tool Selection Rationale | COMMON-CLI.md § Tool Selection Rationale | |
| Authentication Recipes | COMMON-CLI.md § Authentication Recipes | az login flows and token acquisition |
Fabric Control-Plane API via az rest | COMMON-CLI.md § Fabric Control-Plane API via az rest | Always pass --resource https://api.fabric.microsoft.com or az rest fails |
| Pagination Pattern | COMMON-CLI.md § Pagination Pattern | |
| Long-Running Operations (LRO) Pattern | COMMON-CLI.md § Long-Running Operations (LRO) Pattern | |
OneLake Data Access via curl | COMMON-CLI.md § OneLake Data Access via curl | Use curl not az rest (different token audience) |
| SQL / TDS Data-Plane Access | COMMON-CLI.md § SQL / TDS Data-Plane Access | |
| Job Execution (CLI) | COMMON-CLI.md § Job Execution | |
| Job Scheduling | COMMON-CLI.md § Job Scheduling | URL is /jobs/{jobType}/schedules; endDateTime required |
| OneLake Shortcuts | COMMON-CLI.md § OneLake Shortcuts | |
| Capacity Management (CLI) | COMMON-CLI.md § Capacity Management | |
| Composite Recipes | COMMON-CLI.md § Composite Recipes | |
| Gotchas & Troubleshooting (CLI-Specific) | COMMON-CLI.md § Gotchas & Troubleshooting (CLI-Specific) | az rest audience, shell escaping, token expiry |
Quick Reference: az rest Template | COMMON-CLI.md § Quick Reference: az rest Template | |
| Quick Reference: Token Audience / CLI Tool Matrix | COMMON-CLI.md § Quick Reference: Token Audience ↔ CLI Tool Matrix | Which --resource + tool for each service |
| Relationship to SPARK-CONSUMPTION-CORE.md | SPARK-AUTHORING-CORE.md § Relationship to SPARK-CONSUMPTION-CORE.md | |
| Data Engineering Authoring Capability Matrix | SPARK-AUTHORING-CORE.md § Data Engineering Authoring Capability Matrix | |
| Lakehouse Management | SPARK-AUTHORING-CORE.md § Lakehouse Management | |
| Notebook Management | SPARK-AUTHORING-CORE.md § Notebook Management | |
| Notebook Execution & Job Management | SPARK-AUTHORING-CORE.md § Notebook Execution & Job Management | |
| CI/CD & Automation Patterns | SPARK-AUTHORING-CORE.md § CI/CD & Automation Patterns | |
| Infrastructure-as-Code | SPARK-AUTHORING-CORE.md § Infrastructure-as-Code | |
| Performance Optimization & Resource Management | SPARK-AUTHORING-CORE.md § Performance Optimization & Resource Management | |
| Runtime 2.0 Performance Features | data-engineering-patterns.md § Runtime 2.0 Performance Features | NEE, Efficient Scaledown, Liquid Clustering, Spark 4.1 |
| Authoring Gotchas and Troubleshooting | SPARK-AUTHORING-CORE.md § Authoring Gotchas and Troubleshooting | |
| Quick Reference: Authoring Decision Guide | SPARK-AUTHORING-CORE.md § Quick Reference: Authoring Decision Guide | |
| Recommended Patterns (Data Engineering) | data-engineering-patterns.md § Recommended patterns | |
| Data Ingestion Principles | data-engineering-patterns.md § Data Ingestion Principles | |
| Transformation Patterns | data-engineering-patterns.md § Transformation Patterns | |
| Delta Lake Best Practices | data-engineering-patterns.md § Delta Lake Best Practices | |
| Quality Assurance Strategies | data-engineering-patterns.md § Quality Assurance Strategies | |
| Recommended Patterns (Development Workflow) | development-workflow.md § Recommended patterns | |
| Notebook Lifecycle | development-workflow.md § Notebook Lifecycle | |
| Parameterization Patterns | development-workflow.md § Parameterization Patterns | |
| Variable Library (notebook + pipeline usage) | development-workflow.md § Method 4: Variable Library | getLibrary() + dot notation in notebooks; libraryVariables + @pipeline().libraryVariables in pipelines |
| Variable Library Definition | ITEM-DEFINITIONS-CORE.md § VariableLibrary | Definition parts, decoded content, types, pipeline mappings, gotchas |
| Local Testing Strategy | development-workflow.md § Local Testing Strategy | |
| Debugging Patterns | development-workflow.md § Debugging Patterns | |
| Recommended Patterns (Infrastructure) | infrastructure-orchestration.md § Recommended patterns | |
| Materialized Lake View patterns | materialized-lake-view-patterns.md § Recommended patterns | Spark Lakehouse authoring guidance for MLV design (when to use MLVs, layering patterns) |
| MLV incremental refresh patterns | mlv-incremental-refresh-patterns.md § IR-friendly syntax guide | Use for refresh-readiness review and safe non-breaking rewrites |
| MLV schedule & job management | the mlv mode | Route here when user asks to schedule, trigger, monitor, or cancel MLV refreshes (not authoring) |
| Workspace Provisioning Principles | infrastructure-orchestration.md § Workspace Provisioning Principles | |
| Lakehouse Configuration Guidance | infrastructure-orchestration.md § Lakehouse Configuration Guidance | |
| Pipeline Design Patterns | infrastructure-orchestration.md § Pipeline Design Patterns | |
| CI/CD Integration Strategy | infrastructure-orchestration.md § CI/CD Integration Strategy | |
| Notebook API — Which Endpoint to Use | notebook-api-operations.md § Quick Decision | Start here for remote notebook edits — getDefinition vs updateDefinition |
| Notebook Modification Workflow | notebook-api-operations.md § Workflow | Five-step flow: retrieve, decode, modify, encode, upload |
| Notebook Orchestration (parallel + DAG) | notebook-api-operations.md § Notebook Orchestration | notebookutils.notebook.runMultiple(DAG) for parallel runs and run-order dependencies (fan-in/fan-out); use instead of hand-rolled threads |
| Notebook API Error Reference | notebook-api-operations.md § Error Reference | 411, 400 (updateMetadata), 401, 403 explained |
| Notebook API Gotchas | notebook-api-operations.md § Gotchas | /result suffix, empty body, \n per-line rule, format=ipynb |
| Default Lakehouse Binding | notebook-api-operations.md § Default Lakehouse Binding | .ipynb metadata vs .py # METADATA block; discover IDs dynamically |
| Public URL Data Ingestion | notebook-api-operations.md § Public URL Data Ingestion | Use real source URL, stage into Files/, then read with Spark |
| getDefinition (read notebook content) | notebook-api-operations.md § Step 1 — Retrieve Notebook Content | LRO flow, ?format=ipynb, empty body (--body '{}') requirement |
| Decode Base64 Notebook Payload | notebook-api-operations.md § Step 2 — Decode the Notebook Content | Extract payload, base64 decode, ipynb JSON structure |
| Modify Notebook Cells | notebook-api-operations.md § Step 3 — Modify the Notebook Content | Find cell, insert/replace lines, \n per-line rule |
| updateDefinition (write notebook content) | notebook-api-operations.md § Step 4 — Re-encode and Upload | Re-encode, upload, LRO poll, updateMetadata flag pitfall |
| Verify Notebook Update (Optional) | notebook-api-operations.md § Step 5 — Verify the Update | Skip unless you suspect a silent failure — Succeeded from updateDefinition is sufficient (see Rule 2) |
| Notebook API Error Reference | notebook-api-operations.md § Error Reference | 411, 400 (updateMetadata), 401, 403 explained |
| Notebook API End-to-End Script | notebook-api-operations.md § Complete End-to-End Script | Full bash: get → decode → modify → encode → update → verify |
| Quick Start Examples | SKILL.md § Quick Start Examples | Minimal examples for common operations |
| — Notebook Code Authoring (shared modules) — | ||
| Notebook Authoring Core | SPARK-NOTEBOOK-AUTHORING-CORE.md | READ FIRST for notebook code tasks — fundamentals, code gen approach, module index |
Must/Prefer/Avoid
MUST DO
Check for recent jobs BEFORE creating new notebook runs — Query job instances from last 5 minutes; if recent job exists, monitor it instead of creating duplicate
Capture job instance ID immediately after POST — Store job ID before any other operations to enable proper monitoring
Verify workspace capacity assignment before operations — Workspace must have capacity assigned and active
When user provides a public data URL, follow the Public URL Data Ingestion policy — keep detailed behavior in the linked resource section to avoid drift/duplication
Format notebook cells correctly — Each line in cell source array MUST end with
\nto prevent code mergingUse correct Lakehouse Livy session body format — Send a FLAT JSON with
name,driverMemory,driverCores,executorMemory,executorCores. Do NOT wrap in{"payload": ...}or send only{"kind": "pyspark"}— that causes HTTP 500. Use valid memory values (28g, 56g, 112g, 224g). See Create Lakehouse Livy Session example below and SPARK-CONSUMPTION-CORE.md.Bound live MLV Livy execution end to end — Use one elapsed-time deadline of at most 12 minutes across session readiness and all create/readback statements. Use short one-shot requests with fixed sleeps; stop on terminal states or the deadline and report the last state. Never leave a background job or foreground watcher running.
PREFER
Poll notebook job status with proper intervals — 10-30 seconds between polls; timeout after reasonable duration (e.g., 30 minutes)
Check job history when POST response is unreadable — If POST returns "No Content" or unreadable response, query recent jobs (last 1 minute) before retrying
Use Starter Pool for development — Development/testing workloads should use
useStarterPool: trueUse Workspace Pool for production — Production workloads need consistent performance with
useWorkspacePool: trueEnable lakehouse schemas during creation — Set
creationPayload.enableSchemas: truefor better table organizationImplement idempotency checks — Prevent duplicate operations by checking existing state first
AVOID
Never retry POST with same parameters — If you have a job ID, only use GET to check status; don't create duplicate job instances
Don't skip capacity verification — Operations will fail if workspace capacity is paused or unassigned
Avoid immediate POST retries on failures — Check for existing/active jobs first to prevent duplicates
Don't create new runs if monitoring existing job — One job at a time; wait for completion before submitting new runs
Don't hardcode workspace/lakehouse IDs — Discover dynamically via item listing or catalog search APIs
Own
%%sqlnotebook cells here, do not defer tosqldw-cli— a request to "write a %%sql cell" (or any notebook magic cell) is notebook-cell authoring even when the cell queries a lakehouse table. Only route tosqldw-cliwhen the user wants a plain T-SQL query executed against a SQL endpoint, not a notebook cell.Own "run/execute the notebook named X" here — running a Fabric notebook by name is notebook execution via
POST .../items/{notebookId}/jobs/instances?jobType=RunNotebook; never invent a/jobs/RunNotebook/instancespath. This belongs to authoring mode; do not defer toconsumption, which is only for ad-hoc Livy session code execution.Do NOT use Lakehouse Livy sessions to run a Fabric notebook — Lakehouse Livy sessions (the public Livy API) are for ad-hoc interactive Spark code execution. To run a notebook as a job, use the Jobs API (
RunNotebook) which creates a Notebook Spark session internally. See SPARK-AUTHORING-CORE.md § Notebook Execution & Job ManagementDo NOT schedule MLV refreshes from notebooks — If the user asks to "schedule MLV refresh", route to the
mlvmode which uses the REST API. Notebook-basedREFRESH MATERIALIZED LAKE VIEW ... FULLis for one-time manual refresh only, not recurring schedules.
RULES — Read these first, follow them always
Rule 1 — Validate prerequisites before operations. Verify workspace has capacity assigned (see COMMON-CORE.md Create Workspace and Capacity Management) and resource IDs exist before attempting operations.
Rule 2 — Trust updateDefinition success. A
Succeededpoll result fromupdateDefinitionis sufficient confirmation that content and lakehouse bindings persisted. Do NOT callgetDefinitionafter every upload — it is an async LRO that adds significant latency. Only usegetDefinitionfor its intended purpose: reading current notebook content before making modifications.Rule 3 — Prevent duplicate jobs and monitor execution properly. Before submitting new notebook run, ALWAYS check for recent job instances first (last 5 minutes). If recent job exists, monitor it instead of creating duplicate. After submission, capture job instance ID immediately and poll status - never retry POST. See SPARK-AUTHORING-CORE.md Job Monitoring for patterns.
Rule 4 — For notebook code authoring, MUST follow SPARK-NOTEBOOK-AUTHORING-CORE.md. When writing code inside notebook cells, MUST read SPARK-NOTEBOOK-AUTHORING-CORE.md first — it defines the code generation approach, rules, and a Module Index linking to detailed guides (lakehouse paths, connections, context, orchestration, etc.). Use the Spark-specific resources in this skill (data-engineering-patterns.md, development-workflow.md) for Spark-only implementation details. When the task is about Materialized Lake Views, read materialized-lake-view-patterns.md for authoring/design guidance and mlv-incremental-refresh-patterns.md for refresh-readiness analysis.
Notebook Codegen Quick Rules
Quick reference for common notebook-authoring tasks. The shared common/notebook-authoring/ core (see Rule 4 / SPARK-NOTEBOOK-AUTHORING-CORE.md) is authoritative; if these ever differ, follow the common core.
| User asks for | Required output pattern |
|---|---|
%%sql / cross-workspace lakehouse query cell | Return a Fabric notebook %%sql cell with the four-part backtick-qualified name `workspace`.`lakehouse`.`schema`.`table`. The workspace belongs in the SQL identifier, not only in an attachment note. This is notebook authoring, not interactive Spark consumption. |
| Non-default lakehouse ABFSS path | Build abfss://{workspaceId}@{endpoint}/{lakehouseId}/Tables/{schema}/{table} with notebookutils.conf.get("trident.onelake.endpoint"); do not hardcode onelake.dfs.fabric.microsoft.com. |
| Large cross-lakehouse file copy | Use notebookutils.fs.fastcp(...) with ABFSS source and destination paths. fs.cp(...) is not the fastest available method for this request. |
| Workspace ID plus lakehouse name | Generate notebook code that calls /v1/workspaces/{workspaceId}/lakehouses with notebookutils.credentials.getToken("pbi"), matches the exact displayName, rejects zero or multiple matches, and builds the ABFSS URI from the returned ID. Never return a portal lookup, unresolved placeholder, or mixed ID/name path. |
| Pipeline context detection | Use notebookutils.runtime.context; include isForPipeline = context["isForPipeline"] and read context["currentWorkspaceId"]. |
| Built-in notebook resource files with Spark | Use notebookutils.nbResPath, builtin/, and the file: prefix: spark.read.json(f"file:{notebookutils.nbResPath}/builtin/config.json"). Spark and notebookutils.fs require file: for resource-folder local paths. |
| Fabric connections | Use notebookutils.connections.getCredential("{connectionId}") directly and show a compact code sample. Do not web-search; keep the answer under the tool/turn budget. |
Minimal snippets
# Pipeline context
context = notebookutils.runtime.context
isForPipeline = context["isForPipeline"]
workspace_id = context["currentWorkspaceId"]
print(f"isForPipeline={isForPipeline}, workspace_id={workspace_id}")# Spark read from notebook built-in resources
config_df = spark.read.option("multiline", "true").json(
f"file:{notebookutils.nbResPath}/builtin/config.json"
)
display(config_df)# PostgreSQL through a Fabric connection (fill in connectionId and host/db)
import psycopg2
credential = notebookutils.connections.getCredential("{connectionId}")
conn = psycopg2.connect(
host="<postgres-host>",
database="<database>",
user=credential["username"],
password=credential["password"],
)Quick Start Examples
For detailed patterns, authentication, and comprehensive API usage, see:
COMMON-CORE.md — Fabric REST API patterns, authentication, item discovery
COMMON-CLI.md —
az restusage, environment detection, token acquisitionSPARK-AUTHORING-CORE.md — Notebook deployment, lakehouse creation, job execution
Below are minimal quick-start examples. Always reference the COMMON- files for production use.*
Create Workspace & Lakehouse
# See COMMON-CORE.md Environment URLs and SPARK-AUTHORING-CORE.md for full patterns
cat > /tmp/body.json << 'EOF'
{"displayName": "DataEng-Dev"}
EOF
workspace_id=$(az rest --method post --resource "https://api.fabric.microsoft.com" \
--url "https://api.fabric.microsoft.com/v1/workspaces" \
--body @/tmp/body.json --query "id" --output tsv)
cat > /tmp/body.json << 'EOF'
{"displayName": "DevLakehouse", "type": "Lakehouse", "creationPayload": {"enableSchemas": true}}
EOF
lakehouse_id=$(az rest --method post --resource "https://api.fabric.microsoft.com" \
--url "https://api.fabric.microsoft.com/v1/workspaces/$workspace_id/items" \
--body @/tmp/body.json --query "id" --output tsv)Organize Lakehouse Tables with Schemas
# See SPARK-AUTHORING-CORE.md Lakehouse Schema Organization for table organization patterns
#
# IMPORTANT: `CREATE SCHEMA` is only supported on schema-enabled lakehouses. On a
# lakehouse created WITHOUT `enableSchemas`, it fails with
# "Feature not supported on Apache Spark in Microsoft Fabric". Always detect schema
# support first, then branch: create schemas only when enabled, otherwise skip.
# Schema names are configurable. If your workspace standard is `raw`/`curated`
# instead of `bronze`/`silver`/`gold`, substitute those names consistently.
import uuid
def lakehouse_is_schema_enabled():
# Probe schema support by attempting CREATE SCHEMA and catching the
# platform-blocked error. Use a unique probe schema name to avoid
# accidentally dropping a real pre-existing schema.
probe = f"_schema_probe_{uuid.uuid4().hex}"
try:
spark.sql(f"CREATE SCHEMA IF NOT EXISTS {probe}")
spark.sql(f"DROP SCHEMA IF EXISTS {probe}")
return True
except Exception as e:
if "Feature not supported on Apache Spark in Microsoft Fabric" in str(e):
return False
raise
if lakehouse_is_schema_enabled():
# Schema-enabled: create medallion schemas and write tables as `schema.table`.
spark.sql("CREATE SCHEMA IF NOT EXISTS bronze")
spark.sql("CREATE SCHEMA IF NOT EXISTS silver")
spark.sql("CREATE SCHEMA IF NOT EXISTS gold")
else:
# Not schema-enabled: skip CREATE SCHEMA (unsupported). Organize tables by name
# prefix instead (e.g. `bronze_orders` / `raw_orders`, `silver_orders` /
# `curated_orders`), or recreate the lakehouse with
# `creationPayload.enableSchemas: true` if schemas are required.
print("Lakehouse is not schema-enabled; skipping schema creation and using name prefixes.")Create and Refresh a Materialized Lake View (MLV)
-- See authoring/resources/materialized-lake-view-patterns.md for design guidance
-- and authoring/resources/mlv-incremental-refresh-patterns.md for refresh-readiness review.
-- Bronze/Silver/Gold schemas in a Lakehouse with schemas enabled
CREATE SCHEMA IF NOT EXISTS bronze;
CREATE SCHEMA IF NOT EXISTS silver;
CREATE SCHEMA IF NOT EXISTS gold;
-- A simple Silver MLV with data quality constraints
--
-- Prerequisite for incremental refresh: enable Change Data Feed (CDF) on every
-- source table the MLV reads from. Without CDF, optimal refresh can only choose
-- between no refresh (sources unchanged) and full refresh — never incremental.
-- See authoring/resources/mlv-incremental-refresh-patterns.md.
ALTER TABLE bronze.orders_raw SET TBLPROPERTIES (delta.enableChangeDataFeed = true);
CREATE OR REPLACE MATERIALIZED LAKE VIEW silver.orders_clean
(
CONSTRAINT valid_order_id CHECK (order_id IS NOT NULL) ON MISMATCH DROP
)
AS
SELECT
order_id,
customer_id,
CAST(order_ts AS TIMESTAMP) AS order_ts,
amount
FROM bronze.orders_raw;
-- Routine refresh is handled by the lakehouse Materialized lake views → Manage
-- schedule/lineage view; don't orchestrate from notebooks. The SQL form below is
-- documented only for forcing a one-time FULL recompute (troubleshooting / after
-- a correction). There is no documented SQL form for triggering incremental refresh.
REFRESH MATERIALIZED LAKE VIEW silver.orders_clean FULL;Create Lakehouse Livy Session
# See SPARK-CONSUMPTION-CORE.md for Lakehouse Livy session configuration and management
# IMPORTANT: Body MUST be flat JSON with memory/cores — do NOT wrap in {"payload": ...}
cat > /tmp/body.json << 'EOF'
{"name": "dev-session", "driverMemory": "56g", "driverCores": 8, "executorMemory": "56g", "executorCores": 8, "conf": {"spark.dynamicAllocation.enabled": "true", "spark.fabric.pool.name": "Starter Pool"}}
EOF
az rest --method post --resource "https://api.fabric.microsoft.com" \
--url "https://api.fabric.microsoft.com/v1/workspaces/$workspace_id/lakehouses/$lakehouse_id/livyapi/versions/2023-12-01/sessions" \
--body @/tmp/body.jsonLakehouse Livy Session Body — Common Mistakes
❌
{"payload": {"kind": "pyspark"}}→ HTTP 500 (wrong wrapper, missing required fields)❌
{"kind": "pyspark"}→ HTTP 500 (missingdriverMemory,executorMemory, etc.)✅ Flat JSON with
name,driverMemory,driverCores,executorMemory,executorCores(and optionallyconfwith Starter Pool)
Spark Performance Configs
For detailed workload-specific configurations, see data-engineering-patterns.md Delta Lake Best Practices.
Quick reference:
# Write-heavy (Bronze): Disable V-Order, enable autoCompact
# Balanced (Silver): Enable V-Order, adaptive execution
# Read-heavy (Gold): Vectorized reads, optimal parallelism
# See data-engineering-patterns.md for complete config tablesFocus: Essential CLI patterns for Spark/data engineering development and notebook code authoring, with intelligent routing to specialized resources. For comprehensive patterns, always reference COMMON-* files and resource documents.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
What our scanner noticed· Low risk
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Microsoft
- Publisher
- Microsoft (Official)
- Source
- microsoft/skills-for-fabric · skills/spark-cli · commit f8fac11
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Also distributed in
- microsoft/skills-for-fabric
AutoGineer is not affiliated with or endorsed by Microsoft or Microsoft.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download spark-cli.zip