Semi-structured data like JSON is common and flexible. Handling it lets you extract useful info from messy or nested data.
Semi-structured data handling (JSON) in dbt
select json_extract_path_text(json_column, 'key') as value from table_name
Use json_extract_path_text to get text values from JSON keys.
dbt runs SQL on your warehouse, so JSON functions depend on your database (e.g., Snowflake, Redshift).
user_data.select json_extract_path_text(user_data, 'name') as user_name from users
event_json.select json_extract_path_text(event_json, 'event', 'type') as event_type from events
json_array.select json_extract_array_element_text(json_array, 0) as first_item from data_table
This example shows how to extract a nested user name and the second action from JSON data stored in json_col.
with raw_data as ( select '{"user": {"id": "123", "name": "Alice"}, "actions": ["login", "purchase"]}' as json_col ) select json_extract_path_text(json_col, 'user', 'name') as user_name, json_extract_array_element_text(json_extract_path_text(json_col, 'actions'), 1) as second_action from raw_data
JSON functions vary by database; check your warehouse docs for exact syntax.
Extracted JSON values are usually text; convert types if needed.
Use CTEs in dbt models to organize JSON extraction steps clearly.
Semi-structured JSON data is common and flexible.
Use JSON extraction functions to get nested info in dbt SQL models.
Check your database's JSON function support for best results.
Practice
Solution
Step 1: Understand JSON data in dbt
JSON data often contains nested information that needs to be accessed or transformed.Step 2: Purpose of JSON functions
JSON functions allow extracting specific parts of this nested data for analysis or transformation.Final Answer:
To extract and manipulate nested data inside JSON columns -> Option DQuick Check:
JSON functions = extract nested data [OK]
- Thinking JSON functions create files
- Assuming JSON functions encrypt data
- Confusing JSON extraction with file conversion
data using dbt's SQL with PostgreSQL syntax?Solution
Step 1: Identify PostgreSQL JSON extraction syntax
PostgreSQL uses->>to extract JSON text values by key as text.Step 2: Apply correct syntax to extract 'name'
The correct syntax isdata->>'name'to get the text value of the 'name' key.Final Answer:
SELECT data->>'name' AS name FROM table_name; -> Option BQuick Check:
PostgreSQL JSON text extraction = data->>'key' [OK]
- Using square brackets instead of ->>
- Missing quotes around the key name
- Using -> instead of ->> for text extraction
SELECT data:id::string AS user_id, data:attributes:age::int AS age FROM users
What will be the output columns for a row where
data contains {"id": "U123", "attributes": {"age": 30}}?Solution
Step 1: Understand Snowflake JSON extraction
Snowflake uses colon notationdata:idto access JSON keys and casting (::string, ::int) to convert types.Step 2: Apply extraction to given JSON
For{"id": "U123", "attributes": {"age": 30}},data:id::stringextracts 'U123', anddata:attributes:age::intextracts 30.Final Answer:
user_id = 'U123', age = 30 -> Option AQuick Check:
Snowflake JSON path extraction = correct values [OK]
- Confusing JSON keys with strings
- Not casting extracted values
- Using wrong path syntax
SELECT data->'user'->>email AS email FROM users
But you get an error. What is the likely cause?
Solution
Step 1: JSON path operators require quoted keys
Keys in->and->>must be string literals enclosed in single quotes.Step 2: Identify syntax issue
Indata->'user'->>email,emaillacks quotes and is interpreted as an identifier (e.g., column name) instead of a JSON key, causing a syntax error. Correct syntax:data->'user'->>'email'.Final Answer:
Missing quotes around 'email' key -> Option CQuick Check:
JSON keys must be quoted strings [OK]
- Forgetting parentheses in chained JSON extraction
- Misquoting JSON keys
- Assuming JSON column is invalid without checking
info in a dbt model with records like:{"user": {"id": "U1", "tags": ["a", "b", "c"]}}How would you write a dbt SQL expression to create a new row for each tag using PostgreSQL JSON functions?
Solution
Step 1: Identify function to expand JSON arrays in PostgreSQL
PostgreSQL usesjson_array_elements_text()to turn JSON arrays into a set of text rows.Step 2: Apply function to nested JSON array
Extract the 'tags' array withinfo->'user'->'tags'and expand using comma syntax in FROM:SELECT user_id, tag FROM table_name, json_array_elements_text(info->'user'->'tags') AS tag.Final Answer:
SELECT user_id, tag FROM table_name, json_array_elements_text(info->'user'->'tags') AS tag; -> Option AQuick Check:
Use json_array_elements_text() to expand JSON arrays [OK]
- Using unnest() on JSON instead of arrays
- Using json_each_text() which is for objects
- Using explode() which is not PostgreSQL function
Ready to prove it?
Pass the test and this pattern moves unknown
