Project · Intermediate · about 16 hours
A year of taxi trips in Spark
Process twelve months of NYC taxi data with PySpark, write partitioned output, and document every performance decision.
Skills:Data warehousing and dbt, Python, Apache Spark
Part of: Data Engineer
Data and licences
- NYC TLC Yellow Taxi Trip Records (2025) ↗NYC Open Data public data (TLC terms of use, no warranty)
- NYC TLC Taxi Zone Lookup ↗NYC Open Data public data (TLC terms of use, no warranty)
Brief
The data team is moving from single-machine scripts to Spark. Show what a well-behaved Spark job looks like on about 40 million trips.
What to build
Read twelve monthly files, handle schema differences between months (new columns appear during the year), and clean consistently.
Enrich with the zone lookup using a broadcast join.
Aggregate: trips and revenue by day and borough, and the top zone pairs per month.
Write partitioned Parquet by month; show that a filtered read touches only one partition.
Measure: with and without broadcast, different shuffle partition counts, and caching. Include plans and Spark UI screenshots.
Reconcile one month's totals against DuckDB.
Deliverables
job.py,PERFORMANCE.md, reconciliation output
How it is graded
Reviewers run the job locally on three months and read the performance report. Claims must be backed by plans and timings.
Stretch
Run the job on a managed Spark service's free trial and compare cost and time.
Deliverables
- A PySpark job that cleans, enriches and aggregates a year of trips
- Partitioned Parquet output by month
- A performance report with physical plans, timings and the Spark UI findings
How a reviewer grades it
| Criterion | Weight | What good looks like |
|---|---|---|
| Correct cleaning and aggregations, reconciled with an independent DuckDB check | 30% | |
| Good use of broadcast joins, partitioning and caching, justified with plans | 35% | |
| Report explains measurements clearly | 20% | |
| Code quality and configuration | 15% |