📖 Scenario: You work as a data analyst for an online store. The store's sales data is large and growing fast. To make queries faster and easier, you want to organize the data by clustering and partitioning it in the database using dbt.
🎯 Goal: You will create a dbt model that partitions the sales data by order_date and clusters it by customer_id. This will help speed up queries that filter by date and customer.
📋 What You'll Learn
Create a dbt model SQL file named sales_partitioned.sql.
Partition the table by order_date using RANGE partitioning.
Cluster the table by customer_id.
Use a simple SELECT statement from the raw sales table.
Print the final SQL code to verify the partitioning and clustering syntax.
💡 Why This Matters
🌍 Real World
Large datasets in data warehouses can be slow to query. Partitioning and clustering organize data to speed up queries and reduce costs.
💼 Career
Data analysts and engineers use dbt to build efficient data models that improve performance and maintainability in analytics workflows.
Progress0 / 4 steps
1
Create the base sales model
Create a dbt model SQL file named sales_partitioned.sql. Write a SELECT statement that selects all columns from the table raw_sales. Assign this SQL to a variable called sales_sql.
dbt
Hint
Use triple quotes for multi-line SQL string. Write a simple SELECT * query from raw_sales.
2
Add partitioning configuration
Create a dictionary called partition_config with keys partition_by and data_type. Set partition_by to 'order_date' and data_type to 'RANGE'.
dbt
Hint
Create a dictionary with the exact keys and values for partitioning.
3
Add clustering configuration
Create a list called cluster_by with a single string element 'customer_id'.
dbt
Hint
Create a list with the clustering column name.
4
Print the final dbt model SQL with partitioning and clustering
Print the final SQL string that includes the partitioning and clustering configuration. Use an f-string to combine sales_sql, partition_config['partition_by'], and cluster_by[0] in the format: CREATE TABLE sales_partitioned PARTITION BY RANGE(order_date) CLUSTER BY customer_id AS followed by the sales_sql query.
dbt
Hint
Use an f-string to build the final SQL string and print it.
Practice
(1/5)
1. What is the main purpose of partitioning in dbt models?
easy
A. To create machine learning models
B. To group similar data inside partitions
C. To encrypt data for security
D. To divide data into separate parts based on a column
Solution
Step 1: Understand partitioning concept
Partitioning splits a large table into smaller parts based on a column, like date or region.
Step 2: Differentiate from clustering
Clustering groups similar data inside partitions but does not split the table itself.
Final Answer:
To divide data into separate parts based on a column -> Option D
Quick Check:
Partitioning = dividing data [OK]
Hint: Partitioning splits data by column values [OK]
Common Mistakes:
Confusing clustering with partitioning
Thinking partitioning groups data inside partitions
Assuming partitioning creates ML models
2. Which of the following is the correct syntax to add clustering in a dbt model's config block?
easy
A. cluster_by = ['column_name']
B. clustering = ['column_name']
C. cluster = ['column_name']
D. clusters = ['column_name']
Solution
Step 1: Recall dbt clustering syntax
In dbt, clustering is set using cluster_by = ['column_name'] inside the model config.
Step 2: Check other options
Options like clustering, cluster, or clusters are incorrect keywords.
Final Answer:
cluster_by = ['column_name'] -> Option A
Quick Check:
Correct keyword is cluster_by [OK]
Hint: Use 'cluster_by' keyword exactly in config [OK]
B. partition_by should be a dictionary, not a string
C. materialized cannot be 'table'
D. cluster_by should be a string, not a list
Solution
Step 1: Check partition_by syntax
Partitioning requires a dictionary with 'field' and 'data_type', not just a string.
Step 2: Verify cluster_by and materialized
cluster_by as a list is correct, and materialized='table' is valid.
Final Answer:
partition_by should be a dictionary, not a string -> Option B
Quick Check:
partition_by needs dict, not string [OK]
Hint: partition_by needs dict with field and data_type [OK]
Common Mistakes:
Using string instead of dict for partition_by
Changing cluster_by to string incorrectly
Assuming materialized='table' is invalid
5. You want to optimize query speed on a large sales table by partitioning by sale_year and clustering by region and product_category. Which dbt config is correct?
hard
A. config(materialized='table', partition_by='sale_year', cluster_by=['region', 'product_category'])
B. config(materialized='table', partition_by={'field': 'sale_year'}, cluster_by='region, product_category')
C. config(materialized='table', partition_by={'field': 'sale_year', 'data_type': 'int'}, cluster_by=['region', 'product_category'])
D. config(materialized='table', partition_by={'field': 'sale_year', 'data_type': 'string'}, cluster_by=['region'])
Solution
Step 1: Check partition_by format and data type
Partitioning requires a dictionary with 'field' and 'data_type'. Since sale_year is a number, 'int' is correct.
Step 2: Check cluster_by format
cluster_by accepts a list of columns, so ['region', 'product_category'] is correct.
Step 3: Validate other options
config(materialized='table', partition_by='sale_year', cluster_by=['region', 'product_category']) uses string for partition_by (incorrect). config(materialized='table', partition_by={'field': 'sale_year'}, cluster_by='region, product_category') misses data_type and cluster_by is a string (incorrect). config(materialized='table', partition_by={'field': 'sale_year', 'data_type': 'string'}, cluster_by=['region']) uses wrong data_type and only one clustering column.
Final Answer:
config(materialized='table', partition_by={'field': 'sale_year', 'data_type': 'int'}, cluster_by=['region', 'product_category']) -> Option C
Quick Check:
Partition dict + cluster_by list = correct [OK]
Hint: Partition needs dict with data_type; cluster_by needs list [OK]
Common Mistakes:
Using string instead of dict for partition_by
Passing cluster_by as string instead of list
Wrong data_type for partition column
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.