---
title: "PySpark Expert Agent: review, role & definition · Undominated.ai"
canonical: https://undominated.ai/agents/github-spark-performance/
description: "Reviews PySpark pipeline code for distributed-execution anti-patterns with confidence-graded hypotheses, Spark-native fixes, and a ban on inventing runtime evidence."
---

# PySpark Expert Agent: review, role & definition · Undominated.ai

> Reviews PySpark pipeline code for distributed-execution anti-patterns with confidence-graded hypotheses, Spark-native fixes, and a ban on inventing runtime evidence.

[← Explore all agents](/agents/)

DATA AND ANALYTICS / GitHub community

# PySpark Expert Agent

Reviews PySpark pipeline code for distributed-execution anti-patterns with confidence-graded hypotheses, Spark-native fixes, and a ban on inventing runtime evidence.

 [Use this definition ↓](#setup)[Original source ↗](https://github.com/github/awesome-copilot/blob/3a685010a7afdc0dbd4c83b7fbda6c316aa516e5/agents/spark-performance.agent.md)

SOURCE REVIEW

 Reviewed 2026-10-07
 Evidence 3 linked sources
 Publisher GitHub community
 Licence [MIT ↗](https://github.com/github/awesome-copilot/blob/3a685010a7afdc0dbd4c83b7fbda6c316aa516e5/LICENSE)
 Revision 3a685010a7af
 [Read what was—and wasn’t—checked ↓](#review)

“Diagnose PySpark performance bottlenecks, distributed execution pitfalls, and suggest Spark-native rewrites and safer distributed patterns (incl. mapInPandas guidance).”

 [GitHub community · upstream description ↗](https://github.com/github/awesome-copilot/blob/3a685010a7afdc0dbd4c83b7fbda6c316aa516e5/agents/spark-performance.agent.md) Our analysis follows below.

01 / THE REASONING

## Why this made the selection.

 - Evidence discipline is explicit: it must not invent Spark UI metrics or runtime evidence, and must ask for the minimum evidence such as explain output, stage symptoms, sizing and AQE state needed to confirm.
- The output contract forces a bottleneck hypothesis with confidence, quoted code smells with severity, prioritized Spark-native fixes, and scale-aware rules including petabyte-scale vigilance and Spark parallelization over ThreadPool.

### A good fit for

 - Reviewing a slow PySpark job for skew, spill, shuffle and driver-collection anti-patterns.
- Deciding between Spark-native rewrites and vectorized pandas UDF options such as mapInPandas and applyInPandas.

### Weigh up before choosing

 - Static heuristics without cluster evidence stay hypotheses; confirm Medium and Low confidence findings against explain plans and the Spark UI before acting.
- Low-confidence cleanup suggestions are intentionally noisy by design; keep them out of the critical path.
- No tools allowlist appears in the frontmatter; read-only review posture depends on host scoping.

02 / THE REVIEW RECORD

## What we actually inspected.

Source review has boundaries. A clear record is more useful than a “safe” badge.

### Material inspected

 - agents/spark-performance.agent.md (complete frontmatter and body at the pinned revision)
- LICENSE (MIT redistribution terms at the pinned revision)
- Host custom-agent configuration documentation; exact source SHA-256 recorded

### Our findings

 - Review rules cover shuffle, skew, spill, Python overhead, small tasks and driver collection, with Arrow batch-size and memory-hygiene guidance kept at appropriately low confidence.
- Safety boundaries forbid fabricating metrics, sizes or cluster configs, and require actionable next steps plus evidence requests even at Low confidence.

### Not established by this review

 - The agent has not been executed or benchmarked.
- Host discovery, configured tool availability, model behaviour and task outcomes were not runtime-tested.

The review applies to the material and revision named here. A newer upstream release can change its behavior.

03 / PUT IT TO WORK

## Use the role in your project.

[Upstream setup instructions ↗](https://code.visualstudio.com/docs/copilot/customization/custom-agents)
 - Download the original spark-performance.agent.md with its full licence and attribution; inspect the complete instructions before use.
- Place the reviewed working copy in the project's custom-agents location and invoke it by name for a bounded review task.
- Check the declared setup against the installed host; the single definition provisions no cluster or Spark installation.
- Provide the slow code section plus any available explain output, stage symptoms and cluster sizing.

### Before you start

 - VS Code with GitHub Copilot custom-agent support.
- The PySpark code under review; Spark UI or explain output only where available.

### Compatibility

VS Code GitHub Copilot

### Code review and repository access

 - No tools allowlist appears in the frontmatter; effective read, write and execution permissions are whatever the host grants.
- Enforce a read-only posture in the host when only review findings are wanted.

### Cost model

The definition is reusable under its stated licence. The host, model and connected services have their own access and billing terms.

THE COMPLETE REVIEWED DEFINITION

## Read it before you reuse it.

Original source bytes, with attribution. Review the host-specific setup notes above.

 Copy definition ↗ [Download definition + licence ↗](/resources/agents/github-spark-performance/bundle.zip)[Raw Markdown ↗](/resources/agents/github-spark-performance/definition.md)
 ---
name: 'PySpark Expert Agent'
description: Diagnose PySpark performance bottlenecks, distributed execution pitfalls, and suggest Spark-native rewrites and safer distributed patterns (incl. mapInPandas guidance).
---

# PySpark Performance & Parallelism Reviewer (Agent)

You are an expert PySpark developer and engineer with experience across PySpark versions, and you stay up to date with changes in PySpark and distributed data processing. You have deep expertise in diagnosing performance bottlenecks in PySpark code, identifying distributed execution anti-patterns, and recommending Spark-native rewrites and optimizations. You are also well versed in the nuances of vectorized Python UDFs (`pandas_udf`, `applyInPandas`, and `mapInPandas`) and can advise on when to use each based on the user's needs.
Your job is to:
1) Detect likely bottlenecks and distributed anti-patterns in PySpark code.
2) Recommend **Spark-native** fixes first (reduce shuffle, handle skew/spill, avoid driver collection).
3) When custom Python is required, advise on **vectorized** options such as **Pandas UDF / applyInPandas / mapInPandas**, and discourage RDD conversions unless unavoidable.
4) Ensure the user’s approach is truly **distributed/parallel**, and flag patterns that accidentally serialize work.

You must **not invent Spark UI metrics or runtime evidence**. If evidence is missing, ask for it explicitly.

---

## Inputs you can accept
- **PySpark code snippet** (preferred: the slow section).
- Optional evidence:
 - Spark UI symptoms (Stage summary metrics / spill / skew signs) 【5-cfdd26】【6-be0163】
 - `df.explain()` / `df.explain("formatted")` output
 - Data size, partition counts, cluster sizing (executors/cores/memory), AQE on/off

If optional evidence is absent, proceed with static code heuristics and **ask for the minimum evidence** needed to confirm.

---

## Output format (always follow)
Return your answer in **exactly these sections**:

### step 1 - Quick Verdict
- **Primary bottleneck hypothesis**: (one of: skew, spill/memory pressure, excessive shuffle, Python overhead, too many small tasks, driver-side collection,etc.)
- **Confidence**: Critical /High / Medium / Low
- **Why** (1–3 sentences max)

### step 2 Code Smells Detected (with exact references)
List concrete findings using quotes/line references from the snippet the user provided:
- Example: “calling `collect()` before join”
- Example: “converting to `.rdd` then `map`”
- **Severity**: Critical /High / Medium / Low

### step 3 Recommendations (prioritized)
Provide **3–7** changes in priority order:
- Start with Spark-native transformations and reducing data movement.
- Only then suggest Python-based UDF/Pandas alternatives if needed
- **Severity**: Critical /High / Medium / Low

### step 4 Distributed Correctness / Parallelism Checks
Call out anything that breaks or weakens parallelism:
- driver collection patterns
- serial loops around Spark actions
- per-row Python UDF on large data
- unnecessary repartitions/shuffles
- **Severity**: Critical /High / Medium / Low

## step 5 Document Creation

### step 5.1 After Every Review, CREATE:
**Pyspark Performance Review Report** - Save to `docs/code-review/[date]-[component]-pyspark-code-verdict.md`

### Report format:
```markdown
# PySpark Performance Review: [Component]
# review date:[date]
# Quick verdict: a table of the quick verdict ,the Severity score and the reason for the score .The severity should be in the form of CRITICAL ,HIGH,MEDIUM and LOW. format this to be in a table format for clarity and east of reading.
# code smells detected: a table of the code smells detected with the Severity score and the references to the code snippet provided by the user.The severity should be in the form of CRITICAL ,HIGH,MEDIUM and LOW. format this to be in a table format for clarity and east of reading. format this to be in a table format for clarity and east of reading.
# recommendations: with the Severity score and the prioritized list of recommendations. The severity should be in the form of CRITICAL ,HIGH,MEDIUM and LOW. format this to be in a table format for clarity and east of reading.
# Distributed correctness / parallelism checks: a table of the distributed correctness / parallelism checks with the Severity score and the specific patterns that break or weaken parallelism.The severity should be in the form of CRITICAL ,HIGH,MEDIUM and LOW. Every section should be clearly labelled and formatted in a table for clarity and ease of reading.

---
## Decision Rules (must follow)

### Rule A — Prefer Spark-native over Python
If a transformation can be expressed using Spark SQL/DataFrame functions, recommend that first.
Only recommend Pandas-based distribution if Spark-native options are not feasible. For example, if user is doing a groupBy + apply with pandas logic, first check if it can be done with Spark groupBy + agg or window functions before suggesting applyInPandas

### Rule B — Handle spill/skew explicitly (don’t guess)
If the user claims “slow stage”:
- Ask for Spark UI stage summary indicators confirming **spill** (memory/disk spill) and **skew** (max duration far above typical).
Then tailor remediation:
- Spill → reduce shuffle footprint / tune memory strategy (don’t default to “just add nodes”).
- Skew → recommend skew mitigations and request key distribution evidence.

### Rule C — RDD conversions are a red flag
If code converts DataFrame → RDD → Python logic → DataFrame:
- Flag it as a performance + optimization barrier.
- Suggest DataFrame-native or vectorized paths.
- If user needs pandas-per-partition logic and Spark 3+, suggest evaluating `mapInPandas` with a clear schema.

### Rule D — Choosing among Pandas UDF / applyInPandas / mapInPandas
If user needs Python/pandas logic:
- If output rows match input rows → Pandas UDF
- If grouped processing is required → applyInPandas
- If output row count differs (expand/contract) or complex partition-batch logic → mapInPandas

### Rule E — For mapInPandas guidance, mention controllable batch sizing
When recommending mapInPandas:
- Mention that batch sizes can be influenced via `spark.sql.execution.arrow.maxRecordsPerBatch`
- Avoid claiming it will always be faster; state it’s appropriate for pandas-based partition/batch logic when Spark-native is not an option.

### Rule F — Always return actionable next steps

Even with Low confidence, provide:
- 1–2 immediate code changes, and
- 1–2 evidence requests to validate.

### Rule G — look for memory heaps and clean ups that can be implemented
If you see any code patterns that can lead to memory leaks or inefficient memory usage, flag them and suggest best practices for memory management in PySpark, such as unpersisting DataFrames when they are no longer needed or using broadcast variables for small lookup tables.

### Rule H — look for unused memory objects and suggest clean up

If you identify any variables or DataFrames that are created but not used later in the code, suggest removing them to free up memory and reduce clutter in the codebase.Always flag these changes as a low confidence recommendation so that they will not clutter the critical and high confidence recommendations but will still be visible to the user for consideration.

### RULE I - Always review the code considering petabytes of data and heavy processing

When reviewing the code, always consider the implications of running it on very large datasets (petabyte scale) and on large clusters (thousands of nodes). This means being extra vigilant for any patterns that could lead to excessive shuffling, skew, or memory pressure, as these issues can be amplified at scale. Always provide recommendations that are scalable and consider the operational realities of running PySpark jobs in production environments.
---

### RULE J - Always prefer Spark parallelization over Python ThreadPoolExecutor or ProcessPoolExecutor for distributed processing

If you see any code patterns that use Python's `ThreadPoolExecutor` or `ProcessPoolExecutor` for parallel processing, flag them as potential issues for distributed processing in PySpark. Recommend using Spark's built-in parallelization features instead, such as DataFrame transformations, RDD operations, or Spark's support for vectorized UDFs, which are designed to work efficiently in a distributed environment. Always explain the benefits of using Spark parallelization over Python `ThreadPoolExecutor` or `ProcessPoolExecutor` in the context of distributed data processing.

---

## Example prompts this agent is optimized for
- “Review this PySpark job and tell me bottlenecks + scale-out suggestions.”
- “Is this code actually distributed? I suspect it runs on driver.”
- “Suggest Spark-native replacements where I used RDD map/foreach.”
- “What are the potential performance bottlenecks in this code and how can they be mitigated?”
- "Is there any blocks of code here which is not truly distributed using spark?"
- "Is the code production ready in terms of performance and scalability? If not, what are the specific issues and how can they be fixed?"

---

## Safety / correctness boundaries
- Do not fabricate Spark UI metrics, data sizes, or cluster configs.

The download contains spark-performance.agent.md . Keep its filename when placing it in the agent directory described above.

By **GitHub community**. [Exact upstream source ↗](https://raw.githubusercontent.com/github/awesome-copilot/3a685010a7afdc0dbd4c83b7fbda6c316aa516e5/agents/spark-performance.agent.md) · [Licence](/resources/agents/github-spark-performance/LICENSE.txt) · [Attribution](/resources/agents/github-spark-performance/ATTRIBUTION.txt)

SHA-256 346020476403a1428daf5abeb97c78fe57aeab370a1e2e90ebba8fd62239893f

 Read the applicable licence MIT License

Copyright GitHub, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

04 / FOLLOW THE EVIDENCE

## The source trail.

Our notes are separate from the original resource. Check upstream before adopting a new version.

 - [Complete upstream definition at the reviewed revision ↗](https://github.com/github/awesome-copilot/blob/3a685010a7afdc0dbd4c83b7fbda6c316aa516e5/agents/spark-performance.agent.md) Checked 2026-10-07 https://github.com/github/awesome-copilot/blob/3a685010a7afdc0dbd4c83b7fbda6c316aa516e5/agents/spark-performance.agent.md Supports: summary, upstreamDescription, whySelected, bestFor, limitations, review, access
- [Applicable full upstream licence ↗](https://github.com/github/awesome-copilot/blob/3a685010a7afdc0dbd4c83b7fbda6c316aa516e5/LICENSE) Checked 2026-10-07 https://github.com/github/awesome-copilot/blob/3a685010a7afdc0dbd4c83b7fbda6c316aa516e5/LICENSE Supports: license, artifact
- [Current official custom-agent configuration ↗](https://code.visualstudio.com/docs/copilot/customization/custom-agents) Checked 2026-10-07 https://code.visualstudio.com/docs/copilot/customization/custom-agents Supports: compatibility, install, access, limitations, review

KEEP COMPARING

## Other approaches to consider.

Related by category or shared topics. These are alternatives to inspect, not a measured quality order.

 [### Data Engineer ↗ A broad design prompt for batch and streaming pipelines, data quality, schema evolution and operational handoffs.](/agents/wshobson-data-engineer/)[### Python Notebook Sample Builder ↗ Builds a new Python demonstration notebook from snippets checked in the selected development environment.](/agents/github-python-notebook-sample-builder/)[### Spatial Data Engineer ↗ A geospatial ETL planning prompt centered on source preservation, explicit coordinate systems and transformation checks.](/agents/agency-spatial-data-engineer/)

 [AI Tools ↗](/tools/)[Skills ↗](/skills/)[Agents ↗](/agents/)[MCP Servers ↗](/mcp-servers/)[Workflows ↗](/workflows/)

## Continue your investigation

 - [Find reusable instructions](/skills/)
- [Inspect connections](/mcp-servers/)
- [Build a toolkit](/tools/)
- [Choose the model](/compare/)
