flatMap can return zero or more items per input, then flattens them.
Examples
Doubles each number in the RDD.
Apache Spark
rdd.map(lambda x: x * 2)
Keeps only even numbers.
Apache Spark
rdd.filter(lambda x: x % 2 == 0)
For each number, creates two numbers: the original and ten times bigger.
Apache Spark
rdd.flatMap(lambda x: [x, x * 10])
Sample Program
This code shows how to use map, filter, and flatMap on a small list of numbers. It first multiplies each number by 3, then keeps only those bigger than 7, and finally for each number, creates two numbers: itself and one more.
Apache Spark
from pyspark.sql import SparkSession
spark = SparkSession.builder.master('local').appName('MapFilterFlatMap').getOrCreate()
rdd = spark.sparkContext.parallelize([1, 2, 3, 4, 5])
# Map: multiply each number by 3
mapped = rdd.map(lambda x: x * 3)
# Filter: keep numbers greater than 7
filtered = mapped.filter(lambda x: x > 7)
# FlatMap: for each number, create number and number+1
flat_mapped = filtered.flatMap(lambda x: [x, x + 1])
print('Original:', rdd.collect())
print('Mapped (x3):', mapped.collect())
print('Filtered (>7):', filtered.collect())
print('FlatMapped (number and number+1):', flat_mapped.collect())
spark.stop()
OutputSuccess
Important Notes
Remember that map keeps the same number of items.
filter can reduce the number of items.
flatMap can increase or decrease items depending on the function.
Summary
map changes each item one by one.
filter selects items based on a rule.
flatMap turns each item into many items and flattens the result.
Practice
(1/5)
1. What does the filter operation do in Apache Spark?
easy
A. Splits each item into multiple items and flattens the result
B. Changes each item in the dataset to a new item
C. Selects items from the dataset based on a condition
D. Combines two datasets into one
Solution
Step 1: Understand the purpose of filter
The filter operation keeps only those items that meet a specific condition or rule.
Step 2: Compare with other operations
Unlike map or flatMap, filter does not change items but selects some based on a test.
Final Answer:
Selects items from the dataset based on a condition -> Option C
Hint: flatMap flattens lists from each item into one list [OK]
Common Mistakes:
Expecting flatMap to keep nested lists
Confusing map output with flatMap output
Thinking flatMap returns original words
4. Identify the error in this Spark code snippet:
val rdd = sc.parallelize(List(1, 2, 3, 4))
val filtered = rdd.filter(x => x > 2)
val mapped = filtered.map(x => x * 2)
val result = mapped.flatMap(x => x)
result.collect()
medium
A. flatMap function argument should return an iterable, but it returns an integer
B. filter condition syntax is incorrect
C. map function cannot multiply integers
D. parallelize method is used incorrectly
Solution
Step 1: Analyze flatMap argument
flatMap expects a function returning a list or iterable, but here it returns a single integer.
Step 2: Check other parts
filter and map are correctly used; parallelize is correct.
Final Answer:
flatMap function argument should return an iterable, but it returns an integer -> Option A
Quick Check:
flatMap needs iterable return [OK]
Hint: flatMap needs iterable output, not single values [OK]
Common Mistakes:
Passing single value to flatMap instead of iterable
Misreading filter syntax as error
Thinking map cannot multiply numbers
5. You have an RDD of sentences:
val sentences = sc.parallelize(List("hello world", "apache spark", "map filter flatMap"))
How would you use flatMap and filter to get all words longer than 4 characters?
hard
A. sentences.flatMap(sentence => sentence.split(" ")).filter(word => word.length > 4)
B. sentences.map(sentence => sentence.split(" ")).filter(word => word.length > 4)
C. sentences.filter(sentence => sentence.length > 4).flatMap(word => word.split(" "))
D. sentences.flatMap(sentence => sentence.length > 4)
Solution
Step 1: Use flatMap to split sentences into words
flatMap splits each sentence into words and flattens them into one list.
Step 2: Use filter to select words longer than 4 characters
filter keeps only words where length is greater than 4.