GroupBy helps you organize data into groups based on one or more columns. Aggregations let you calculate summary values like sums or averages for each group.
GroupBy and aggregations in Apache Spark
df.groupBy("column_name").agg(functions)Use groupBy to split data into groups by column(s).
Use agg to apply aggregation functions like sum, avg, count.
df.groupBy("category").sum("sales")
df.groupBy("city").agg({'temperature': 'avg'})
df.groupBy("country").count()This program creates a Spark DataFrame with sales data by category. It then groups the data by category and calculates the sum, average, and maximum sales for each group. Finally, it prints the results.
from pyspark.sql import SparkSession from pyspark.sql.functions import sum, avg, max spark = SparkSession.builder.appName("GroupByExample").getOrCreate() # Sample data data = [ ("Electronics", 100), ("Electronics", 150), ("Clothing", 200), ("Clothing", 50), ("Groceries", 300) ] # Create DataFrame columns = ["category", "sales"] df = spark.createDataFrame(data, columns) # Group by category and sum sales sum_sales = df.groupBy("category").sum("sales") # Group by category and average sales avg_sales = df.groupBy("category").agg(avg("sales").alias("avg_sales")) # Group by category and max sales max_sales = df.groupBy("category").agg(max("sales").alias("max_sales")) # Show results print("Sum of sales by category:") sum_sales.show() print("Average sales by category:") avg_sales.show() print("Max sales by category:") max_sales.show() spark.stop()
You can group by multiple columns by passing a list to groupBy, like groupBy(['col1', 'col2']).
Aggregation functions like sum, avg, max, min, and count are available in pyspark.sql.functions.
Always give meaningful names to aggregated columns using alias for clearer output.
GroupBy splits data into groups based on column values.
Aggregations calculate summary statistics for each group.
Use Spark functions like sum, avg, max inside agg for flexible summaries.
Practice
groupBy function do in Apache Spark?Solution
Step 1: Understand the purpose of groupBy
ThegroupByfunction is used to split data into groups based on one or more column values.Step 2: Compare with other functions
Sorting, filtering, and joining are different operations and do not split data into groups.Final Answer:
It splits the data into groups based on column values. -> Option AQuick Check:
groupBy = splits data into groups [OK]
- Confusing groupBy with filter or sort
- Thinking groupBy changes row order
- Assuming groupBy merges DataFrames
sales after grouping by region in Spark DataFrame df?Solution
Step 1: Identify correct aggregation syntax
To calculate average after grouping, usegroupByfollowed byagg(avg(column)).Step 2: Check each option
df.groupBy("region").agg(avg("sales")) usesagg(avg("sales"))correctly. df.groupBy("region").sum("sales") uses sum, not average. df.groupBy("region").filter(avg("sales")) uses filter incorrectly. df.groupBy("region").select(avg("sales")) uses select which is not valid after groupBy for aggregation.Final Answer:
df.groupBy("region").agg(avg("sales")) -> Option BQuick Check:
groupBy + agg(avg) = df.groupBy("region").agg(avg("sales")) [OK]
- Using sum instead of avg for average
- Using filter instead of agg
- Using select after groupBy without agg
from pyspark.sql import SparkSession
from pyspark.sql.functions import sum
spark = SparkSession.builder.getOrCreate()
data = [("East", 100), ("West", 200), ("East", 150)]
df = spark.createDataFrame(data, ["region", "sales"])
result = df.groupBy("region").agg(sum("sales").alias("total_sales"))
result.show()Solution
Step 1: Understand groupBy and sum aggregation
The code groups rows by "region" and sums the "sales" values for each group.Step 2: Calculate sums for each region
For "East": 100 + 150 = 250; For "West": 200.Final Answer:
region | total_sales East | 250 West | 200 -> Option AQuick Check:
Sum sales by region = 250 (East), 200 (West) [OK]
- Not summing all values per group
- Confusing alias name with original column
- Expecting original rows without aggregation
df.groupBy("category").agg(sum("amount"), avg("amount"))Solution
Step 1: Check function imports
The code usessumandavgfunctions but does not show imports frompyspark.sql.functions.Step 2: Validate other options
agg() accepts multiple arguments; aliasing is optional; groupBy works with agg.Final Answer:
sum and avg functions are not imported. -> Option DQuick Check:
Missing imports cause NameError [OK]
- Assuming agg needs dict, but it accepts multiple args
- Forgetting to import sum, avg from pyspark.sql.functions
- Thinking groupBy can't be chained with agg
sales_df with columns store, product, and revenue. You want to find the maximum revenue per store and the average revenue per product across all stores in a single query. Which code snippet correctly achieves this?Solution
Step 1: Understand the requirements
We need max revenue per store and average revenue per product in one result.Step 2: Analyze options
sales_df.groupBy("store").agg(max("revenue").alias("max_revenue"), avg("revenue").alias("avg_revenue")) aggregates both by store only, so avg revenue per product is incorrect. sales_df.agg(max("revenue").alias("max_revenue"), avg("revenue").alias("avg_revenue")) aggregates globally, losing grouping. sales_df.groupBy("store").agg(max("revenue").alias("max_revenue")).groupBy("product").agg(avg("revenue").alias("avg_revenue")) tries chaining groupBy but overwrites previous aggregation. sales_df.groupBy("store").agg(max("revenue").alias("max_revenue")).crossJoin(sales_df.groupBy("product").agg(avg("revenue").alias("avg_revenue"))) computes both groupings separately and joins results, correctly combining both summaries.Final Answer:
sales_df.groupBy("store").agg(max("revenue").alias("max_revenue")).crossJoin(sales_df.groupBy("product").agg(avg("revenue").alias("avg_revenue"))) -> Option CQuick Check:
Separate groupBy + crossJoin combines both aggregations [OK]
- Trying to aggregate different groupings in one groupBy
- Overwriting aggregation by chaining groupBy
- Forgetting to join separate aggregation results
Ready to prove it?
Pass the test and this pattern moves unknown
