SQL queries let you ask questions about your data in a simple way. Using SQL on DataFrames helps you find, filter, and summarize data easily.
SQL queries on DataFrames in Apache Spark
df.createOrReplaceTempView("table_name") spark.sql("SELECT column1, column2 FROM table_name WHERE condition")
First, register your DataFrame as a temporary table with createOrReplaceTempView.
Then, use spark.sql() to run SQL queries on that table.
df.createOrReplaceTempView("people") spark.sql("SELECT name, age FROM people WHERE age > 30")
df.createOrReplaceTempView("sales") spark.sql("SELECT product, SUM(amount) AS total_amount FROM sales GROUP BY product")
df.createOrReplaceTempView("employees") spark.sql("SELECT * FROM employees ORDER BY salary DESC LIMIT 5")
This program creates a DataFrame with people data, registers it as a SQL table, and runs a query to find people older than 30. It then shows the filtered results sorted by age.
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("SQLQueriesOnDataFrames").getOrCreate() # Create sample data data = [ (1, "Alice", 29), (2, "Bob", 35), (3, "Cathy", 23), (4, "David", 40), (5, "Eva", 30) ] columns = ["id", "name", "age"] df = spark.createDataFrame(data, columns) # Register DataFrame as a temporary view df.createOrReplaceTempView("people") # Run SQL query to select people older than 30 result = spark.sql("SELECT name, age FROM people WHERE age > 30 ORDER BY age") # Show the result result.show()
Temporary views last only during the Spark session.
You can use all standard SQL commands like SELECT, WHERE, GROUP BY, ORDER BY, and JOIN.
Remember to import and create a SparkSession before running SQL queries.
Use createOrReplaceTempView to turn a DataFrame into a SQL table.
Run SQL queries on DataFrames with spark.sql().
This method makes data analysis easier for those familiar with SQL.
Practice
createOrReplaceTempView method do in Apache Spark?Solution
Step 1: Understand the purpose of
This method registers a DataFrame as a temporary table in Spark's SQL context.createOrReplaceTempViewStep 2: Recognize its use in SQL queries
Once registered, you can run SQL queries on the DataFrame usingspark.sql().Final Answer:
It registers a DataFrame as a temporary SQL table for querying. -> Option AQuick Check:
Temporary view = SQL table for queries [OK]
- Thinking it saves data permanently
- Confusing it with running SQL queries
- Assuming it deletes tables
people?Solution
Step 1: Identify the correct method to run SQL queries
The method to run SQL queries on Spark isspark.sql().Step 2: Check the syntax for querying the temp view
The query string should be passed insidespark.sql()as shown in spark.sql("SELECT * FROM people").Final Answer:
spark.sql("SELECT * FROM people") -> Option CQuick Check:
Use spark.sql() to run SQL queries [OK]
- Using incorrect method names like spark.query
- Forgetting to use quotes around SQL query
- Confusing method names with other APIs
data = [(1, "Alice", 29), (2, "Bob", 31), (3, "Cathy", 25)]
columns = ["id", "name", "age"]
df = spark.createDataFrame(data, columns)
df.createOrReplaceTempView("people")
result = spark.sql("SELECT name FROM people WHERE age > 28 ORDER BY age DESC")
result.show()Solution
Step 1: Analyze the data and filter condition
Rows with age > 28 are Alice (29) and Bob (31).Step 2: Apply ORDER BY age DESC
Ordering by age descending gives Bob (31) first, then Alice (29).Final Answer:
[["Bob"], ["Alice"]] -> Option DQuick Check:
Filter age > 28 and order desc = Bob, Alice [OK]
- Mixing ascending and descending order
- Including rows with age <= 28
- Confusing column names in SELECT
df.createOrReplaceTempView("employees")
result = spark.sql("SELECT * FROM employee WHERE salary > 50000")
result.show()Solution
Step 1: Check temp view name and SQL query table name
The temp view is named "employees" but the query uses "employee" (missing 's').Step 2: Understand impact of name mismatch
This causes a runtime error because the table "employee" does not exist.Final Answer:
The temp view name is 'employees' but query uses 'employee'. -> Option BQuick Check:
Temp view and query table names must match exactly [OK]
- Assuming SQL syntax error instead of name mismatch
- Thinking show() can't be used on results
- Ignoring case sensitivity in table names
sales with columns product, region, and amount. You want to find the total sales amount per region but only for regions where total sales exceed 1000. Which SQL query on the temp view sales will achieve this?Solution
Step 1: Understand filtering on aggregated data
Filtering on aggregated results requires the HAVING clause, not WHERE.Step 2: Check correct use of HAVING with alias
Using HAVING total_sales > 1000 after GROUP BY is correct as in SELECT region, SUM(amount) AS total_sales FROM sales GROUP BY region HAVING total_sales > 1000.Final Answer:
SELECT region, SUM(amount) AS total_sales FROM sales GROUP BY region HAVING total_sales > 1000 -> Option AQuick Check:
Use HAVING to filter grouped aggregates [OK]
- Using WHERE instead of HAVING for aggregates
- Placing WHERE after GROUP BY
- Not aliasing SUM(amount) before HAVING
Ready to prove it?
Pass the test and this pattern moves unknown
