Column expressions and functions help you work with data in tables easily. They let you change, calculate, or filter data in columns.
Column expressions and functions in Apache Spark
from pyspark.sql.functions import col, expr, sum as _sum, avg # Using col to refer to a column col('column_name') # Using expr for expressions expr('column_name + 1') # Using functions like sum or avg _sum('column_name') avg('column_name')
col() helps you refer to a column by name.
expr() lets you write SQL-like expressions as strings.
from pyspark.sql.functions import col df.select(col('age') + 1)
from pyspark.sql.functions import expr df.select(expr('salary * 0.1'))
from pyspark.sql.functions import sum df.groupBy('department').agg(sum('salary'))
This program creates a small table of people with their ages and salaries. It adds two new columns: one with age plus 5, and one with 10% bonus of salary. Then it calculates the average salary and shows the table.
from pyspark.sql import SparkSession from pyspark.sql.functions import col, expr, sum as _sum, avg spark = SparkSession.builder.appName('ColumnExpressions').getOrCreate() # Create sample data data = [ (1, 'Alice', 30, 1000), (2, 'Bob', 35, 1500), (3, 'Charlie', 40, 2000), (4, 'Diana', 25, 1200) ] columns = ['id', 'name', 'age', 'salary'] df = spark.createDataFrame(data, columns) # Add a new column with age plus 5 new_df = df.withColumn('age_plus_5', col('age') + 5) # Calculate 10% bonus on salary new_df = new_df.withColumn('bonus', expr('salary * 0.1')) # Calculate average salary avg_salary = new_df.select(avg('salary')).collect()[0][0] # Show the new dataframe new_df.show() print(f'Average salary: {avg_salary}') spark.stop()
Use col() when you want to refer to columns in expressions clearly.
expr() is useful for complex expressions written as strings.
Functions like sum() and avg() help with quick calculations on columns.
Column expressions let you work with data inside columns easily.
You can add, change, or calculate new columns using functions.
Using these helps you analyze and prepare data for insights.
Practice
withColumn function do in Apache Spark DataFrame?Solution
Step 1: Understand the purpose of
ThewithColumnwithColumnfunction is used to add a new column or replace an existing one in a DataFrame.Step 2: Compare with other functions
Deleting columns is done bydrop, filtering byfilter, and grouping bygroupBy. So these are not correct.Final Answer:
It adds a new column or replaces an existing column with a new value. -> Option AQuick Check:
withColumn= add/replace column [OK]
- Confusing withColumn with drop or filter
- Thinking it deletes columns
- Mixing it with groupBy
age from a DataFrame df using Spark's column expression?Solution
Step 1: Understand select syntax
Theselectmethod expects column names as strings or Column objects. Using double quotes around column names is the standard correct syntax.Step 2: Check each option
df.select("age")(A) uses a valid string literal.df.select(age)(B) references undefined variableage- error.df.select(df.age())(C) tries to calldf.ageas a function -Columnnot callable.df.select(`age`)(D) uses invalid backtick syntax.Step 3: Identify the correct syntax
Onlydf.select("age")executes without error and selects the column correctly.Final Answer:
df.select("age") -> Option AQuick Check:
Column names as strings in select = correct [OK]
- Using variable names without quotes
- Confusing Column objects with strings
- Missing quotes causing errors
df.show()?
from pyspark.sql import SparkSession
from pyspark.sql.functions import col
spark = SparkSession.builder.getOrCreate()
data = [(1, 10), (2, 20), (3, 30)]
df = spark.createDataFrame(data, ['id', 'value'])
df = df.withColumn('double_value', col('value') * 2)
df.show()Solution
Step 1: Understand the data and transformation
The DataFrame starts with columns 'id' and 'value' with values (1,10), (2,20), (3,30). ThewithColumnadds 'double_value' by multiplying 'value' by 2.Step 2: Calculate the new column values
For each row, double_value = value * 2, so 10*2=20, 20*2=40, 30*2=60.Final Answer:
The DataFrame will show three columns with double_value as twice value: -> Option CQuick Check:
double_value = value * 2 [OK]
- Forgetting to import col function
- Using wrong column name
- Expecting original DataFrame without new column
from pyspark.sql.functions import col
df = spark.createDataFrame([(1, 'Alice'), (2, 'Bob')], ['id', 'name'])
df = df.withColumn('name_length', length(col('name')))
df.show()Solution
Step 1: Check imports for used functions
The code useslengthfunction but only importscol. Thelengthfunction must be imported frompyspark.sql.functions.Step 2: Verify other parts
Column name 'name' exists, syntax forwithColumnis correct, and DataFrame creation is valid.Final Answer:
Missing import for length function -> Option DQuick Check:
Import all functions you use [OK]
- Forgetting to import needed functions
- Assuming all functions are auto-imported
- Typos in column names
df with columns id, score1, and score2. You want to create a new column max_score that contains the maximum value between score1 and score2 for each row. Which code snippet correctly achieves this?Solution
Step 1: Identify the correct function for max between columns
Spark provides thegreatestfunction to get the maximum value among columns for each row.Step 2: Check each option
from pyspark.sql.functions import greatest df = df.withColumn('max_score', greatest(col('score1'), col('score2'))) usesgreatestcorrectly with imported function. df = df.withColumn('max_score', max(col('score1'), col('score2'))) usesmaxwhich is an aggregate function, not for row-wise max. df = df.withColumn('max_score', col('score1') if col('score1') > col('score2') else col('score2')) tries Python if-else which does not work on columns. df = df.withColumn('max_score', col('score1').max(col('score2'))) uses invalid syntax.Final Answer:
Use greatest function with columns -> Option BQuick Check:
greatest(col1, col2) = max per row [OK]
- Using max() instead of greatest() for columns
- Trying Python if-else on columns
- Wrong method chaining syntax
Ready to prove it?
Pass the test and this pattern moves unknown
