intermediate

GroupByKey

8 min readLast updated: 2026-07-08

Overview

Learn how to group values for each key in a Pair RDD, and understand why this operation can lead to severe performance bottlenecks.

What You Will Learn

In this lesson, you will learn:
  • GroupByKey API: Grouping values by key.
  • Shuffle Bottlenecks: Why groupByKey bypasses local combining.
  • OOM Prevention: Recognizing when groupByKey will trigger executor crashes.

Detailed Concept Explanation

groupByKey() is a wide transformation on Pair RDDs that groups all values for each key into a list-like collection (ResultIterable).

The Performance Danger

Unlike reduceByKey, groupByKey cannot perform local, map-side aggregations because it does not aggregate values. Instead, it must shuffle every single record across the network to group them, creating a massive network bottleneck and risking Out Of Memory (OOM) errors if a single key has millions of records.


Code Examples

Input Dataset Preview

Below is the user events dataset:

userevent
Aliceclick
Boblogin
Alicescroll

Python (PySpark) Implementation

python
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("GroupByKey").getOrCreate()
sc = spark.sparkContext
pair_rdd = sc.parallelize([("Alice", "click"), ("Bob", "login"), ("Alice", "scroll")])

# Group events by user key
grouped_rdd = pair_rdd.groupByKey()

# Map ResultIterable to list to display
result = grouped_rdd.mapValues(list).collect()
print(result)

Expected Output

text
[('Alice', ['click', 'scroll']), ('Bob', ['login'])]

Execution Plan Diagram (Python & Scala)

Execution Plan Diagram
SparkContext.parallelize
groupByKey()
mapValues(list)
collect()
print()

Scala Implementation

scala
import org.apache.spark.sql.SparkSession

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

val pairRDD = sc.parallelize(Seq(("Alice", "click"), ("Bob", "login"), ("Alice", "scroll")))
val grouped = pairRDD.groupByKey().mapValues(_.toList)
println(grouped.collect().mkString(", "))

Expected Output

text
(Alice,List(click, scroll)), (Bob,List(login))

Common Mistakes

  • Using groupByKey to Sum: Using groupByKey().mapValues(sum) to calculate totals. This is highly inefficient. Always use reduceByKey or aggregateByKey instead to enable local combiners.

Best Practices

  • Use Only For Non-Associative Logic: Only use groupByKey when you need to collect all raw values for a key without performing any mathematical aggregation.

Interview Perspective

What are the performance risks of using groupByKey in a Spark pipeline?

groupByKey does not perform local, map-side combining. Every single key-value record must be shuffled over the network to the worker nodes. If your dataset contains skewed keys (where a single key represents a large percentage of the rows), this will cause severe network congestion and trigger executor Out Of Memory (OOM) crashes.


Interactive Challenges

Challenge 1: Map Grouped Values (Beginner)

Which RDD transformation method is used to apply a function (like converting to a list) to only the values of a Pair RDD, keeping the keys unchanged?

Related Topics