Bird
Raised Fist0
Apache Sparkdata~7 mins

Handling data skew at scale in Apache Spark

Choose your learning style10 modes available
Introduction

Data skew happens when some parts of your data are much bigger than others. This can slow down your processing. Handling data skew helps your big data jobs run faster and smoother.

When joining two large datasets and one key has many more records than others.
When grouping data and some groups are much larger than the rest.
When shuffling data causes some tasks to take much longer than others.
When you notice some Spark tasks running very slowly compared to others.
When your job runs out of memory or crashes due to uneven data distribution.
Syntax
Apache Spark
spark.conf.set("spark.sql.shuffle.partitions", number_of_partitions)

# Example of salting keys to reduce skew
from pyspark.sql.functions import concat, lit, floor, rand

# Add a salt column with random number
salted_df = df.withColumn("salt", floor(rand() * salt_range))

# Modify join key by adding salt
salted_df = salted_df.withColumn("salted_key", concat(salted_df["key"], lit("_"), salted_df["salt"]))

Setting shuffle partitions controls how many pieces data is split into during shuffle.

Salting means adding a random number to keys to spread out big groups.

Examples
Change the number of shuffle partitions to 200 to better balance tasks.
Apache Spark
spark.conf.set("spark.sql.shuffle.partitions", 200)
Add a salt column with random numbers from 0 to 9 and create a new salted key.
Apache Spark
from pyspark.sql.functions import concat, lit, floor, rand

salt_range = 10
salted_df = df.withColumn("salt", floor(rand() * salt_range))
salted_df = salted_df.withColumn("salted_key", concat(salted_df["key"], lit("_"), salted_df["salt"]))
Use salted keys in groupBy to spread out skewed keys.
Apache Spark
# Group using salted keys
grouped_df = salted_df.groupBy("salted_key").count()
Sample Program

This program creates a small dataset with one very common key 'A' and two rare keys 'B' and 'C'. It shows counts before and after adding a salt to the keys to spread out the skew.

Apache Spark
from pyspark.sql import SparkSession
from pyspark.sql.functions import concat, lit, floor, rand

spark = SparkSession.builder.appName("DataSkewHandling").getOrCreate()

# Create example data with skewed keys
keys = ["A"] * 1000 + ["B"] * 10 + ["C"] * 10
values = list(range(1020))
data = list(zip(keys, values))
df = spark.createDataFrame(data, ["key", "value"])

# Show count per key before handling skew
print("Counts before handling skew:")
df.groupBy("key").count().show()

# Add salt to spread out skewed key 'A'
salt_range = 5
salted_df = df.withColumn("salt", floor(rand() * salt_range))
salted_df = salted_df.withColumn("salted_key", concat(salted_df["key"], lit("_"), salted_df["salt"]))

# Show count per salted_key
print("Counts after salting keys:")
salted_df.groupBy("salted_key").count().orderBy("salted_key").show()

spark.stop()
OutputSuccess
Important Notes

Salting works well when one key is very large but others are small.

Too many partitions can cause overhead, too few can cause skew.

Always check your data distribution before and after applying skew handling.

Summary

Data skew slows down big data jobs by making some tasks very large.

Salting keys spreads out large groups to balance work.

Adjust shuffle partitions to control parallelism and reduce skew impact.

Practice

(1/5)
1. What is the main problem caused by data skew in Apache Spark jobs?
easy
A. Some tasks become much larger and slower than others
B. All tasks run equally fast
C. Data is lost during processing
D. Spark automatically fixes skew without user action

Solution

  1. Step 1: Understand data skew impact

    Data skew means some keys have many more records, causing uneven task sizes.
  2. Step 2: Identify effect on tasks

    Tasks processing large keys take longer, slowing the whole job.
  3. Final Answer:

    Some tasks become much larger and slower than others -> Option A
  4. Quick Check:

    Data skew = uneven task sizes [OK]
Hint: Data skew means uneven task sizes slowing jobs [OK]
Common Mistakes:
  • Thinking all tasks run equally fast
  • Believing Spark fixes skew automatically
  • Confusing data loss with skew
2. Which of the following is the correct way to add a salt key to a DataFrame column named user_id in PySpark?
easy
A. df.withColumn('salted_key', concat(col('user_id'), lit('_'), rand()))
B. df.withColumn('salted_key', col('user_id') + rand())
C. df.withColumn('salted_key', col('user_id').cast('int'))
D. df.withColumn('salted_key', col('user_id').substr(0, 3))

Solution

  1. Step 1: Understand salting technique

    Salting adds a random value to the key to spread data across partitions.
  2. Step 2: Check correct syntax for salting

    Concatenating user_id with a random number as string is correct.
  3. Final Answer:

    df.withColumn('salted_key', concat(col('user_id'), lit('_'), rand())) -> Option A
  4. Quick Check:

    Salting = concat key + random [OK]
Hint: Use concat with random value to salt keys [OK]
Common Mistakes:
  • Adding random float directly to string key
  • Casting key without salting
  • Using substring instead of salting
3. Given the following PySpark code snippet to reduce skew by salting, what will be the output count of salted_df if df has 1000 rows?
from pyspark.sql.functions import col, concat, lit, rand
salted_df = df.withColumn('salted_key', concat(col('key'), lit('_'), (rand() * 10).cast('int')))
count = salted_df.count()
medium
A. 0
B. 1000
C. 10
D. 100

Solution

  1. Step 1: Understand salting effect on row count

    Salting adds a new column but does not change the number of rows.
  2. Step 2: Count rows after salting

    The count remains the same as original DataFrame, 1000 rows.
  3. Final Answer:

    1000 -> Option B
  4. Quick Check:

    Salting adds column, count unchanged [OK]
Hint: Salting adds column, row count stays same [OK]
Common Mistakes:
  • Thinking salting duplicates rows
  • Confusing salt range with row count
  • Assuming count changes after withColumn
4. You have a join in Spark that is very slow due to data skew on the join key. Which of the following code snippets correctly applies salting to both DataFrames to fix the skew?
df1_salted = df1.withColumn('salt', (rand() * 5).cast('int'))
df2_salted = df2.withColumn('salt', (rand() * 5).cast('int'))
joined = df1_salted.join(df2_salted, ['key', 'salt'])
medium
A. Incorrect: salting with fixed value instead of random
B. Incorrect: salting only one DataFrame
C. Incorrect: joining without salt column
D. Correct: salting both sides and joining on key and salt

Solution

  1. Step 1: Understand salting for joins

    To fix skew, salt both DataFrames on join key with same salt range.
  2. Step 2: Verify join condition

    Joining on both original key and salt column ensures balanced partitions.
  3. Final Answer:

    Correct: salting both sides and joining on key and salt -> Option D
  4. Quick Check:

    Salt both sides + join on key & salt [OK]
Hint: Salt both DataFrames and join on key plus salt [OK]
Common Mistakes:
  • Salting only one DataFrame
  • Joining without salt column
  • Using fixed salt value instead of random
5. You have a Spark job with a very large skewed key causing one partition to be huge. You want to reduce skew by salting and also control shuffle partitions. Which approach below best balances load and parallelism?
hard
A. Add salt column but keep shuffle partitions very low
B. Do not add salt, just increase shuffle partitions
C. Add a salt column with random values, join on salted keys, and increase shuffle partitions
D. Add salt column with fixed value and reduce shuffle partitions

Solution

  1. Step 1: Apply salting to spread skewed key

    Adding a salt column with random values breaks large groups into smaller ones.
  2. Step 2: Adjust shuffle partitions to increase parallelism

    Increasing shuffle partitions allows more tasks to run in parallel, reducing bottlenecks.
  3. Step 3: Combine salting and partition tuning

    Both salting and increasing partitions together balance load and improve job speed.
  4. Final Answer:

    Add a salt column with random values, join on salted keys, and increase shuffle partitions -> Option C
  5. Quick Check:

    Salt + more partitions = balanced load [OK]
Hint: Salt keys and increase shuffle partitions for best balance [OK]
Common Mistakes:
  • Keeping shuffle partitions too low after salting
  • Not salting and only increasing partitions
  • Using fixed salt value causing no skew fix
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard