
ΠΠ° ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π°Π²Π° ΠΈΠ΄Π΅Π°Π»Π½ΠΎΡΠΎ Π‘ΠΊΠ»Π°Π΄ΠΎΠ²ΠΎ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΠΠ°Π½Π½ΠΈ?
Π€ΠΎΠΊΡΡ Π²ΡΡΡ Ρ Π±ΠΈΠ·Π½Π΅Ρ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠ° ΠΏΡΠΈ ΠΎΡΡΡΡΡΠ²ΠΈΠ΅ Π½Π° boilerplate code. Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° DWH ΠΊΠ°ΡΠΎ ΠΊΠΎΠ΄ΠΎΠ²Π° Π±Π°Π·Π°: Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π΅, ΠΏΡΠ΅Π³Π»Π΅Π΄ΠΈ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅ ΠΈ CI. ΠΠΎΠ΄ΡΠ»Π½ΠΎΡΡ, ΡΠ°Π·ΡΠΈΡΡΠ΅ΠΌΠΎΡΡ, ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ ΠΈ ΠΎΠ±ΡΠ½ΠΎΡΡ. Π£Π΄ΠΎΠ±Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ (Data Lineage).
ΠΠ° Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π² ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΈ Π·Π° ΡΠΎΠ»ΡΡΠ° Π½Π° DBT Π² Π΅ΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Big Data & Analytics β Π΄ΠΎΠ±ΡΠ΅ Π΄ΠΎΡΠ»ΠΈ ΠΏΠΎΠ΄ ΠΊΠ°Ρ.
ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ
ΠΠ· ΡΡΠΌ ΠΡΡΠ΅ΠΌΠΈΠΉ ΠΠΎΠ·ΠΈΡΡ. ΠΠ΅ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 5 Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠ°Π±ΠΎΡΡ Ρ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈ, Π·Π°Π½ΠΈΠΌΠ°Π²Π°ΠΌ ΡΠ΅ Ρ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ETL/ELT, ΠΊΠ°ΠΊΡΠΎ ΠΈ Ρ Π°Π½Π°Π»ΠΈΠ· Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ. Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠ°Π±ΠΎΡΡ Π² , ΠΏΡΠ΅ΠΏΠΎΠ΄Π°Π²Π°ΠΌ Π² OTUS Π½Π° ΠΊΡΡΡΠ° , ΠΈ Π΄Π½Π΅Ρ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»Ρ Ρ Π²Π°Ρ ΡΡΠ°ΡΠΈΡ, ΠΊΠΎΡΡΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ Π² ΠΏΡΠ΅Π΄Π΄Π²Π΅ΡΠΈΠ΅ΡΠΎ Π½Π° ΡΡΠ°ΡΡΠ° Π½Π° Π½ΠΎΠ² Π½Π°Π±ΠΎΡ Π½Π° ΠΊΡΡΡΠ°.
ΠΡΠ°ΡΡΠΊ ΠΏΡΠ΅Π³Π»Π΅Π΄
Π€ΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΡΡ DBT β ΡΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ Π·Π° Π±ΡΠΊΠ²Π°ΡΠ° T Π² Π°ΠΊΡΠΎΠ½ΠΈΠΌΠ° ELT (Extract β Transform β Load).
Π‘ ΠΏΠΎΡΠ²Π°ΡΠ° Π½Π° ΡΠ°ΠΊΠΈΠ²Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΈ ΠΈ ΠΌΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΈ Π°Π½Π°Π»ΠΈΡΠΈΡΠ½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΊΠ°ΡΠΎ BigQuery, Redshift, Snowflake, ΠΈΠ·ΡΠ΅Π·Π½Π° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π° ΠΏΡΠ°Π²ΠΈΠΌ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΠ·Π²ΡΠ½ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° ΠΠ°Π½Π½ΠΈ.Β
DBT Π½Π΅ ΠΈΠ·Π²Π»ΠΈΡΠ° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ, Π½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΎΠ³ΡΠΎΠΌΠ½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ Π²Π΅ΡΠ΅ ΡΠ° Π·Π°ΡΠ΅Π΄Π΅Π½ΠΈ Π² Π‘ΠΊΠ»Π°Π΄ (Π² Internal ΠΈΠ»ΠΈ External Storage).

ΠΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° DBT Π΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅ ΠΊΠΎΠ΄Π°, Π΄Π° Π³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° Π² SQL, ΠΈ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ Π² ΠΏΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ Π² Π‘ΠΊΠ»Π°Π΄.
Π‘ΡΡΡΠΊΡΡΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° DBT
ΠΡΠΎΠ΅ΠΊΡΡΡ ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ Π΄Π²Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ Π΄Π²Π° ΡΠΈΠΏΠ°:
- ΠΠΎΠ΄Π΅Π» (.sql) β Π΅Π΄ΠΈΠ½ΠΈΡΠ° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΈΠ·ΡΠ°Π·Π΅Π½Π° Ρ SELECT Π·Π°ΡΠ²ΠΊΠ°
- Π€Π°ΠΉΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ (.yml) β ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ, ΡΠ΅ΡΡΠΎΠ²Π΅, Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
ΠΠ° Π±Π°Π·ΠΎΠ²ΠΎ Π½ΠΈΠ²ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ°:
- ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Ρ ΠΊΠΎΠ΄Π° Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Π² ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Π½Π° IDE
- Π§ΡΠ΅Π· CLI ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅, DBT ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° ΠΊΠΎΠ΄Π° Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Π² SQL
- Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΈΡΡ SQL ΠΊΠΎΠ΄ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π² Π‘ΠΊΠ»Π°Π΄ Π² Π·Π°Π΄Π°Π΄Π΅Π½Π°ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ (Π³ΡΠ°Ρ)
ΠΡΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΎΡ CLI:

ΠΡΠΈΡΠΊΠΎ Π΅ SELECT
Π’ΠΎΠ²Π° Π΅ ΠΊΠΈΠ»Π»Π΅Ρ-ΡΡΠ½ΠΊΡΠΈΡ Π½Π° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Data Build Tool. Π‘ Π΄ΡΡΠ³ΠΈ Π΄ΡΠΌΠΈ, DBT Π°Π±ΡΡΡΠ°Ρ ΠΈΡΠ° ΡΠ΅Π»ΠΈΡ ΠΊΠΎΠ΄, ΡΠ²ΡΡΠ·Π°Π½ Ρ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° Π²Π°ΡΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ Π² Π‘ΠΊΠ»Π°Π΄ (Π²Π°ΡΠΈΠ°ΡΠΈΠΈ ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ CREATE, INSERT, UPDATE, DELETE ALTER, GRANT, β¦).
ΠΡΡΠΊΠ° ΠΌΠΎΠ΄Π΅Π» ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π° Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π΅Π΄Π½Π° SELECT Π·Π°ΡΠ²ΠΊΠ°, ΠΊΠΎΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ½ΠΈΡ Π½Π°Π±ΠΎΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ.
ΠΡΠ·ΠΌΠΎΠΆΠ½Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎΡΡΠ΅ΠΏΠ΅Π½Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅, ΠΊΠΎΡΡΠΎ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈΠ΄ΠΈΡΠ° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π΄ΡΡΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΠΌΠΎΠ΄Π΅Π», ΠΊΠΎΠΉΡΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π° Π²ΠΈΡΡΠΈΠ½Π° Π·Π° ΠΏΠΎΡΡΡΠΊΠΈ (f_orders):
{% set payment_methods = ['credit_card', 'coupon', 'bank_transfer', 'gift_card'] %}
Ρ ΠΏΠΎΡΡΡΠΊΠΈ ΠΊΠ°ΡΠΎ (
select * from {{ ref('stg_orders') }}
),
ΠΏΠ»Π°ΡΠ°Π½ΠΈΡ ΠΏΠΎ ΠΏΠΎΡΡΡΠΊΠΈ ΠΊΠ°ΡΠΎ (
select * from {{ ref('order_payments') }}
),
ΡΠΈΠ½Π°Π»Π½ΠΎ ΠΊΠ°ΡΠΎ (
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 (ΠΠ±ΡΠΈ Π’Π°Π±Π»ΠΈΡΠ½ΠΈ ΠΠ·ΡΠ°Π·ΠΈ) β Π·Π° ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π½Π΅ ΠΈ ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π°, ΡΡΠ΄ΡΡΠΆΠ°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ΠΈΡ ΠΈ Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠ°
ΠΠ° Π²ΡΠΎΡΠΎ ΠΌΡΡΡΠΎ: ΠΠΎΠ΄ΡΡ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° β Π΅ ΡΠΌΠ΅ΡΠΈΡΠ° ΠΎΡ SQL ΠΈ Π΅Π·ΠΈΠΊ (Π΅Π·ΠΈΠΊ Π·Π° ΡΠ°Π±Π»ΠΎΠ½ΠΈ).
Π ΠΏΡΠΈΠΌΠ΅ΡΠ° Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ ΡΠΈΠΊΡΠ» for Π·Π° ΡΠΎΡΠΌΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠΌΠ°ΡΠ° ΠΏΠΎ Π²ΡΠ΅ΠΊΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π½Π° ΠΏΠ»Π°ΡΠ°Π½Π΅, ΠΏΠΎΡΠΎΡΠ΅Π½ Π² ΠΈΠ·ΡΠ°Π·Π° set. ΠΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ ΠΈ ΡΡΠ½ΠΊΡΠΈΡΡΠ° ref β Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΠ΅ΡΠ΅ΡΠΈΡΠ°Π½Π΅ Π² ΠΊΠΎΠ΄Π° Π½Π° Π΄ΡΡΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ:
- ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΡΠ° ref ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ Π² ΡΠ΅Π»Π΅Π²ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π» ΠΊΡΠΌ ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΠ»ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π² Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ
- ref ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Π³ΡΠ°Ρ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅
Π’ΠΎΡΠ½ΠΎ ΡΠΎΠ²Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π½Π° DBT ΠΏΠΎΡΡΠΈ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ. ΠΠ°ΠΉ-ΡΠ΅ΡΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡΠ΅ ΠΎΡ ΡΡΡ ΡΠ°:
- If / else ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ β ΡΡΠ»ΠΎΠ²Π½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ
- For ΡΠΈΠΊΠ»ΠΈ β ΡΠΈΠΊΠ»ΠΈ
- ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ β ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
- ΠΠ°ΠΊΡΠΎ β ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΌΠ°ΠΊΡΠΎΡΠΈ
ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ: Π’Π°Π±Π»ΠΈΡΠ°, ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, ΠΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ
Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡΡΠ° Π·Π° ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ β ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΠΏΡΠΈ ΠΊΠΎΠΉΡΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ½ΠΈΡΡ Π½Π°Π±ΠΎΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° ΡΠ΅ Π±ΡΠ΄Π΅ Π·Π°ΠΏΠ°Π·Π΅Π½ Π² Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ.
Π ΠΎΡΠ½ΠΎΠ²Π΅Π½ ΠΏΠ»Π°Π½ ΡΠΎΠ²Π° Π΅:
- Π’Π°Π±Π»ΠΈΡΠ° β ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠ° ΡΠ°Π±Π»ΠΈΡΠ° Π² Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ
- ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ β Π²ΠΈΡΡΡΠ°Π»Π½Π° ΡΠ°Π±Π»ΠΈΡΠ° Π² Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ
ΠΠΌΠ° ΠΈ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΈ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ Π·Π° ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ:
- ΠΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ β ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° (Π³ΠΎΠ»Π΅ΠΌΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ ΡΠ°ΠΊΡΠΈ); Π½ΠΎΠ²ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΡΡ, ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈΡΠ΅ β Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ, ΠΈΠ·ΡΡΠΈΡΠΈΡΠ΅ β ΡΠ΅ ΠΏΠΎΡΠΈΡΡΠ²Π°ΡΒ
- Ephemeral β ΠΌΠΎΠ΄Π΅Π»ΡΡ Π½Π΅ ΡΠ΅ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ, Π½ΠΎ ΡΡΠ°ΡΡΠ²Π° ΠΊΠ°ΡΠΎ CTE Π² Π΄ΡΡΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
- ΠΡΠΈΡΠΊΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ°ΠΌΠΈ
Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈΡΠ΅ Π·Π° ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ ΠΎΡΠΊΡΠΈΠ²Π°Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠΏΠΎΡΠ΅Π΄ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
- Snowflake: ΠΡΠ΅Ρ ΠΎΠ΄Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ, ΠΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅, ΠΠ»ΡΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ, ΠΠΎΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠ°Π²Π°, Π‘ΠΈΠ³ΡΡΠ½ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ
- Redshift: Distkey, Sortkey (ΠΈΠ½ΡΠ΅ΡΠ»Π΅Π²ΠΈΡΠ°Π½, ΡΡΡΡΠ°Π²Π΅Π½), ΠΡΡΠ½ΠΎ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ
- BigQuery: ΠΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π΅ ΠΈ ΠΊΠ»ΡΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ, ΠΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅, ΠΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ Ρ KMS, ΠΡΠΈΠΊΠ΅ΡΠΈ ΠΈ Π’Π°Π³ΠΎΠ²Π΅
- Spark: Π€ΠΎΡΠΌΠ°Ρ Π½Π° ΡΠ°ΠΉΠ»Π° (parquet, csv, json, orc, delta), partition_by, clustered_by, buckets, incremental_strategy
Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°:
- Postgres
- Redshift
- BigQuery
- Snowflake
- Presto (ΡΠ°ΡΡΠΈΡΠ½ΠΎ)
- Spark (ΡΠ°ΡΡΠΈΡΠ½ΠΎ)
- Microsoft SQL Server (community adapter)
ΠΠ΅ΠΊΠ° ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈΠΌ Π½Π°ΡΠΈΡ ΠΌΠΎΠ΄Π΅Π»:
- ΠΠ° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ Ρ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ (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() Π²ΡΡΡΠ΅ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΠΊΡΠΌ Π΄ΡΡΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠΠ°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° Π³ΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π½Π΅ΡΠ°:
- Π‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Π² ΠΏΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ
- ΠΠ°ΡΠ°Π»Π΅Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π²ΠΈΡΡΠΈΠ½ΠΈ
- Π‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΠΏΠΎΠ΄Π³ΡΠ°ΡΒ
ΠΡΠΈΠΌΠ΅Ρ Π·Π° Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Π³ΡΠ°ΡΠ°:

ΠΡΠ΅ΠΊΠΈ Π²ΡΠ·Π΅Π» Π² Π³ΡΠ°ΡΠ° β ΡΠΎΠ²Π° Π΅ ΠΌΠΎΠ΄Π΅Π», ΡΡΠ±ΠΎΠ²Π΅ΡΠ΅ Π½Π° Π³ΡΠ°ΡΠ° ΡΠ΅ Π·Π°Π΄Π°Π²Π°Ρ ΡΡΠ΅Π· ΠΈΠ·ΡΠ°Π·Π° ref.
ΠΠ°ΡΠ΅ΡΡΠ²ΠΎ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΈ ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
ΠΡΠ²Π΅Π½ ΡΠΎΡΠΌΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ°ΠΌΠΈΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, DBT ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ΡΡΠ²Π°ΡΠ΅ ΡΠ΅Π΄ΠΈΡΠ° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (assertions) ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ½ΠΈΡ Π½Π°Π±ΠΎΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ, ΠΊΠ°ΡΠΎ:
- Not Null
- Unique
- Reference Integrity β ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½Π° ΡΡΠ»ΠΎΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, customer_id Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° orders ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° id Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° customers)
- Π‘ΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Π½Π° ΡΠΏΠΈΡΡΠΊ Ρ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ
ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΡΠ²ΠΎΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅ (custom data tests), ΠΊΠ°ΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, % ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΠ΅ ΡΠΏΡΡΠΌΠΎ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈΡΠ΅ ΠΎΡ ΠΏΡΠ΅Π΄ΠΈ Π΄Π΅Π½, ΡΠ΅Π΄ΠΌΠΈΡΠ°, ΠΌΠ΅ΡΠ΅Ρ. ΠΡΡΠΊΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠΎΡΠΌΡΠ»ΠΈΡΠ°Π½ΠΎ Π²ΡΠ² Π²ΠΈΠ΄ Π½Π° SQL Π·Π°ΡΠ²ΠΊΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ°Π½Π΅ ΡΠ΅ΡΡ.
ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΡ Π½Π΅ΠΆΠ΅Π»Π°Π½ΠΈΡΠ΅ ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΡ ΠΈ Π³ΡΠ΅ΡΠΊΠΈ Π² Π΄Π°Π½Π½ΠΈΡΠ΅ Π² Π²ΠΈΡΡΠΈΠ½ΠΈΡΠ΅ Π½Π° Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ.
Π©ΠΎ ΡΠ΅ ΠΎΡΠ½Π°ΡΡ Π΄ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π΅ΡΠΎ, DBT ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ Π·Π° Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅, Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π΅ ΠΈ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΠΈ ΠΈ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ Π½Π° Π½ΠΈΠ²ΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Π΄ΠΎΡΠΈ Π°ΡΡΠΈΠ±ΡΡΠΈ.Β
ΠΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ΡΠΎ Π½Π° ΡΠ΅ΡΡΠΎΠ²Π΅ ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° Π½ΠΈΠ²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ°ΠΉΠ»:
Β - name: fct_orders
description: Π’Π°Π·ΠΈ ΡΠ°Π±Π»ΠΈΡΠ° ΡΡΠ΄ΡΡΠΆΠ° ΠΎΡΠ½ΠΎΠ²Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠΎΡΡΡΠΊΠΈΡΠ΅, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π½ΡΠΊΠΎΠΈ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈ ΡΠ°ΠΊΡΠΈ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠ»Π°ΡΠ°Π½ΠΈΡΡΠ°
columns:
- name: order_id
tests:
- unique # ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π° ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΎΡΡ Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅
- not_null # ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π° Π½Π°Π»ΠΈΡΠΈΠ΅ Π½Π° null
description: Π’ΠΎΠ²Π° Π΅ ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π·Π° ΠΏΠΎΡΡΡΠΊΠ°
- name: customer_id
description: ΠΡΠ½ΡΠ΅Π½ ΠΊΠ»ΡΡ ΠΊΡΠΌ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅
tests:
- not_null
- relationships: # ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½Π°ΡΠ° ΡΡΠ»ΠΎΡΡ
to: ref('dim_customers')
field: customer_id
- name: order_date
description: ΠΠ°ΡΠ° (UTC), Π½Π° ΠΊΠΎΡΡΠΎ Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½Π° ΠΏΠΎΡΡΡΠΊΠ°ΡΠ°
- name: status
description: '{{ doc("orders_status") }}'
tests:
- accepted_values: # ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π° Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ
values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
Π Π΅ΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°Π·ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π²Π΅ΡΠ΅ Π½Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈΡ ΡΠ΅Π±ΡΠ°ΠΉΡ:

ΠΠ°ΠΊΡΠΎΡΠΈ ΠΈ ΠΠΎΠ΄ΡΠ»ΠΈ
ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠ΅Π» Π½Π° DBT Π½Π΅ Π΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΡΡΠ°Π½Π΅ Π½Π°Π±ΠΎΡ ΠΎΡ SQL ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅, Π° Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ ΠΌΠΎΡΠ½ΠΈ ΠΈ Π±ΠΎΠ³Π°ΡΠΈ Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅Π·ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ.
ΠΠ°ΠΊΡΠΎΡΠΈΡΠ΅ ΡΠ° Π½Π°Π±ΠΎΡΠΈ ΠΎΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΈ ΠΈΠ·ΡΠ°Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈ ΠΊΠ°ΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΡΡΠ΅ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅. ΠΠ°ΠΊΡΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° SQL ΠΌΠ΅ΠΆΠ΄Ρ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π² ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Ρ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠ½ΠΈΡ ΠΏΡΠΈΠ½ΡΠΈΠΏ DRY (ΠΠ΅ ΠΏΠΎΠ²ΡΠ°ΡΡΠΉ ΡΠ΅Π±Π΅ ΡΠΈ).
ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΠΌΠ°ΠΊΡΠΎΡ:
{% 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 ΠΈΠ΄Π²Π° Ρ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ (packages), ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π΄Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Ρ ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΈ ΠΌΠ°ΠΊΡΠΎΡΠΈ.
Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΡΠ΅ Π·Π°ΡΠ΅Π΄ΡΡ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΊΠ°ΡΠΎ:
- : ΡΠ°Π±ΠΎΡΠ° Ρ ΠΠ°ΡΠ°/Π§Π°Ρ, ΠΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅, Π’Π΅ΡΡΠΎΠ²Π΅ Π½Π° ΡΡ Π΅ΠΌΠ°, ΠΠΈΠ²ΠΎΡ/ΠΠ΅ΠΏΠΈΠ²ΠΎΡ ΠΈ Π΄ΡΡΠ³ΠΈ
- ΠΠΎΡΠΎΠ²ΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΈ Π·Π° Π²ΠΈΡΡΠΈΠ½ΠΈ Π·Π° ΡΡΠ»ΡΠ³ΠΈ ΠΊΠ°ΡΠΎ ΠΈ Β
- ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π½Π° ΠΠ°Π½Π½ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Β
- β ΠΠΎΠ΄ΡΠ» Π·Π° Π»ΠΎΠ³ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° DBT
Π‘ ΠΏΡΠ»Π½ΠΈΡ ΡΠΏΠΈΡΡΠΊ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ Π½Π° .
ΠΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
Π’ΡΠΊ ΡΠ΅ ΠΎΠΏΠΈΡΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΄ΡΡΠ³ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ Π°Π· ΠΈ Π΅ΠΊΠΈΠΏΡΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΠΠ°Π½Π½ΠΈ Π² .
Π Π°Π·Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΡΡΠ΅Π΄ΠΈΡΠ΅ 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, test, ci Π²Π·Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΠ°ΠΌΠΎ Π·Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ 3 Π΄Π½ΠΈ ΠΈ Π½Π΅ ΠΏΠΎΠ²Π΅ΡΠ΅. Π’ΠΎΠ΅ΡΡ, ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π² ΡΠ΅Π·ΠΈ ΡΡΠ΅Π΄ΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π±ΡΡΠ·ΠΎ ΠΈ ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΡΠ΅ΡΡΡΡΠΈ. ΠΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π² ΡΡΠ΅Π΄Π° prod ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΡΠΎ Π·Π° ΡΠΈΠ»ΡΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ³Π½ΠΎΡΠΈΡΠ°Π½ΠΎ.
ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Ρ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΠΎ ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈΡΠ΅
Redshift Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΎΡΠ½Π° Π‘Π£ΠΠ, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ Π·Π° ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ Π·Π° Π²ΡΡΠΊΠ° ΠΎΡΠ΄Π΅Π»Π½Π° ΠΊΠΎΠ»ΠΎΠ½Π°. ΠΠ·Π±ΠΎΡΡΡ Π½Π° ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈ Π·Π°Π΅ΡΠΈΡ ΠΎΠ±Π΅ΠΌ Π½Π° Π΄ΠΈΡΠΊΠ° Ρ 20-50%.
ΠΠ°ΠΊΡΠΎΡ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ANALYZE COMPRESSION, ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ Π½ΠΎΠ²Π° ΡΠ°Π±Π»ΠΈΡΠ° Ρ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠΈΡΠ΅Π»Π½ΠΈΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ Π·Π° ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈΡΠ΅, ΡΠΊΠ°Π·Π°Π½ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ (dist_key) ΠΈ ΠΏΠΎΠ΄ΡΠ΅ΠΆΠ΄Π°Π½Π΅ (sort_key), ΡΠ΅ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠΈ Π΄Π°Π½Π½ΠΈΡΠ΅ Π² Π½Π΅Ρ ΠΈ, ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ, ΡΠ΅ ΠΈΠ·ΡΡΠΈΠ΅ ΡΡΠ°ΡΠ°ΡΠ° ΠΊΠΎΠΏΠΈΡ.
Π‘ΠΈΠ³Π½Π°ΡΡΡΠ° Π½Π° ΠΌΠ°ΠΊΡΠΎΡΠ°:
{{ compress_table(schema, table,
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β drop_backup=False,
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β comprows=none|Integer,
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β sort_style=none|compound|interleaved,
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β sort_keys=none|List,
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β dist_style=none|all|even,
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β dist_key=none|String) }}
ΠΠΎΠ³ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ°ΡΡΠΎΠ²Π΅ΡΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ
ΠΠ° Π²ΡΡΠΊΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π» ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠΈΠΊΠ°ΡΠ΅Π½ΠΈ Ρ ΡΠΊΠΎΠ²Π΅ (hooks), ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΠΏΡΠ΅Π΄ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈΠ»ΠΈ Π²Π΅Π΄Π½Π°Π³Π° ΡΠ»Π΅Π΄ ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π°:
Β Β Β pre-hook: "{{ logging.log_model_start_event() }}"
Β Β Β post-hook: "{{ logging.log_model_end_event() }}"
ΠΠΎΠ΄ΡΠ»ΡΡ Π·Π° Π»ΠΎΠ³ΠΈΡΠ°Π½Π΅ ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΠΈ Π² ΠΎΡΠ΄Π΅Π»Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°, ΠΏΠΎ ΠΊΠΎΡΡΠΎ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΠΆΠ΄Π° ΠΎΠ΄ΠΈΡ ΠΈ Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΈΡΠ΅ ΠΌΠ΅ΡΡΠ° (bottlenecks).
ΠΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°Π±Π»ΠΎΡΠΎ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΡ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ Π² Looker:

ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ
ΠΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π½ΡΠΊΠ°ΠΊΠ²ΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΎΡΠΎ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΠΊΠ°ΡΠΎ UDF (User Defined Functions), ΡΠΎ Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½ΠΎΡΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ Π²Π΅ΡΡΠΈΠΈ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π° ΡΠ΅ ΠΎΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° Π² DBT.
ΠΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ UDF Π½Π° Python Π·Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° Ρ Π΅Ρ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ, Π΄ΠΎΠΌΠ΅ΠΉΠ½ΠΈ Π½Π° ΠΈΠΌΠ΅ΠΉΠ» Π°Π΄ΡΠ΅ΡΠΈ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° Π±ΠΈΡΠΎΠ²ΠΈ ΠΌΠ°ΡΠΊΠΈ (bitmask).
ΠΡΠΈΠΌΠ΅Ρ Π½Π° ΠΌΠ°ΠΊΡΠΎΡ, ΠΊΠΎΠΉΡΠΎ ΡΡΠ·Π΄Π°Π²Π° UDF Π² ΡΡΠ΅Π΄Π° Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ (dev, test, prod):
{% 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 Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Amazon Redshift, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° PostgreSQL. ΠΠ° Redshift Π΅ Π²Π°ΠΆΠ½ΠΎ ΡΠ΅Π΄ΠΎΠ²Π½ΠΎ Π΄Π° ΡΠ΅ ΡΡΠ±ΠΈΡΠ°Ρ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ Π·Π° ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅ ΠΈ Π΄Π° ΡΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π° ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π½Π° Π΄ΠΈΡΠΊΠ° β ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ANALYZE ΠΈ VACUUM, ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ.
ΠΠ° ΡΠ΅Π»ΡΠ° Π²ΡΡΠΊΠ° Π²Π΅ΡΠ΅Ρ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΠΎΡ ΠΌΠ°ΠΊΡΠΎΡΠ° redshift_maintenance:
{% 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 Cloud
ΠΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠ΅ ΠΏΠΎΠ»Π·Π²Π° DBT ΠΊΠ°ΡΠΎ ΡΡΠ»ΡΠ³Π° (Managed Service). ΠΠΊΠ»ΡΡΠ²Π°:
- Web IDE Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
- ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π΄ΠΆΠΎΠ±ΠΎΠ²Π΅ΡΠ΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° Π³ΡΠ°ΡΠΈΠΊ
- ΠΠ΅ΡΠ΅Π½ ΠΈ ΡΠ΄ΠΎΠ±Π΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅
- Π£Π΅Π±ΡΠ°ΠΉΡ Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ
- ΠΡΡΠ·ΠΊΠ° Ρ CI (Continuous Integration)

ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΠΈΠ³ΠΎΡΠ²ΡΠ½Π΅ΡΠΎ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° DWH ΡΡΠ°Π²Π° ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΡΠΈΡΡΠ½ΠΎ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΈ ΠΏΠΈΠ΅Π½Π΅ΡΠΎ Π½Π° ΡΠΌΡΡΠΈΡΠ°. DBT ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ Jinja, ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ (ΠΌΠΎΠ΄ΡΠ»ΠΈ), ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ, ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅Π» (executor) ΠΈ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ. Π‘ΡΠ±ΡΠ°Π»ΠΈ ΡΠ΅Π·ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π·Π°Π΅Π΄Π½ΠΎ, ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΡΠ΅ ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π½ΠΎ ΡΠ°Π±ΠΎΡΠ½ΠΎ ΡΡΠ΅Π΄ΠΈΡΠ΅ Π·Π° Π²Π°ΡΠ΅ΡΠΎ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΠΠ°Π½Π½ΠΈ. ΠΠ½Π΅Ρ Π΅Π΄Π²Π° Π»ΠΈ ΠΈΠΌΠ° ΠΏΠΎ-Π΄ΠΎΠ±ΡΡ Π½Π°ΡΠΈΠ½ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈΡΠ΅ Π² DWH.
Π£Π±Π΅ΠΆΠ΄Π΅Π½ΠΈΡΡΠ°, ΠΊΠΎΠΈΡΠΎ ΡΠ»Π΅Π΄Π²Π°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° DBT, ΡΠ΅ ΡΠΎΡΠΌΡΠ»ΠΈΡΠ°Ρ ΡΠ°ΠΊΠ°:
- ΠΠΎΠ΄ΡΡ, Π° Π½Π΅ GUI, Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠ°ΡΠ° Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ Π·Π° ΠΈΠ·ΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ»ΠΎΠΆΠ½Π° Π°Π½Π°Π»ΠΈΡΠΈΡΠ½Π° Π»ΠΎΠ³ΠΈΠΊΠ°.
- Π Π°Π±ΠΎΡΠ°ΡΠ° Ρ Π΄Π°Π½Π½ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π°Π΄Π°ΠΏΡΠΈΡΠ° Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠΎΡΡΡΠ΅Ρ (Software Engineering).
- ΠΠ°ΠΉ-Π²Π°ΠΆΠ½Π°ΡΠ° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π΄Π°Π½Π½ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ° ΠΎΡ ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ ΠΊΠ°ΡΠΎ ΡΠΎΡΡΡΠ΅Ρ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄.
- ΠΠ΅ ΡΠ°ΠΌΠΎ Π°Π½Π°Π»ΠΈΡΠΈΡΠ½ΠΈΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, Π½ΠΎ ΠΈ ΠΊΠΎΠ΄ΡΡ Π²ΡΠ΅ ΠΏΠΎ-ΡΠ΅ΡΡΠΎ ΡΠ΅ ΡΡΠ°Π²Π° ΡΠ°ΡΡ ΠΎΡ ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ° Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄.
Π’Π΅Π·ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΡΠ±Π΅ΠΆΠ΄Π΅Π½ΠΈΡ ΡΡΠ·Π΄Π°Π΄ΠΎΡ Π° ΠΏΡΠΎΠ΄ΡΠΊΡ, ΠΊΠΎΠΉΡΠΎ Π΄Π½Π΅Ρ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 850 ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΈ ΡΠ΅ ΡΠΎΡΠΌΠΈΡΠ°Ρ ΠΎΡΠ½ΠΎΠ²Π°ΡΠ° Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ Π² Π±ΡΠ΄Π΅ΡΠ΅.
ΠΠ° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°Ρ, ΠΈΠΌΠ° Π²ΠΈΠ΄Π΅ΠΎΠ·Π°ΠΏΠΈΡ Π½Π° ΠΎΡΠΊΡΠΈΡ ΡΡΠΎΠΊ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΎΠ²Π΅Π΄ΠΎΡ ΠΏΡΠ΅Π΄ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ΅ΡΠ΅ΡΠ° Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΠΎΡΠΊΡΠΈΡΠΈΡ ΡΡΠΎΠΊ Π² OTUS β .
Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ DBT ΠΈ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°ΡΠ° Π½Π° ΠΠ°Π½Π½ΠΈ, Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΠΊΡΡΡΠ° Data Engineer Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° OTUS, Π°Π· ΠΈ ΠΌΠΎΠΈΡΠ΅ ΠΊΠΎΠ»Π΅Π³ΠΈ Π²ΠΎΠ΄ΠΈΠΌ Π·Π°Π½ΡΡΠΈΡ ΠΏΠΎ ΡΠ΅Π΄ΠΈΡΠ° Π΄ΡΡΠ³ΠΈ Π°ΠΊΡΡΠ°Π»Π½ΠΈ ΠΈ ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΡΠ΅ΠΌΠΈ:
- ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΠΎΠ»Π΅ΠΌΠΈ ΠΠ°Π½Π½ΠΈ.
- ΠΡΠ°ΠΊΡΠΈΠΊΠ° ΡΡΡ Spark ΠΈ Spark Streaming.
- ΠΠ·ΡΡΠ°Π²Π°Π½Π΅ Π½Π° Π½Π°ΡΠΈΠ½ΠΈ ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ Π½Π° Π΄Π°Π½Π½ΠΈ.
- ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΡΠΈΡΠ½ΠΈ Π²ΠΈΡΡΠΈΠ½ΠΈ Π² DWH.
- ΠΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ NoSQL: HBase, Cassandra, ElasticSearch.
- ΠΡΠΈΠ½ΡΠΈΠΏΠΈ Π½Π° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΡ.Β
- Π€ΠΈΠ½Π°Π»Π΅Π½ ΠΡΠΎΠ΅ΠΊΡ: ΡΡΠ±ΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠΌΠ΅Π½ΠΈΡ Π²ΠΎΠ΅Π΄Π½ΠΎ ΠΏΠΎΠ΄ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΡΠΊΠ° ΠΏΠΎΠ΄ΠΊΡΠ΅ΠΏΠ°.
ΠΡΡΠ·ΠΊΠΈ:
- β ΠΡΠΈΡΠΈΠ°Π»Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ.
- β ΠΡΠ΅Π³Π»Π΅Π΄Π½Π° ΡΡΠ°ΡΠΈΡ Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΡ Π°Π²ΡΠΎΡΠΈΡΠ΅ Π½Π° DBT.Β
- β YouTube, ΠΠ°ΠΏΠΈΡ Π½Π° ΠΎΡΠΊΡΠΈΡΠΈΡ ΡΡΠΎΠΊ OTUS.
- β ΠΠ°ΠΉ-Π±Π»ΠΈΠ·ΠΊΠΈΡΡ ΠΎΡΠΊΡΠΈΡ ΡΡΠΎΠΊ 15 ΠΌΠ°ΠΉ 2020.
- β OTUS.
- β ΠΠ·Π³Π»ΡΠ΄ ΠΊΡΠΌ Π±ΡΠ΄Π΅ΡΠ΅ΡΠΎ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ Π΄Π°Π½Π½ΠΈ ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠ°.
- β ΠΠ²ΠΎΠ»ΡΡΠΈΡ Π½Π° Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠ° ΠΈ Π²Π»ΠΈΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° Open Source.
- β ΠΡΠΈΠ½ΡΠΈΠΏΠΈ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° CI Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° DBT.
- β ΠΡΠ°ΠΊΡΠΈΠΊΠ°, Π‘ΡΡΠΏΠΊΠΎΠ²ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π° ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½Π° ΡΠ°Π±ΠΎΡΠ°.
- β Github, ΠΊΠΎΠ΄ Π½Π° ΡΡΠ΅Π±Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com

