intermediate

ReduceByKey

8 min readLast updated: 2026-07-08

Overview

Learn how to aggregate values for each key in a Pair RDD using an associative reduce function, and understand how it optimizes network shuffles.

What You Will Learn

In this lesson, you will learn:
  • ReduceByKey API: Merging key-based records.
  • Combiner Optimization: How Spark aggregates data locally on partitions before shuffling.
  • Performance Advantage: Why reduceByKey is faster than groupByKey.

Detailed Concept Explanation

reduceByKey(func) is a wide transformation on Pair RDDs. It aggregates values for each key using an associative and commutative binary function.

How it Works (Local Combiners)

Unlike other grouping operations, reduceByKey performs a local aggregation on each partition before shuffling data over the network. This local step (called a Combiner) significantly reduces the volume of data sent across the network, optimizing performance.


Code Examples

Input Dataset Preview

Below is the fruit sales log dataset:

fruitcount
Apple5
Orange2
Apple3

Python (PySpark) Implementation

python
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("ReduceByKey").getOrCreate()
sc = spark.sparkContext
pair_rdd = sc.parallelize([("Apple", 5), ("Orange", 2), ("Apple", 3)])

# Sum counts by fruit key
summed_rdd = pair_rdd.reduceByKey(lambda a, b: a + b)
print(summed_rdd.collect())

Expected Output

text
[('Apple', 8), ('Orange', 2)]

Execution Plan Diagram (Python & Scala)

Execution Plan Diagram
SparkContext.parallelize
reduceByKey(lambda a b: a+b)
collect()
print()

Scala Implementation

scala
import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder().appName("ReduceByKeyScala").getOrCreate()
val sc = spark.sparkContext

val pairRDD = sc.parallelize(Seq(("Apple", 5), ("Orange", 2), ("Apple", 3)))
val summed = pairRDD.reduceByKey((a, b) => a + b)
println(summed.collect().mkString(", "))

Expected Output

text
(Apple,8), (Orange,2)

Common Mistakes

  • Assuming No Network Shuffle: Thinking reduceByKey runs entirely locally. While it uses local combiners to reduce data volume, it still shuffles key aggregates over the network to compute the final sums.

Best Practices

  • Prefer Over groupByKey: Always choose reduceByKey instead of groupByKey for associative aggregations (like sum or count) to take advantage of map-side combining.

Interview Perspective

Why is reduceByKey preferred over groupByKey for aggregations?

reduceByKey performs local aggregations (map-side combining) on each partition before shuffling data across the network. groupByKey shuffles all raw key-value records over the network without any local aggregation, which creates massive network bottlenecks and can trigger Out Of Memory (OOM) errors on the executors.


Interactive Challenges

Challenge 1: Sum Values (Beginner)

Write a PySpark RDD statement to sum values for each key in pair_rdd using reduceByKey.

Related Topics