á
á¶áጠData Warehouse ááᯠáááºááá·áºá¡ááŒá±áá¶áá°áá»á¬ážááŒáá·áº áááºáá±á¬ááºááááºážá
boilerplate code ááá«ááŸááá² áá¯ááºáááºážáááºááá¯ážááŸáá·áº ááœá²ááŒááºážá áááºááŒá¬áá»ááºáá»á¬ážááᯠá¡á¬áá¯á¶á áá¯ááºáá«á DWH ááᯠcodebase á¡ááŒá Ạá á®áá¶ááá·áºááœá²ááŒááºáž- áá¬ážááŸááºážáá¯ááºááŒááºážá ááŒááºáááºáá¯á¶ážáááºááŒááºážá á¡ááá¯á¡áá»á±á¬áẠá ááºážáááºááŒááºážááŸáá·áº CIá Modulará ááá¯ážáá»á²á·ááá¯ááºáá±á¬á open source ááŸáá·áº á¡ááá¯ááºážá¡ááá¯ááºážá á¡áá¯á¶ážááŒá¯áááœááºáá°áá±á¬ á á¬ááœááºá á¬áááºážáá»á¬ážááŸáá·áº ááŸá®ááá¯ááŸá¯ááŒááºáá±á¬ááºááŒááºáž (Data Lineage)á
á€á¡áá¬á¡á¬ážáá¯á¶ážá¡ááŒá±á¬ááºážááŸáá·áº Big Data & Analytics áá±áá
áá
áºááœáẠDBT á¡áááºážááá¹áá¡ááŒá±á¬ááºáž - cat ááŸááŒáá¯ááá¯áá«áááºá
áááºá¹ááá¬áá«áá°ááá¯ááºážá¡ááœááº
Artemy Kozyr á áááºááœááºáá±áá«áááºá áá»áœááºá¯ááºááẠáá±áá¬ááá¯ááŸá±á¬ááºáá¯á¶áá»á¬ážá ETL/ELT áááºáá±á¬ááºááŒááºážá áá±áá¬ááœá²ááŒááºážá
áááºááŒá¬ááŒááºážááŸáá·áº á
áááºáá°ážáá¯á¶áá±á¬áºááŒááºážááá¯á·ááᯠ5 ááŸá
áºáá»á±á¬áºááŒá¬ áá¯ááºáá±á¬ááºáá²á·áááºá áá»áœááºáá±á¬áºáááºááŸáá¡áá¯ááºáá¯ááºáá±áá«áááºá
á¡ááŸá áºáá»á¯ááº
DBT áá°áá±á¬ááºááẠELT (Extract - Transform - Load) á¡ááá¯áá±á¬ááºááŸá T ááŸáá·áº áááºáááºáááºá
BigQueryá Redshiftá Snowflake áá²á·ááá¯á· ááŒá áºááœááºážááŒá®áž á¡ááœááºáááºááá¯ááºáá±á¬ ááœá²ááŒááºážá áááºááŒá¬ááá¯ááºáá±á¬ áá±áá¬áá±á·á áºáá»á¬áž ááœááºážáá¬ážáá¬áááŒáá·áº Data Warehouse á¡ááŒááºáááºááœáẠá¡ááœááºááŒá±á¬ááºážááŸá¯áá»á¬áž ááŒá¯áá¯ááºááẠááá á¹á áááŸááá«á
DBT ááẠáááºážááŒá áºáá»á¬ážá០áá±áá¬ááᯠáá±á«ááºážáá¯ááºááá¯ááºáá±á¬áºáááºáž Storage (Internal ááá¯á·ááá¯áẠExternal Storage) ááœáẠááá·áºááœááºážááŒá®ážáá±á¬ áá±áá¬ááŸáá·áº áá¯ááºáá±á¬ááºáááºá¡ááœáẠá¡ááœáá·áºá¡áááºážáá±á¬ááºážáá»á¬áž áá±ážáá«áááºá
DBT á á¡ááááááºááœááºáá»ááºááŸá¬ áá¯ááºááá¯áá°á SQL ááœáẠá
á¯á
ááºážáá¬á Repository ááŸá ááŸááºáááºáá±á¬ á¡á
á®á¡á
á¥áºááŒáá·áº á¡áááá·áºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáááºááŒá
áºáááºá
DBT Project Structure
ááá±á¬áá»ááºááœáẠá¡áá»áá¯ážá¡á á¬áž ááŸá áºáá»áá¯ážáá¬ááŸááá±á¬ áááºážááœáŸááºáá»á¬ážááŸáá·áº ááá¯ááºáá»á¬áž áá«áááºáááº-
- áá±á¬áºááẠ(.sql) - SELECT áá±ážááŒááºážááŸá¯ááŒáá·áº áá±á¬áºááŒáá¬ážáá±á¬ á¡ááœááºááŒá±á¬ááºážáá°áá áºáá áºáá¯
- ááœá²á·á ááºážááŸá¯ááá¯áẠ(.yml) - ááá·áºáááºáá»ááºáá»á¬ážá áááºáááºáá»á¬ážá á ááºážáááºááŸá¯áá»á¬ážá á á¬ááœááºá á¬áááºážáá»á¬áž
á¡ááŒá±áá¶á¡ááá·áºááœáẠáá¯ááºáááºážááᯠá¡á±á¬ááºáá«á¡ááá¯ááºáž ááœá²á·á ááºážáá¬ážáá«áááºá
- á¡áá¯á¶ážááŒá¯áá°ááẠá¡áááºááŒá±áá±á¬ IDE ááœáẠáá±á¬áºáááºáá¯ááºááᯠááŒááºáááºáááºá
- CLI ááᯠá¡áá¯á¶ážááŒá¯á áá±á¬áºáááºáá»á¬ážááᯠá áááºááá¯ááºáááºá DBT ááẠáá±á¬áºáááºáá¯ááºááᯠSQL ááá¯á· á á¯á ááºážáááºá
- á á¯á ááºážáá¬ážáá±á¬ SQL áá¯ááºááᯠáá±ážáá¬ážáá±á¬ á¡á á®á¡á á¥áº (ááááº) ááŒáá·áº Storage ááœáẠáá¯ááºáá±á¬ááºáááº
á€áááºááŸá¬ CLI á០áááºáááºáá±ááá·áº áá¯á¶á á¶ááŒá áºááá¯ááºáááº-
á¡áá¬á¡á¬ážáá¯á¶ážááẠSELECT ááŒá áºáááºá
áááºážááẠData Build Tool framework á áá°áááºá¡ááºá¹áá«áááºáá áºáá¯ááŒá áºáááºá áá áºáááºážááá¯ááá±á¬áºá DBT ááẠáááºááá±ážááŒááºážáá»ááºáá»á¬ážááᯠStore ááœáẠá¡áá±á¬ááºá¡áááºáá±á«áºáá¬á á±ááŒááºážááŸáá·áº áááºá ááºáá±áá±á¬ áá¯ááºá¡á¬ážáá¯á¶ážááᯠ(CREATEá INSERTá UPDATEá DELETE ALTERá GRANTá ...) áá°áá±á¬ ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážá០ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážá
áá±á¬áºáááºááá¯ááºážááœáẠááááºáá±áá¬á¡á á¯á¶ááᯠáááºááŸááºááá·áº SELECT query áá áºáá¯áá±ážáá¬ážááŒááºáž áá«áááºáá«áááºá
á€ááá á¹á ááœááºá á¡ááœááºááŒá±á¬ááºážááŒááºážááá¯ááºáᬠáá¯áá¹áááá±áááẠá¡ááá·áºáá»á¬ážá áœá¬ááŸáááŒá®áž á¡ááŒá¬ážáá±á¬áºáááºáá»á¬ážá áœá¬á០á¡áá»ááºá¡áááºáá»á¬ážááᯠá á¯á ááºážááá¯ááºáááºá á¡ááŸá¬á á¬ááŒáááºážáá áºáá¯áááºáá±á¬ááºááá·áº ááá°áá¬áá¯á¶á ᶠ(f_orders)
{% set payment_methods = ['credit_card', 'coupon', 'bank_transfer', 'gift_card'] %}
with orders as (
select * from {{ ref('stg_orders') }}
),
order_payments as (
select * from {{ ref('order_payments') }}
),
final as (
select
orders.order_id,
orders.customer_id,
orders.order_date,
orders.status,
{% for payment_method in payment_methods -%}
order_payments.{{payment_method}}_amount,
{% endfor -%}
order_payments.total_amount as amount
from orders
left join order_payments using (order_id)
)
select * from final
á€áá±áá¬ááœáẠá¡áááºá áááºáááºá á¬ážááœááºá¡áá¬áá»á¬ážááᯠáá»áœááºá¯ááºááá¯á·ááŒááºááá¯ááºááááºážá
áááá¡áá»ááº- CTE (Common Table Expressions) ááᯠá¡áá¯á¶ážááŒá¯áá¬ážááẠ- á¡ááœááºááŒá±á¬ááºážááŸá¯áá»á¬ážááŸáá·áº áá¯ááºáááºážááá¯ááºáᬠáá¯áá¹áááá»á¬ážá áœá¬áá«ááŸááá±á¬ áá¯ááºáá»á¬ážááᯠá á¯á ááºážáá¬ážáááºá á±áááºá
áá¯ááá- áá±á¬áºáááºáá¯ááºááẠSQL ááŸáá·áº áá¬áá¬á
áá¬áž áá±á¬ááŸá±á¬áá¬ážáááºá
á¥ááá¬ááẠloop ááá¯á¡áá¯á¶ážááŒá¯áááºá ááá¯á· á áá¬ážáááºááœáẠáááºááŸááºáá¬ážáá±á¬ ááœá±áá±ážáá»á±ááŸá¯áááºážáááºážáá áºáá¯á á®á¡ááœáẠááá¬áááᯠáá¯ááºáá¯ááºááẠá¡á á¯á¶. Function ááá¯áááºáž á¡áá¯á¶ážááŒá¯áá¬ážáá«áááºá ref â áá¯ááºá¡ááœááºáž á¡ááŒá¬ážáá±á¬áºáááºáá»á¬ážááᯠááá¯ážáá¬ážááá¯ááºááŸá¯-
- á á¯á ááºážáá±á áẠref áá áºááŸááºááœáŸááºááŒáá»ááºááᯠááá¬ážáá áºáá¯ááá¯á· ááá¯á·ááá¯áẠááá¯ááŸá±á¬ááºááŸá¯ááœáẠááŒáá·áºááŸá¯ááŸá¯á¡ááŒá áºááá¯á· ááŒá±á¬ááºážáá²áááºááŒá áºáááºá
- ref model dependency graph ááá¯áááºáá±á¬ááºááá¯ááºá á±áááºá
á¡áááºá
- If / else statements - áá¬áááœá²áá¯ááºááŒááºáá»ááºáá»á¬áž
- loops - áá¶ááá¬á¡ááœááº
- ááááºážááŸááºáá»á¬áž
- Macro - áááºáááá¯áááºáá®ážááŒááºážá
áá¯ááºááœááºáá á¹á ááºáž- ááá¬ážá ááŒááºááœááºážá ááá¯ážááŒáá·áºááŸá¯
Materialization áááºážáá»á°áá¬ááẠááœááºáá±á«áºáá¬áá±á¬ áá±á¬áºáááºáá±áá¬á¡á á¯á¡áá±ážááᯠStorage ááœáẠááááºážáááºážáá¬ážááá·áº áá»ááºážáááºááŸá¯áá áºáá¯ááŒá áºáááºá
á¡ááŒá±áá¶á¡á¬ážááŒáá·áºáááºážáááº-
- ááá¬áž - ááá¯ááŸá±á¬ááºááŸá¯ááŸá áá¯ááºááá¯ááºážááá¯ááºáá¬ááá¬áž
- ááŒááºááœááºáž - ááŒááºááœááºážá ááá¯ááŸá±á¬ááºááŸá¯ááŸá ááá¬ážá¡áá¯
ááá¯ááá¯ááŸá¯ááºááœá±ážáá±á¬ áá¯ááºáá¯á¶ážáá±á«áºáá¬áá±áž áá»á°áá¬áá»á¬ážáááºáž ááŸááá«áááºá
- ááá¯ážááŒáá·áº - ááá¯ážááŒáá·áºáááºááŒááºáž (á¡ááŸááºáááẠááá¬ážááŒá®ážáá»á¬áž); ááá¯ááºážá¡áá áºáá»á¬ážááá·áºáááºá ááŒá±á¬ááºážáá¬ážáá±á¬ááá¯ááºážáá»á¬ážááá¯á¡ááºááááºáá¯ááºáááºá áá»ááºáá¬ážáá±á¬ááá¯ááºážáá»á¬ážááá¯ááŸááºážáááºážáááºá
- Ephemeral - áá±á¬áºáááºááẠááá¯ááºááá¯áẠá¡áá±á¬ááºá¡áááºáá±á«áºááá¬áá±á¬áºáááºáž á¡ááŒá¬ážáá±á¬áºáááºáá»á¬ážááœáẠCTE á¡ááŒá Ạáá«áááºáá«áááºá
- á¡ááŒá¬ážáááºážáá»á°áá¬áá»á¬ážááᯠáááºááá¯ááºááá¯ááºááá·áºááá¯ááºáááºá
áá¯ááºáá¯á¶ážáá±á«áºáá¬ááŒááºážááá¯ááºáᬠáá»á°áá¬áá»á¬ážá¡ááŒááºá á¥ááá¬á¡á¬ážááŒáá·áºá áá®ážááŒá¬ážááá¯ááŸá±á¬ááºááŸá¯áá»á¬ážá¡ááœáẠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááẠá¡ááœáá·áºá¡áááºážáá»á¬áž ááŸááá«áááºá
- ááá¯ážá : áá¬áá®ááá¬ážáá»á¬ážá á¡ááŒá¯á¡áá°áá±á«ááºážá ááºážááŒááºáž
- Redshift: Distkeyá Sortkey (ááŒá¬ážááŒááºá áá±á«ááºážá ááºážááŸá¯)á ááŸá±á¬ááºážááá¯ááºáž áá»áááºáááºááŸá¯ ááŒááºááœááºážáá»á¬áž
- BigQuery ááœááº: ááá¬ážááœá²ááœá²ááŒá¬ážááŒááºážááŸáá·áº á¡á á¯ááá¯ááºá¡ááŒá¯á¶ááá¯ááºá áá±á«ááºážá ááºážááŒááºážá¡ááŒá¯á¡áá°á KMS áá¯ááºááŸááºááŒááºážá á¡ááœáŸááºážáá»á¬ážááŸáá·áº áááºáá»á¬áž
- áá®ážááœá«áž: ááá¯ááºáá±á¬áºááẠ(áá«áá±ážá csvá jsoná orcá ááŒá áºááá»áœááºážáá±á«áºáá±á)á partition_byá clustered_byá áá¯á¶ážáá»á¬ážá incremental_strategy
á¡á±á¬ááºáá±á¬áºááŒáá« ááá¯ááŸá±á¬ááºááŸá¯áá»á¬ážááᯠáá±á¬áá±á¬ááẠáá¶á·ááá¯ážáá¬ážáá«áááºá
- áá±ááŒááºáá±á¬áº
- Redshift
- BigQuery ááœááº
- ááá¯ážá
- Presto (áá áºá áááºáá áºááá¯ááºáž)
- áá®ážááœá¬áž (áá áºá áááºáá áºááá¯ááºáž)
- Microsoft SQL Server (ááœááºááŒá°ááá® áááºáá¬)
áá»áœááºá¯ááºááá¯á·á áá±á¬áºáááºááᯠááŒáŸáá·áºáááºááŒáá«á áá¯á·á
- ááŒáá·áºááœááºážááŒááºáž (Incremental) áá¯ááºááŒáá«á áá¯á·á
- Redshift á¡ááœáẠá¡ááá¯ááºážááœá²ááŒááºážááŸáá·áº á á®ááŒááºážáá®ážáá»á¬áž ááá·áºááŒáá«á áá¯á·
-- ÐПМÑОгÑÑаÑÐžÑ ÐŒÐŸÐŽÐµÐ»Ðž:
-- ÐМкÑеЌеМÑалÑМПе МапПлМеМОе, ÑМОкалÑÐœÑй клÑÑ ÐŽÐ»Ñ ÐŸÐ±ÐœÐŸÐ²Ð»ÐµÐœÐžÑ Ð·Ð°Ð¿ÐžÑей (unique_key)
-- ÐлÑÑ ÑегЌеМÑаÑОО (dist), клÑÑ ÑПÑÑОÑПвкО (sort)
{{
config(
materialized='incremental',
unique_key='order_id',
dist="customer_id",
sort="order_date"
)
}}
{% set payment_methods = ['credit_card', 'coupon', 'bank_transfer', 'gift_card'] %}
with orders as (
select * from {{ ref('stg_orders') }}
where 1=1
{% if is_incremental() -%}
-- ÐÑÐŸÑ ÑОлÑÑÑ Ð±ÑÐŽÐµÑ Ð¿ÑОЌеМеМ ÑПлÑкП ÐŽÐ»Ñ ÐžÐœÐºÑеЌеМÑалÑМПгП запÑÑка
and order_date >= (select max(order_date) from {{ this }})
{%- endif %}
),
order_payments as (
select * from {{ ref('order_payments') }}
),
final as (
select
orders.order_id,
orders.customer_id,
orders.order_date,
orders.status,
{% for payment_method in payment_methods -%}
order_payments.{{payment_method}}_amount,
{% endfor -%}
order_payments.total_amount as amount
from orders
left join order_payments using (order_id)
)
select * from final
áá±á¬áºáááºááŸá®ááá¯ááááº
ááŸá®ááá¯ááŸá¯áá áºáááºáááºáž ááŒá áºáá«áááºá áááºážááᯠDAG (Directed Acyclic Graph) áá¯áá±á«áºáááºá
DBT ááẠááá±á¬áá»ááºáá±á¬áºáááºáá»á¬ážá¡á¬ážáá¯á¶ážá ááœá²á·á ááºážááŸá¯áá¯á¶á á¶á¡áá±á«áº á¡ááŒá±áá¶á ááááºáá áºáá¯ááᯠáááºáá±á¬ááºááẠááá¯á·ááá¯áẠáááºážá¡á á¬áž áá±á¬áºáááºáá»á¬ážá¡ááœááºáž ref() ááá·áºááºáá»á¬ážááᯠá¡ááŒá¬ážáá±á¬áºáááºáá»á¬ážááŸáá·áº áá»áááºáááºáááºá ááááºáá áºáá¯ááŸáááŒááºážá ááá·áºá¡á¬áž á¡á±á¬ááºáá«á¡áá¬áá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºá á±áááº-
- ááŸááºáááºáá±á¬ á¡á á®á¡á á¥áºáá»á¬ážááŒáá·áº áá¯ááºáá±á¬ááºáá±áá«áááºá
- ááá¯ááºáá»ááºááŸá¬á á¬ááœá²á·á ááºážááŒááºáž á¡ááŒáá¯ááº
- ááááºáááᯠá¡ááá¯ááºááœá²áá áºáá¯ááᯠáá¯ááºáá±á¬ááºááŒááºážá
ááááºáá áºáá¯á¶áá±á¬áºááŒááºážá á¥ááá¬-
ááááºá node áá
áºáá¯á
á®ááẠáá±á¬áºáááºáá
áºáá¯ááŒá
áºáááºá ááááºáá¡áá¬ážáá»á¬ážááᯠexpression ref ááŸáááºááŸááºáá¬ážáááºá
áá±áá¬á¡áááºá¡ááœá±ážááŸáá·áº á á¬ááœááºá á¬áááºážáá»á¬áž
áá±á¬áºáááºáá»á¬ážááᯠááá¯ááºááá¯ááºáá¯ááºáá¯ááºááŒááºážá¡ááŒááºá DBT ááẠááá·áºá¡á¬áž áááŸááá¬áá±á¬ áá±áá¬á¡á á¯á¶ááŸáá·áºáááºáááºááá·áº áá°ááá»ááºáá»á¬ážá áœá¬ááᯠá ááºážáááºááœáá·áºááŒá¯áááº-á
- Null ááá¯ááºáá«á
- áá°ážááŒá¬ážáá±á¬
- Reference Integrity - ááá¯ážáá¬ážááŸá¯ááá¯ááºáᬠááá¯ááºáá¬ááŸá¯ (á¥ááá¬á á¡ááŸá¬á á¬ááá¬ážááŸá customer_id ááẠáá±á¬ááºáááºááá¬ážááŸá id ááŸáá·áº áááºááá¯ááºáááº)
- áááºáá¶ááá¯ááºáá±á¬áááºááá¯ážáá»á¬ážá á¬áááºážááŸáá·áº ááá¯ááºáá®ááŒááºážá
á¥ááá¬á¡á¬ážááŒáá·áºá ááœááºáá²á·ááá·áºáá áºáááºá áá áºáááºá áá áºáá០á¡ááœáŸááºážááááºážáá»á¬ážááŒáá·áº áááºááœá±á % ááœá±áááºááŒááºážáá²á·ááá¯á·áá±á¬ áááºáááá¯ááºááá¯ááºá ááºážáááºááŸá¯áá»á¬áž (á áááºááŒáá¯ááºáá±áá¬á ááºážáááºááŸá¯áá»á¬áž) ááᯠááá·áºááá¯ááºáááºá SQL query áá áºáá¯á¡ááŒá Ạáá¯á¶áá±á¬áºáá¬ážááá·áº áááºááá·áºáá°ááá»ááºáááᯠá ááºážáááºááŸá¯áá áºáᯠááŒá áºáá¬ááá¯ááºáááºá
á€áááºážá¡á¬ážááŒáá·áºá áááºááẠááá¯áá±á«ááºááŒáááºážáá±á«ááºáá»á¬ážááŸá áá±áá¬áá»á¬ážááœáẠáááá¯áá¬ážá¡ááºáá±á¬ ááœá±áááºááŸá¯áá»á¬ážááŸáá·áº á¡ááŸá¬ážá¡ááœááºážáá»á¬ážááᯠáááºážáá°ááá¯ááºáá«áááºá
á á¬ááœááºá á¬áááºážááá á¹á áá»á¬ážááœááºá DBT ááẠáá±á¬áºáááºááŸáá·áº áááºááœáŸááºážáá»ááºá¡ááá·áºáá»á¬ážááœáẠáááºáá¬áá±áá¬ááŸáá·áº ááŸááºáá»ááºáá»á¬áž ááŒáá·áºáá±ááŒááºážá¡ááœáẠááá¹ááá¬ážáá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáá«áááºá
á€áááºááŸá¬ á ááºážáááºáá»ááºáá»á¬ážááŸáá·áº á á¬ááœááºá á¬áááºážáá»á¬ážááᯠááá·áºááœááºážááŒááºáž ááá¯ááºá¡ááá·áºááœáẠáááºááá¯á·áá±á¬áá¯á¶áá±á«áºáááº-
- name: fct_orders
description: This table has basic information about orders, as well as some derived facts based on payments
columns:
- name: order_id
tests:
- unique # пÑПвеÑка Ма ÑМОкалÑМПÑÑÑ Ð·ÐœÐ°ÑеМОй
- not_null # пÑПвеÑка Ма МалОÑОе null
description: This is a unique identifier for an order
- name: customer_id
description: Foreign key to the customers table
tests:
- not_null
- relationships: # пÑПвеÑка ÑÑÑлПÑМПй ÑелПÑÑМПÑÑО
to: ref('dim_customers')
field: customer_id
- name: order_date
description: Date (UTC) that the order was placed
- name: status
description: '{{ doc("orders_status") }}'
tests:
- accepted_values: # пÑПвеÑка Ма ЎПпÑÑÑОЌÑе зМаÑеМОÑ
values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
á€áááºááŸá¬ á€á á¬ááœááºá á¬áááºážááẠáá¯ááºáá¯ááºáá¬ážáá±á¬ áááºááá¯ááºááœáẠáááºááá¯á·áá±á¬áá¯á¶á á¶ááŒá áºáááº-
Macros ááŸáá·áº Modules
DBT ááááºááœááºáá»ááºááŸá¬ SQL scripts á¡á á¯á¡áá±ážáá áºáá¯ááŒá áºáá¬á á±áááºááŸá¬ áá»á¬ážá áœá¬ááá¯ááºáá±á¬áºáááºáž á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡á¬áž áááºážááá¯á·áááá¯ááºááá¯ááºá¡ááœááºááŒá±á¬ááºážááŸá¯áá»á¬ážáááºáá±á¬ááºááŒááºážááŸáá·áº ဠmodules áá»á¬ážááá¯ááŒáá·áºáá±ááŒááºážá¡ááœáẠá¡á áœááºážáááºááŒá®áž á áœááºážáá±á¬ááºááŸá¯ááŒáœááºááá±á¬áááºážáááºážáá»á¬ážááᯠáá±ážáá±á¬ááºáááºááŒá áºáááºá
Macros ááẠáá±á¬áºáááºáá»á¬ážá¡ááœááºáž áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá¡ááŒá Ạáá±á«áºááá¯ááá¯ááºáá±á¬ áááºáá±á¬ááºáá¯á¶áá»á¬ážááŸáá·áº á¡áá¯á¶ážá¡ááŸá¯ááºážáá»á¬áž á¡á á¯á¡áá±ážáá»á¬ážááŒá áºáááºá Macros ááẠááá·áºá¡á¬áž DRY (Don't Repeat Yourself) á¡ááºáá»ááºáá®áá¬áááá¬áá¡á áá±á¬áºáááºáá»á¬ážááŸáá·áº ááá±á¬áá»ááºáá»á¬ážááŒá¬áž SQL ááᯠááŒááºáááºá¡áá¯á¶ážááŒá¯ááœáá·áºáá±ážáááºá
Macro á¥ááá¬-
{% macro rename_category(column_name) %}
case
when {{ column_name }} ilike '%osx%' then 'osx'
when {{ column_name }} ilike '%android%' then 'android'
when {{ column_name }} ilike '%ios%' then 'ios'
else 'other'
end as renamed_product
{% endmacro %}
áááºážáá¡áá¯á¶ážááŒá¯ááŸá¯-
{% set column_name = 'product' %}
select
product,
{{ rename_category(column_name) }} -- вÑзПв ЌакÑПÑа
from my_table
DBT ááẠá¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡á¬áž áá áºáŠážáá»ááºáž áá±á¬áºáá»á°ážáá»á¬ážááŸáá·áº áááºáááá¯áá»á¬ážááᯠáá¯ááºáá±ááŒá®áž ááŒááºáááºá¡áá¯á¶ážááŒá¯ááœáá·áºááŒá¯ááá·áº áááºáá±á·áá»áºáááºáá±áá»á¬áá«ááŸááááºá
ááá¯ááá¯áááºááŸá¬- áá²á·ááá¯á·áá±á¬ á á¬ááŒáá·áºááá¯ááºáá»á¬ážááᯠáááºá á¡áá¯á¶ážááŒá¯ááá¯ááºááŒááºážá
dbt_utils áááºá áœá²/á¡áá»áááºá Surrogate Keysá Schema á ááºážáááºááŸá¯áá»á¬ážá Pivot/Unpivot ááŸáá·áº á¡ááŒá¬ážá¡áá¬áá»á¬ážááŒáá·áº á¡áá¯ááºáá¯ááºáááº- á¡á
ááŸááá±á¬ áááºáá±á¬ááºááŸá¯áá»á¬ážá¡ááœáẠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ ááŒááœá²áá¯á¶á
á¶áá»á¬áž
áá®ážááŸááºáž Оá¡á ááºáž - áááºááŸááºáá¬ážáá±á¬ áá±áá¬á¡áá±á¬ááºážááá¯ááºáá»á¬ážá¡ááœáẠá
á¬ááŒáá·áºááá¯ááºáá»á¬ážá á¥ááá¬á
Redshift áá áºáá¯ááºáá¯ááºáá±áž - DBT áá¯ááºáá±á¬ááºáá»ááºááᯠááŸááºáááºážáááºáááºá¡ááœáẠáá±á¬áºáá»á°áž
áááºáá±á·áá»áºáá»á¬ážá
á¬áááºáž á¡ááŒáá·áºá¡á
á¯á¶ááᯠááœáẠááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
ááá¯ááá¯á·áá±á¬áẠá áœááºážáá±á¬ááºááá¯ááºáá«áá±ážáááºá
á€ááœáẠáá»áœááºá¯ááºááŸáá·áºá¡ááœá²á·ááẠData Warehouse áááºáá±á¬ááºáá¬ááœáẠá¡áá¯á¶ážááŒá¯ááá·áº á¡ááŒá¬ážá
áááºáááºá
á¬ážááœááºáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááŸáá·áº á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá»á¬ážááᯠáá±á¬áºááŒáá«áááºá
Runtime áááºáááºážáá»ááºáá»á¬ážááᯠááœá²ááŒá¬ážááŒááºáž DEV - TEST - PROD
áá°áá®áá±á¬ DWH á¡á á¯á¡áá±ážá¡ááœááºážáááẠ(ááœá²ááŒá¬ážááŒá¬ážáá¬ážáá±á¬ á¡á á®á¡á ááºáá»á¬ážá¡ááœááºáž)á á¥ááá¬á¡á¬ážááŒáá·áºá á¡á±á¬ááºáá«á¡áá¯á¶ážá¡ááŸá¯ááºážááá¯á¡áá¯á¶ážááŒá¯áááº-
with source as (
select * from {{ source('salesforce', 'users') }}
where 1=1
{%- if target.name in ['dev', 'test', 'ci'] -%}
where timestamp >= dateadd(day, -3, current_date)
{%- endif -%}
)
á€áá¯ááºááẠá á¬áá¬ážá¡ááá¯ááºážááŒá±á¬áááº- áááºáááºážáá»ááºá¡ááœáẠdevá á ááºážáááºá ci ááŒá®ážáá²á·áá±á¬ 3 áááºá¡ááœááºáᬠáá±áá¬ááᯠááá°áá±á¬á·áá«á ááá¯ááá¯áááºááŸá¬á á€áááºáááºážáá»ááºáá»á¬ážááœáẠáááºáááºááŒááºážááẠááá¯ááá¯ááŒááºáááºáááºááŒá áºááŒá®áž á¡áááºážá¡ááŒá áºá¡áááºážááẠááá¯á¡ááºáá«áááºá áááºáááºážáá»ááºááᯠáááºáááºáá±áá»ááẠáá±á¬á· á á áºáá¯ááºááŸá¯á¡ááŒá±á¡áá±á¡á¬áž áá»á áºáá»á°ááŸá¯áá«áááºá
á¡ááŸáá·áºáá» áá±á¬áºáᶠáá¯ááºááŒáá·áº áá¯á¶áá±á¬áºááŒááºážá
Redshift ááẠáá±á¬áºáá¶áá áºáá¯á á®á¡ááœáẠdata compression algorithms áá»á¬ážááᯠáááºááŸááºááœáá·áºááŒá¯ááá·áº columnar DBMS áá áºáá¯ááŒá áºáááºá á¡áá±á¬ááºážáá¯á¶áž algorithms ááá¯ááœá±ážáá»ááºááŒááºážááẠdisk space ááᯠ20-50% áá»áŸá±á¬á·áá»ááá¯ááºáááºá
ááá¹áááá¯
Macro áááºááŸááº-
{{ compress_table(schema, table,
drop_backup=False,
comprows=none|Integer,
sort_style=none|compound|interleaved,
sort_keys=none|List<String>,
dist_style=none|all|even,
dist_key=none|String) }}
ááŸááºáááºážáá¯á¶á ᶠáááºáááºáá±áááºá
á áááºááŒááºážáááŒá¯áá® ááá¯á·ááá¯áẠáá±á¬áºáááºáááºáá®ážááŸá¯ááŒá®ážá á®ážááŒá®ážáá±á¬áẠáá»ááºáá»ááºážáá¯ááºáá±á¬ááºááá·áº áá±á¬áºáááºááá¯ááºáá±á¬ááºááŸá¯áá áºáá¯á á®ááœáẠáá»áááºáá»á¬ážááᯠááẠáá°ážááœá²áá¯ááºáá±á¬ááºááá¯ááºáááº-
pre-hook: "{{ logging.log_model_start_event() }}"
post-hook: "{{ logging.log_model_end_event() }}"
loggging module ááẠááá·áºá¡á¬áž ááá¯á¡ááºáá±á¬ metadata á¡á¬ážáá¯á¶ážááᯠáá®ážááŒá¬ážááá¬ážáá áºáá¯ááœáẠááŸááºáááºážáááºááá¯ááºá á±áááºááŒá áºááŒá®áž áá±á¬ááºááá¯ááºážááœáẠááááºááá¯á·ááŸá¯áá»á¬ážááᯠá á áºáá±ážááŒááºážááŸáá·áº ááœá²ááŒááºážá áááºááŒá¬ááẠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
Looker ááŸá ááŸááºáááºážáá±áá¬á¡áá±á«áº á¡ááŒá±áá¶á áááºááŸáºáá¯ááºááẠáá¯á¶ááá¹áá¬ááºáá°áááº-
ááá¯ááŸá±á¬ááºááŸá¯ááááºážááááºážááŒááºážá á¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±á¬ááºááŒááºážá
á¡áááºá áááºááẠUDF (User Defined Functions) áá²á·ááá¯á·áá±á¬ á¡áá¯á¶ážááŒá¯áá¬ážáá±á¬ Repository á ááá¯ážáá»á²á·ááŸá¯á¡áá»áá¯á·ááᯠá¡áá¯á¶ážááŒá¯áá«áá á€áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá¬ážááŸááºážááŒá¯áá¯ááºááŒááºážá áááºáá±á¬ááºááááºážáá»á¯ááºááŒááºážááŸáá·áº á¡áá áºááœááºááŸááá¬ážáá±á¬ á¡ááá¯á¡áá»á±á¬ááºáá¯ááºááŒááºážáá»á¬ážááᯠDBT ááœáẠáá¯ááºáá±á¬ááºááẠá¡ááœááºá¡áááºááŒá±áá«áááºá
áá»áœááºá¯ááºááá¯á·ááẠáááºááºáá»á¬ážá á¡á®ážáá±ážááºááá¯ááááºážáá»á¬ážááŸáá·áº bitmask áá¯ááºááᯠááœááºáá»ááºááẠPython ááœáẠUDF ááᯠá¡áá¯á¶ážááŒá¯áááºá
áááºááá·áº execution áááºáááºážáá»ááºááœááºáááᯠUDF ááá¯áááºáá®ážáá±ážááá·áº macro áá¥ááá¬áá áºáá¯á
{% macro create_udf() -%}
{% set sql %}
CREATE OR REPLACE FUNCTION {{ target.schema }}.f_sha256(mes "varchar")
RETURNS varchar
LANGUAGE plpythonu
STABLE
AS $$
import hashlib
return hashlib.sha256(mes).hexdigest()
$$
;
{% endset %}
{% set table = run_query(sql) %}
{%- endmacro %}
Wheely ááœáẠPostgreSQL ááá¯á¡ááŒá±áá¶ááá·áº Amazon Redshift ááá¯á¡áá¯á¶ážááŒá¯áááºá Redshift á¡ááœááºá ááá¬ážáá»á¬ážáá±á«áºááŸá á á¬áááºážááá¬ážáá»á¬ážááᯠáá¯á¶ááŸááºá á¯áá±á¬ááºážáááºááŸáá·áº disk space - ANALYZE ááŸáá·áº VACUUM commands á¡áá®ážáá®ážááŸáááẠá¡áá±ážááŒá®ážáá«áááºá
áá«ááá¯áá¯ááºááá¯á·á redshift_maintenance macro áá²á command ááœá±ááᯠáááá¯ááºáž áá¯ááºáá±á¬ááºáá«áááºá
{% macro redshift_maintenance() %}
{% set vacuumable_tables=run_query(vacuumable_tables_sql) %}
{% for row in vacuumable_tables %}
{% set message_prefix=loop.index ~ " of " ~ loop.length %}
{%- set relation_to_vacuum = adapter.get_relation(
database=row['table_database'],
schema=row['table_schema'],
identifier=row['table_name']
) -%}
{% do run_query("commit") %}
{% if relation_to_vacuum %}
{% set start=modules.datetime.datetime.now() %}
{{ dbt_utils.log_info(message_prefix ~ " Vacuuming " ~ relation_to_vacuum) }}
{% do run_query("VACUUM " ~ relation_to_vacuum ~ " BOOST") %}
{{ dbt_utils.log_info(message_prefix ~ " Analyzing " ~ relation_to_vacuum) }}
{% do run_query("ANALYZE " ~ relation_to_vacuum) %}
{% set end=modules.datetime.datetime.now() %}
{% set total_seconds = (end - start).total_seconds() | round(2) %}
{{ dbt_utils.log_info(message_prefix ~ " Finished " ~ relation_to_vacuum ~ " in " ~ total_seconds ~ "s") }}
{% else %}
{{ dbt_utils.log_info(message_prefix ~ ' Skipping relation "' ~ row.values() | join ('"."') ~ '" as it does not exist') }}
{% endif %}
{% endfor %}
{% endmacro %}
DBT ááááºááá¯ááº
DBT ááᯠáááºáá±á¬ááºááŸá¯ (Managed Service) á¡ááŒá Ạá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá áá«áááºáááº-
- ááá±á¬áá»ááºáá»á¬ážááŸáá·áº áá±á¬áºáááºáá»á¬ážááᯠáá®ááœááºáááºá¡ááœáẠWeb IDE
- á¡áá¯ááºááœá²á·á ááºážáá¯á¶ááŸáá·áº á¡áá»áááºááá¬ážááœá²ááŒááºážá
- ááŸááºáááºážáá»á¬ážááᯠááá¯ážááŸááºážááŒá®áž á¡áááºááŒá±á áœá¬ á¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
- ááá·áºááá±á¬áá»ááºááᯠá á¬ááœááºá á¬áááºážáá»á¬ážááŒáá·áº áááºááá¯ááº
- CI áá»áááºáááºááŒááºáž (á ááºáááºáááŒááºáá±á«ááºážá ááºážááŒááºáž)
áá±á¬ááºáá»ááº
DWH ááᯠááŒááºáááºááŒááºážááŸáá·áº á á¬ážáá¯á¶ážááŒááºážááẠáá»á±á¬áºáááºáá»á±á¬áºáááºáá±á¬ááºááŒááºážáá²á·ááá¯á·ááẠáá»á±á¬áºá áá¬áá±á¬ááºážááŒá®áž á¡áá»áá¯ážááŸáá á±áá«áááºá DBT ááœáẠJinjaá á¡áá¯á¶ážááŒá¯áá° ááá¯ážáá»á²á·ááŸá¯áá»á¬áž (modules)á compilerá executor ááŸáá·áº package manager ááá¯á· áá«áááºáááºá á€á¡áá¬áá»á¬ážááᯠáá±á«ááºážá ááºážááŒááºážááŒáá·áº áááºááẠáááºá Data Warehouse á¡ááœáẠááŒá®ážááŒáá·áºá á¯á¶áá±á¬ áá¯ááºáááºážááœááºáááºáááºážáá»ááºááᯠáááŸááááºááŒá áºáááºá ááá±á·áá±áẠDWH á¡ááœááºáž á¡ááœááºááŒá±á¬ááºážááŒááºážááᯠá á®áá¶ááá·áºááœá²ááẠááá¯ááá¯áá±á¬ááºážááœááºáá±á¬ áááºážáááºážáááŸááá±á
DBT á developer áá»á¬ážááá±á¬ááºááá¯ááºáá¯á¶ááŒááºáá»ááºáá»á¬ážááᯠá¡á±á¬ááºáá«á¡ááá¯ááºáž áá¯á¶áá±á¬áºáá¬ážáá«áááºá
- áá¯ááºááẠGUI ááá¯ááºáá² ááŸá¯ááºááœá±ážáá±á¬ ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááá¯ááºáᬠáá¯áá¹áááá±áááᯠáá±á¬áºááŒááŒááºážá¡ááœáẠá¡áá±á¬ááºážáá¯á¶ážáá±á¬ á áááºáá°ážáááºáááºááŒá áºáááºá
- áá±áá¬ááŸáá·áºá¡áá¯ááºáá¯ááºááŒááºážááẠáá±á¬á·ááºáá²ááºá¡ááºáá»ááºáá®áᬠ(Software Engineering) ááœáẠá¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬ážááᯠááá¯ááºáá»á±á¬áá®ááœá±ááŸáááá·áºáááºá
- á¡áá±ážááŒá®ážáá±á¬áá±áá¬á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááᯠá¡áá¯á¶ážááŒá¯áá°á¡ááá¯ááºážá¡ááá¯ááºážá ááœáá·áºáááºážá¡áááºážá¡ááŒá áºáá±á¬á·ááºáá²á¡ááŒá Ạááááºážáá»á¯ááºááá·áºáááºá
- ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááá¯ááºáᬠáááááá¬áá»á¬ážáá¬áá áá¯ááºáááºáááºáž Open Source á¡ááá¯ááºážá¡ááá¯ááºážá ááá¯ááºááá¯ááºááŸá¯ááŒá áºáá¬áááºááŒá áºáááºá
á€á¡ááŒá±áá¶áá¯á¶ááŒááºáá»ááºáá»á¬ážááẠááá±á· áá¯áá¹ááá®áá±á«ááºáž 850 áá»á±á¬áºá á¡áá¯á¶ážááŒá¯áá±ááá·áº áá¯ááºáá¯ááºáá áºáá¯ááᯠáá±á«ááºááœá¬ážáá¬áá²á·ááŒá®áž áááºážááá¯á·ááẠá¡áá¬áááºááœáẠáááºáá®ážááá·áº á áááºááŸá¯ááºááŸá¬ážááœááºáᬠááá¯ážáá»á²á·ááŸá¯áá»á¬ážá á¡ááŒá±áá¶ááŒá áºáá¬áááºá
á
áááºáááºá
á¬ážáá°áá»á¬ážá¡ááœáẠOTUS ááœáẠá¡ááœáá·áºáááºáááºážá
á¬á áá
áºá
áááºáá
áºááá¯ááºážá¡áá±ááŒáá·áº ááœááºáá²á·áá±á¬áá¡áááºážáááºá áá»áœááºáá±á¬áºáá±ážáá²á·áá±á¬ á¡ááœáá·áºáááºáááºážá
ᬠáá®áá®ááá¯áá
áºáá¯ááŸááá«áááºá
DBT ááŸáá·áº Data Warehousing á¡ááŒáẠOTUS ááááºáá±á¬ááºážááŸá Data Engineer áááºáááºážá áá áºá áááºáá áºááá¯ááºážá¡áá±ááŒáá·áºá áá»áœááºá¯ááºááŸáá·áº áá»áœááºá¯ááºááẠá¡ááŒá¬ážáááºááá¯ááºáá¬ááŸáá·áº áá±ááºáá®áá±á¬ á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážá áœá¬á¡ááœáẠá¡áááºážáá»á¬ážááᯠáááºááŒá¬ážáá±ážáááº-
- Big Data Applications á¡ááœáẠáááá¯áá¬ááá¯ááºáᬠá¡áá°á¡ááá»á¬áž
- Spark ááŸáá·áº Spark Streaming ááŒáá·áºáá±á·áá»áá·áºáá«á
- áá±áá¬áááºážááŒá áºáá»á¬ážááᯠáááºááŒááºážá¡ááœáẠáááºážáááºážáá»á¬ážááŸáá·áº áááááá¬áá»á¬ážááᯠááŸá¬ááœá±ááŒááºážá
- DWH ááœáẠááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááá¯ááºáᬠááŒáááºážáá»á¬áž áááºáá±á¬ááºááŒááºážá
- NoSQL ááá±á¬ááá¬ážáá»á¬áž- HBaseá Cassandraá ElasticSearch
- á á±á¬áá·áºááŒáá·áºááŒááºážááŸáá·áº ááŒáá¯ážááá¯ááºááŒááºážááá¯ááºáᬠá¡ááŒá±áá¶áá°áá»á¬áž
- áá±á¬ááºáá¯á¶ážááá±á¬áá»ááº- áá»áœááºážáá»ááºááŸá¯á¡á¬ážáá¯á¶ážááᯠáááºážááœáŸááºáá¶á·ááá¯ážááŸá¯á¡á±á¬ááºááœáẠá¡áá°ááᜠáá¬ážááŸáááŒááºážá
ááá·áºááºáá»á¬áž
DBT á á¬ááœááºá á¬áááºáž - áááá«ááºáž - ááá¬ážáááºá á¬ááœááºá á¬áááºážá¡ááá¡áá» dbt ááá¯áá¬áá¬áá²á â DBT ááá±ážáá¬ážáá°áá áºáŠážááŸáá¯á¶ážáááºáá»ááºáá±á¬ááºážáá«ážAmazon Redshift Storage á¡ááœáẠData Build Tool â YouTubeá OTUS á¡ááœáá·áºáááºáááºážá á¬ááᯠááŸááºáááºážáááºááŒááºážáGreenplum á¡ááŒá±á¬ááºážááᯠáááá¬á á±ááẠ- áá±á¬ááºááœáá·áºááá·áºáááºáááºážá á¬ááŸá¬ áá±á 15 ááẠ2020 ááŒá áºáá«áááºáData Engineering áááºáááºáž âOTUSá¡ááœááºáá±á¬ááºáá±á¬ ááá¯ááºážááŒá¬ážá áááºááŒá¬ááŸá¯áá¯ááºáááºážá¡ááœá¬ážá¡áá¬ááᯠáááºáá±á¬ááºááŒááºážá - áá±áá¬ááŸáá·áº ááœá²ááŒááºážá áááºááŒá¬ááŸá¯á á¡áá¬áááºááᯠááŒáá·áºáá«áopen source ááœá²ááŒááºážá áááºááŒá¬ááŸá¯á¡ááœáẠá¡áá»áááºáá±á¬ááºáá«ááŒá®á - ááœá²ááŒááºážá áááºááŒá¬ááŸá¯áááá·áºáá²ááŒá áºá ááºááŸáá·áº Open Source áááœáŸááºážááá¯ážááŸá¯dbtCloud ááŒáá·áº á ááºáááºáááŒáẠáá±á«ááºážá ááºááŒááºážááŸáá·áº á¡ááá¯á¡áá»á±á¬áẠáááºáá±á¬ááºááŒááºáž á ááºážáááºááŒááºážá - DBT ááá¯á¡áá¯á¶ážááŒá¯á CI áááºáá±á¬ááºááŒááºážááá¯ááºáá¬áá°áá»á¬ážDBT áááºáááºážá á¬ááᯠá áááºááá¯ááºáá«á - á¡ááŸá®á¡ááá¯áááºážáá±á¬ á¡áá¯ááºá¡ááœáẠáá±á·áá»áá·áºáá«á á¡ááá·áºááá·áº áááºážááœáŸááºáá«áJaffle ááá¯áẠâ Github DBT áá»á°ááá¯áá®ááẠ- Githubá ááá¬áá±ážááá±á¬áá»ááºáá¯ááº
source: www.habr.com