Handling skewed joins in Apache Spark - Mini Project: Build & Apply
sales_df with these rows: ("productA", 100), ("productB", 200), ("productA", 150), ("productC", 300). Also create a Spark DataFrame called products_df with these rows: ("productA", "Category1"), ("productB", "Category2"), ("productC", "Category3").Use spark.createDataFrame with a list of tuples and column names.
salt to both sales_df and products_df. The salt column should contain a random integer between 0 and 1 for each row. Use the Spark SQL function floor(rand()*2) and alias it as salt.Use withColumn and floor(rand() * 2) to create the salt column.
sales_df and products_df on both product and salt columns. Save the result in a DataFrame called joined_df.Use join with on=["product", "salt"] and how="inner".
print to display the contents of joined_df by calling joined_df.show().Use joined_df.show() to display the DataFrame.
Practice
What is the main problem caused by skewed joins in Apache Spark?
Solution
Step 1: Understand skewed join definition
Skewed joins happen when some keys have a lot more rows than others, causing uneven data distribution.Step 2: Identify the impact on performance
This uneven distribution causes some tasks to take much longer, slowing down the entire join operation.Final Answer:
Some keys have many rows, causing slow join performance -> Option CQuick Check:
Skewed joins = slow join due to uneven keys [OK]
- Thinking skewed joins cause data duplication
- Confusing skew with memory errors
- Assuming all keys have equal rows
Which of the following is the correct way to add a salt column for handling skewed joins in Spark using PySpark?
from pyspark.sql.functions import rand, floor
# Add salt column
salted_df = df.withColumn('salt', floor(rand() * 10))
Solution
Step 1: Understand salt column creation
Salt column should be an integer from 0 to 9 to spread keys evenly.Step 2: Check the code correctness
Using floor(rand() * 10) creates integers 0-9, which is correct for salting.Final Answer:
salted_df = df.withColumn('salt', floor(rand() * 10)) -> Option AQuick Check:
floor(rand()*10) creates salt 0-9 [OK]
- Using rand() without floor gives float salt
- Adding 10 instead of multiplying
- Not converting to integer with floor
Given the following PySpark code snippet, what will be the output count of joined_df?
df1 = spark.createDataFrame([(1, 'A'), (1, 'B'), (2, 'C')], ['id', 'val1'])
df2 = spark.createDataFrame([(1, 'X'), (1, 'Y'), (3, 'Z')], ['id', 'val2'])
joined_df = df1.join(df2, 'id')
print(joined_df.count())
Solution
Step 1: Analyze join keys and rows
df1 has id=1 twice, df2 has id=1 twice, so join on id=1 produces 2*2=4 rows. id=2 and id=3 do not match both sides.Step 2: Calculate total joined rows
Only id=1 matches, producing 4 rows in joined_df.Final Answer:
4 -> Option BQuick Check:
2x2 matches for id=1 = 4 rows [OK]
- Counting only unique keys, ignoring duplicates
- Assuming join count equals smaller table size
- Ignoring multiple matches per key
Identify the error in the following PySpark code snippet intended to handle skewed joins by salting:
from pyspark.sql.functions import rand, floor
salted_df1 = df1.withColumn('salt', floor(rand() * 5))
salted_df2 = df2.withColumn('salt', floor(rand() * 5))
joined_df = salted_df1.join(salted_df2, ['id', 'salt'])
Solution
Step 1: Understand salting logic
Salt must be added consistently to both dataframes so matching keys have the same salt value.Step 2: Identify error in salt generation
Here, salt is generated independently with rand(), so salt values won't match for same keys, causing join to fail.Final Answer:
Salt columns are added independently, so keys may not match on salt -> Option DQuick Check:
Independent salt columns cause join mismatch [OK]
- Adding salt independently without coordination
- Joining only on 'id' when salting is used
- Misunderstanding rand() output range
You have two large datasets with a highly skewed join key. Which approach best handles the skew to improve join performance?
- Add a random salt column to the skewed dataset and replicate the smaller dataset across all salt values, then join on both key and salt.
- Disable broadcast joins to force shuffle join.
- Use
map-side joinwithout salting. - Increase executor memory without changing join logic.
Solution
Step 1: Understand skewed join handling
Salting spreads skewed keys across partitions by adding a random salt column to the skewed dataset and replicating the smaller dataset across all possible salt values.Step 2: Evaluate options
Disabling broadcast or increasing memory alone won't fix skew. Map-side join without salting won't handle skew properly.Final Answer:
Add random salt to skewed dataset and replicate smaller dataset across salt values, join on key and salt -> Option AQuick Check:
Random salt skewed + replicate small fixes skew [OK]
- Disabling broadcast join alone fixes skew
- Not replicating the smaller dataset when salting
- Relying only on memory increase
Ready to prove it?
Pass the test and this pattern moves unknown
