
ΠΠ° ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π°Π²Π° ΠΈΠ΄Π΅Π°Π»Π½ΠΎΡΠΎ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΠΠ°Π½Π½ΠΈ?
Π€ΠΎΠΊΡΡ Π²ΡΡΡ Ρ Π±ΠΈΠ·Π½Π΅Ρ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠ° ΠΏΡΠΈ ΠΎΡΡΡΡΡΠ²ΠΈΠ΅ Π½Π° boilerplate ΠΊΠΎΠ΄. Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° 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'] %}
Ρ ΠΏΠΎΡΡΡΠΊΠΈ ΠΊΠ°ΡΠΎ (
ΠΈΠ·Π±Π΅ΡΠΈ * ΠΎΡ {{ ref('stg_orders') }}
),
ΠΏΠ»Π°ΡΠ°Π½ΠΈΡ ΠΏΠΎ ΠΏΠΎΡΡΡΠΊΠΈ ΠΊΠ°ΡΠΎ (
ΠΈΠ·Π±Π΅ΡΠΈ * ΠΎΡ {{ ref('order_payments') }}
),
ΡΠΈΠ½Π°Π»Π½ΠΎ ΠΊΠ°ΡΠΎ (
ΠΈΠ·Π±Π΅ΡΠΈ
ΠΏΠΎΡΡΡΠΊΠΈ.order_id,
ΠΏΠΎΡΡΡΠΊΠΈ.customer_id,
ΠΏΠΎΡΡΡΠΊΠΈ.order_date,
ΠΏΠΎΡΡΡΠΊΠΈ.status,
{% for payment_method in payment_methods -%}
order_payments.{{payment_method}}_amount,
{% endfor -%}
order_payments.total_amount ΠΊΠ°ΡΠΎ amount
ΠΎΡ ΠΏΠΎΡΡΡΠΊΠΈ
Π»ΡΠ²ΠΎ ΡΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ order_payments using (order_id)
)
ΠΈΠ·Π±Π΅ΡΠΈ * ΠΎΡ ΡΠΈΠ½Π°Π»Π½ΠΎ
ΠΠ°ΠΊΠ²ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΡΡΠΊ?
ΠΠ° ΠΏΡΡΠ²ΠΎ ΠΌΡΡΡΠΎ: ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΡΠ° CTE (ΠΠ±ΡΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ Π·Π° ΠΈΠ·ΡΠ°Π·ΡΠ²Π°Π½Π΅) β Π·Π° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΉΡΠΎ ΡΡΠ΄ΡΡΠΆΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ΠΈΡ ΠΈ Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠ°
ΠΠ° Π²ΡΠΎΡΠΎ ΠΌΡΡΡΠΎ: ΠΠΎΠ΄ΡΡ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° β ΡΠΎΠ²Π° Π΅ ΡΠΌΠ΅ΡΠΈΡΠ° ΠΎΡ SQL ΠΈ Π΅Π·ΠΈΠΊΠ° (Π΅Π·ΠΈΠΊ Π·Π° ΡΠ°Π±Π»ΠΎΠ½ΠΈ).
Π ΠΏΡΠΈΠΌΠ΅ΡΠ° Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ ΡΠΈΠΊΡΠ» for Π·Π° ΡΠΎΡΠΌΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠΌΠ°ΡΠ° Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π½Π° ΠΏΠ»Π°ΡΠ°Π½Π΅, ΡΠΊΠ°Π·Π°Π½ Π² ΠΈΠ·ΡΠ°Π·Π° set. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° ref β Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠ΅ ΠΏΠΎΠ·ΠΎΠ²Π΅Ρ Π²ΡΡΡΠ΅ Π² ΠΊΠΎΠ΄Π° Π½Π° Π΄ΡΡΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ:
- ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ΡΠΎ ref ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ Π² ΡΠ΅Π»Π΅Π²ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π» ΠΊΡΠΌ ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΠ»ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ
- ref ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π³ΡΠ°Π΄ΠΈ Π³ΡΠ°Ρ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅
Π’ΠΎΡΠ½ΠΎ ΡΠΎΠ²Π° Π΄ΠΎΠ±Π°Π²Ρ Π² DBT ΠΏΠΎΡΡΠΈ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ. ΠΠ°ΠΉ-ΡΠ΅ΡΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡΠ΅ ΠΎΡ ΡΡΡ :
- If / else ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ β ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ Π·Π° ΡΠ°Π·ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅
- For ΡΠΈΠΊΠ»ΠΈ β ΡΠΈΠΊΠ»ΠΈ
- ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ β ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
- ΠΠ°ΠΊΡΠΎΡ β ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΌΠ°ΠΊΡΠΎΡΠΈ
ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ: Π’Π°Π±Π»ΠΈΡΠ°, ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, ΠΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ
Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ Π·Π° ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ β ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΡΠΏΠΎΡΠ΅Π΄ ΠΊΠΎΠΉΡΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ½ΠΈΡΡ Π½Π°Π±ΠΎΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° ΡΠ΅ Π±ΡΠ΄Π΅ Π·Π°ΠΏΠ°Π·Π΅Π½ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ.
Π ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΡΠΎΠ²Π° Π΅:
- Π’Π°Π±Π»ΠΈΡΠ° β ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠ° ΡΠ°Π±Π»ΠΈΡΠ° Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ
- ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ β Π²ΠΈΡΡΡΠ°Π»Π½Π° ΡΠ°Π±Π»ΠΈΡΠ° Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ
ΠΠΌΠ° ΠΈ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΈ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ Π·Π° ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ:
- ΠΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ β ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ (Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ Ρ ΡΠ°ΠΊΡΠΈ); Π½ΠΎΠ²ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΡΡ, ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈΡΠ΅ β ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°Ρ, ΠΈΠ·ΡΡΠΈΡΠΈΡΠ΅ β ΠΈΠ·ΡΠΈΡΡΠ²Π°ΡΒ
- ΠΡΠΈΠΌΠ΅ΡΠ½ΠΎ β ΠΌΠΎΠ΄Π΅Π»ΡΡ Π½Π΅ ΡΠ΅ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ, Π½ΠΎ ΡΡΠ°ΡΡΠ²Π° ΠΊΠ°ΡΠΎ CTE Π² Π΄ΡΡΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
- ΠΡΡΠΊΠ°ΠΊΠ²ΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΡΠ°ΠΌΠΈ
Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈΡΠ΅ Π·Π° ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ ΠΎΡΠ²Π°ΡΡΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π·Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
- Snowflake: ΠΡΠ΅Ρ ΠΎΠ΄Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ, Merge ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΠ»Π°ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ, ΠΠΎΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠ°Π²Π°, Π‘ΠΈΠ³ΡΡΠ½ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ
- Redshift: Distkey, Sortkey (Π²Π·Π°ΠΈΠΌΠ½ΠΎ, ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Π½ΠΎ), ΠΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ
- BigQuery: ΠΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ & ΠΊΠ»Π°ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π΅, Merge ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, KMS Π¨ΠΈΡΡΠΎΠ²Π°Π½Π΅, ΠΡΠΈΠΊΠ΅ΡΠΈ & Π’Π°Π³ΠΎΠ²Π΅
- Spark: Π€ΠΎΡΠΌΠ°Ρ Π½Π° ΡΠ°ΠΉΠ»Π° (parquet, csv, json, orc, delta), partition_by, clustered_by, buckets, incremental_strategy
ΠΡΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°:
- Postgres
- Redshift
- BigQuery
- Snowflake
- Presto (ΡΠ°ΡΡΠΈΡΠ½ΠΎ)
- Spark (ΡΠ°ΡΡΠΈΡΠ½ΠΎ)
- 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() Π² ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΠΊΡΠΌ Π΄ΡΡΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠΠ°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° Π³ΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ:
- Π‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΠΏΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ
- ΠΠ°ΡΠ°Π»Π΅Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠΎΡΠΌΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π²ΠΈΡΡΠΈΠ½ΠΈ
- Π‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΠΏΠΎΠ΄Π³ΡΠ°ΡΒ
ΠΡΠΈΠΌΠ΅Ρ Π·Π° Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Π³ΡΠ°ΡΠ°:

ΠΡΠ΅ΠΊΠΈ Π²ΡΡΡ
Π½Π° Π³ΡΠ°ΡΠ° β ΡΠΎΠ²Π° Π΅ ΠΌΠΎΠ΄Π΅Π», ΡΠ΅Π±ΡΠ°ΡΠ° Π½Π° Π³ΡΠ°ΡΠ° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΡΡΠ΅Π· ΠΈΠ·ΡΠ°Π·Π° 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 ~ " ΠΎΡ " ~ 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 ~ " ΠΠ°ΠΊΡΡΠΌΠ½ΠΎ ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° " ~ relation_to_vacuum) }}
{% do run_query("VACUUM " ~ relation_to_vacuum ~ " BOOST") %}
{{ dbt_utils.log_info(message_prefix ~ " ΠΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° " ~ 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 ~ " ΠΠ°Π²ΡΡΡΠ΅Π½ΠΎ " ~ relation_to_vacuum ~ " Π·Π° " ~ total_seconds ~ "s") }}
{% else %}
{{ dbt_utils.log_info(message_prefix ~ ' ΠΡΠΎΠΏΡΡΠΊΠ°Π½Π΅ Π½Π° ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ "' ~ row.values() | join ('"."') ~ '" ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°') }}
{% endif %}
{% endfor %}
{% endmacro %}
DBT Cloud
ΠΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° DBT ΠΊΠ°ΡΠΎ ΡΡΠ»ΡΠ³Π° (Managed Service). ΠΠΊΠ»ΡΡΠ²Π°:
- Web IDE Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
- ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°Π΄Π°ΡΠΈ ΠΈ Π³ΡΠ°ΡΠΈΠΊ
- ΠΠ΅ΡΠ΅Π½ ΠΈ ΡΠ΄ΠΎΠ±Π΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅
- Π£Π΅Π±ΡΠ°ΠΉΡ Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ
- Π‘Π²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° CI (ΠΠ΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½Π΅)

ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΠΈΠ³ΠΎΡΠ²ΡΠ½Π΅ΡΠΎ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° DWH ΡΡΠ°Π²Π° ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΡΠΈΡΡΠ½ΠΎ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΈ ΠΏΠΈΠ΅Π½Π΅ΡΠΎ Π½Π° ΡΠΌΡΡΠΈ. DBT ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ Jinja, ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ (ΠΌΠΎΠ΄ΡΠ»ΠΈ), ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ, ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅Π» (executor) ΠΈ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ. Π‘ΡΠ±ΠΈΡΠ°ΠΉΠΊΠΈ ΡΠ΅Π·ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π·Π°Π΅Π΄Π½ΠΎ, ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΡΠ΅ ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π½ΠΎ ΡΠ°Π±ΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π·Π° Π²Π°ΡΠ΅ΡΠΎ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΠΠ°Π½Π½ΠΈ. ΠΠ½Π΅Ρ Π΅Π΄Π²Π° Π»ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ ΠΏΠΎ-Π΄ΠΎΠ±ΡΡ Π½Π°ΡΠΈΠ½ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈΡΠ΅ Π² DWH.
ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡΡΠ°, ΡΠ»Π΅Π΄Π²Π°Π½ΠΈ ΠΎΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° DBT, ΡΠ΅ ΡΠΎΡΠΌΡΠ»ΠΈΡΠ°Ρ ΡΠ°ΠΊΠ°:
- ΠΠΎΠ΄ΡΡ, Π° Π½Π΅ GUI, Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠ°ΡΠ° Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ Π·Π° ΠΈΠ·ΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ»ΠΎΠΆΠ½Π° Π°Π½Π°Π»ΠΈΡΠΈΡΠ½Π° Π»ΠΎΠ³ΠΈΠΊΠ°.
- Π Π°Π±ΠΎΡΠ°ΡΠ° Ρ Π΄Π°Π½Π½ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π°Π΄Π°ΠΏΡΠΈΡΠ° Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠΎΡΡΡΠ΅Ρ.
- ΠΠ°ΠΉ-Π²Π°ΠΆΠ½Π°ΡΠ° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π΄Π°Π½Π½ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ° ΠΎΡ ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ ΠΊΠ°ΡΠΎ ΡΠΎΡΡΡΠ΅Ρ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄.
- ΠΠ΅ ΡΠ°ΠΌΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈΡΠ΅ Π·Π° Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ°, Π½ΠΎ ΠΈ ΠΊΠΎΠ΄ΡΡ Π²ΡΠ΅ ΠΏΠΎ-ΡΠ΅ΡΡΠΎ ΡΠ΅ ΡΡΠ°Π½Π΅ ΠΏΡΠΈΡΠ΅ΠΆΠ°Π½ΠΈΠ΅ Π½Π° Open Source ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ°.
Π’Π΅Π·ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΡΠ±Π΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠ΄ΠΈΡ Π° ΠΏΡΠΎΠ΄ΡΠΊΡ, ΠΊΠΎΠΉΡΠΎ Π΄Π½Π΅Ρ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ Π½Π°Π΄ 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

