ΠΠ° ΠΊΠΎΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ Π΅ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ ΠΈΠ΄Π΅Π°Π»Π΅Π½ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ Π·Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ?
Π€ΠΎΠΊΡΡΠΈΡΠ°ΡΡΠ΅ ΡΠ΅ Π½Π° Π΄Π΅Π»ΠΎΠ²Π½Π°ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠ° Π²ΠΎ ΠΎΡΡΡΡΡΠ²ΠΎ Π½Π° ΠΊΠΎΠ΄ Π·Π° ΠΊΠΎΡΠ΅Π». Π£ΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ DWH ΠΊΠ°ΠΊΠΎ Π±Π°Π·Π° Π½Π° ΠΊΠΎΠ΄ΠΎΠ²ΠΈ: Π²Π΅ΡΠ·ΠΈΠΈ, ΠΏΡΠ΅Π³Π»Π΅Π΄, Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΎ ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ ΠΈ CI. ΠΠΎΠ΄ΡΠ»Π°ΡΠ΅Π½, ΠΏΡΠΎΡΠΈΡΠ»ΠΈΠ², ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ ΠΈ Π·Π°Π΅Π΄Π½ΠΈΡΠ°. ΠΠΎΡΠΈΡΠ½ΠΈΡΠΊΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° ΠΈ Π²ΠΈΠ·ΡΠ΅Π»ΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ (Data Lineage).
ΠΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΠ΅ΡΠΎ ΠΎΠ²Π° ΠΈ Π·Π° ΡΠ»ΠΎΠ³Π°ΡΠ° Π½Π° DBT Π²ΠΎ Π΅ΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠΎΡ Big Data & Analytics - Π΄ΠΎΠ±ΡΠ΅Π΄ΠΎΡΠ΄ΠΎΠ²ΡΠ΅ Π²ΠΎ cat.
ΠΠ΄ΡΠ°Π²ΠΎ Π½Π° ΡΠΈΡΠ΅
ΠΡΡΠ΅ΠΌΠΈ ΠΠΎΠ·ΠΈΡ Π΅ Π²ΠΎ ΠΊΠΎΠ½ΡΠ°ΠΊΡ. ΠΠΎΠ²Π΅ΡΠ΅ ΠΎΠ΄ 5 Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°ΠΌ ΡΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, Π³ΡΠ°Π΄Π΅ΡΠ΅ ETL/ELT, ΠΊΠ°ΠΊΠΎ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ Π²ΠΈΠ·ΡΠ΅Π»ΠΈΠ·Π°ΡΠΈΡΠ°. ΠΠΎΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΠΌ Π²ΠΎ
ΠΡΠ΅Π³Π»Π΅Π΄
Π Π°ΠΌΠΊΠ°ΡΠ° DBT Π΅ ΡΓ¨ Π·Π° T Π²ΠΎ ΠΊΡΠ°ΡΠ΅Π½ΠΊΠ°ΡΠ° ELT (Extract - Transform - Load).
Π‘ΠΎ Π΄ΠΎΠ°ΡΠ°ΡΠ΅ΡΠΎ Π½Π° ΡΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠ²Π½ΠΈ ΠΈ ΡΠΊΠ°Π»Π°Π±ΠΈΠ»Π½ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΡΠΊΠΈ Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΊΠ°ΠΊΠΎ BigQuery, Redshift, Snowflake, Π½Π΅ΠΌΠ°ΡΠ΅ ΡΠΌΠΈΡΠ»Π° Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²Π°Ρ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ Data Warehouse.
DBT Π½Π΅ ΠΏΡΠ΅Π·Π΅ΠΌΠ° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΎΠ΄ ΠΈΠ·Π²ΠΎΡΠΈ, Π½ΠΎ Π΄Π°Π²Π° ΠΎΠ΄Π»ΠΈΡΠ½ΠΈ ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΡΠΎ Π²Π΅ΡΠ΅ ΡΠ΅ Π²ΡΠΈΡΠ°Π½ΠΈ Π²ΠΎ Π‘ΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ΡΠΎ (Π²ΠΎ Π²Π½Π°ΡΡΠ΅ΡΠ½ΠΎ ΠΈΠ»ΠΈ Π½Π°Π΄Π²ΠΎΡΠ΅ΡΠ½ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅).
ΠΠ»Π°Π²Π½Π°ΡΠ° ΡΠ΅Π» Π½Π° DBT Π΅ Π΄Π° Π³ΠΎ Π·Π΅ΠΌΠ΅ ΠΊΠΎΠ΄ΠΎΡ, Π΄Π° Π³ΠΎ ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ° Π²ΠΎ SQL, Π΄Π° Π³ΠΈ ΠΈΠ·Π²ΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ Π²ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° ΡΠ΅ΠΊΠ²Π΅Π½ΡΠ° Π²ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ.
Π‘ΡΡΡΠΊΡΡΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ DBT
ΠΡΠΎΠ΅ΠΊΡΠΎΡ ΡΠ΅ ΡΠΎΡΡΠΎΠΈ ΠΎΠ΄ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΈ ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΠΎΠ΄ ΡΠ°ΠΌΠΎ 2 ΡΠΈΠΏΠ°:
- ΠΠΎΠ΄Π΅Π» (.sql) - Π΅Π΄ΠΈΠ½ΠΈΡΠ° Π½Π° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡΠ° ΠΈΠ·ΡΠ°Π·Π΅Π½Π° ΡΠΎ Π±Π°ΡΠ°ΡΠ΅ SELECT
- ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° (.yml) - ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ, ΡΠ΅ΡΡΠΎΠ²ΠΈ, Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°
ΠΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΎ Π½ΠΈΠ²ΠΎ, ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π΅ ΡΡΡΡΠΊΡΡΡΠΈΡΠ°Π½Π° Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΠΎΠ² Π½Π°ΡΠΈΠ½:
- ΠΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΡΠ²Π° ΠΌΠΎΠ΄Π΅Π» ΠΊΠΎΠ΄ Π²ΠΎ ΠΊΠΎΡ Π±ΠΈΠ»ΠΎ ΡΠ΄ΠΎΠ±Π΅Π½ IDE
- ΠΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ CLI, ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΡΠ΅ Π»Π°Π½ΡΠΈΡΠ°Π°Ρ, DBT Π³ΠΎ ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ° ΠΊΠΎΠ΄ΠΎΡ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΎΡ Π²ΠΎ SQL
- ΠΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½ΠΈΠΎΡ SQL ΠΊΠΎΠ΄ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π²ΠΎ Storage Π²ΠΎ Π΄Π°Π΄Π΅Π½Π° Π½ΠΈΠ·Π° (Π³ΡΠ°ΡΠΈΠΊ)
ΠΠ²Π΅ ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅Π΄Π° ΡΡΡΠ°ΡΠ΅ΡΠΎ ΠΎΠ΄ CLI:
Π‘Γ¨ Π΅ SELECT
ΠΠ²Π° Π΅ ΡΠ±ΠΈΡΡΠ²Π΅Π½Π° ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π½Π° ΡΠ°ΠΌΠΊΠ°ΡΠ° Π½Π° Π°Π»Π°ΡΠΊΠ°ΡΠ° Π·Π° Π³ΡΠ°Π΄Π΅ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. Π‘ΠΎ Π΄ΡΡΠ³ΠΈ Π·Π±ΠΎΡΠΎΠ²ΠΈ, DBT Π³ΠΎ Π°ΠΏΡΡΡΠ°Ρ ΠΈΡΠ° ΡΠ΅Π»ΠΈΠΎΡ ΠΊΠΎΠ΄ ΠΏΠΎΠ²ΡΠ·Π°Π½ ΡΠΎ ΠΌΠ°ΡΠ΅ΡΠΈΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° Π²Π°ΡΠΈΡΠ΅ Π±Π°ΡΠ°ΡΠ° Π²ΠΎ ΠΏΡΠΎΠ΄Π°Π²Π½ΠΈΡΠ°ΡΠ° (Π²Π°ΡΠΈΡΠ°ΡΠΈΠΈ ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ CREATE, INSERT, UPDATE, DELETE ALTER, GRANT, ...).
Π‘Π΅ΠΊΠΎΡ ΠΌΠΎΠ΄Π΅Π» Π²ΠΊΠ»ΡΡΡΠ²Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π½Π° Π΅Π΄Π½ΠΎ Π±Π°ΡΠ°ΡΠ΅ SELECT ΡΡΠΎ Π³ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈΠΎΡ ΡΠ΅Ρ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.
ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ Π½ΠΈΠ²ΠΎΠ° ΠΈ Π΄Π° Π³ΠΈ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈΠ΄ΠΈΡΠ° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΠΎΠ΄ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π΄ΡΡΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΠΌΠΎΠ΄Π΅Π» ΠΊΠΎΡ ΡΠ΅ ΠΈΠ·Π³ΡΠ°Π΄ΠΈ ΠΈΠ·Π»ΠΎΠΆΠ±Π° Π½Π° Π½Π°ΡΠ°ΡΠΊΠΈ (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 ΠΈ ΡΠ°Π·ΠΈΠΊ
ΠΡΠΈΠΌΠ΅ΡΠΎΡ ΠΊΠΎΡΠΈΡΡΠΈ ΡΠ°ΠΌΠΊΠ° Π·Π° Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΈΠ·Π½ΠΎΡΠΎΡ Π·Π° ΡΠ΅ΠΊΠΎΡ Π½Π°ΡΠΈΠ½ Π½Π° ΠΏΠ»Π°ΡΠ°ΡΠ΅ Π½Π°Π²Π΅Π΄Π΅Π½ Π²ΠΎ ΠΈΠ·ΡΠ°Π·ΠΎΡ ΠΏΠΎΡΡΠ°Π²ΠΈ. Π‘Π΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π ΠΠ€ β ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΠΏΠ°ΡΡΠ²Π°ΡΠ΅ Π½Π° Π΄ΡΡΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π²ΠΎ ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΡ:
- ΠΠ° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΠ°ΡΠ° Π ΠΠ€ ΡΠ΅ ΡΠ΅ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ° Π²ΠΎ ΡΠ΅Π»Π΅Π½ ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π°Ρ Π½Π° ΡΠ°Π±Π΅Π»Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ³Π»Π΅Π΄ Π²ΠΎ Storage
- Π ΠΠ€ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΡΠ΅ Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ Π·Π° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ ΠΎΠ΄ ΠΌΠΎΠ΄Π΅Π»
Π’ΠΎΡΠ½ΠΎ
- ΠΠΊΠΎ / Π΄ΡΡΠ³ΠΎ ΠΈΠ·ΡΠ°Π²ΠΈ - ΠΈΠ·ΡΠ°Π²ΠΈ Π½Π° Π³ΡΠ°Π½ΠΊΠ°
- ΠΠ° ΡΠ°ΠΌΠΊΠΈ
- ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
- ΠΠ°ΠΊΡΠΎ - ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ ΠΌΠ°ΠΊΡΠΎΠ°
ΠΠ°ΡΠ΅ΡΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ°: Π’Π°Π±Π΅Π»Π°, ΠΠΎΠ³Π»Π΅Π΄, ΠΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ
Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡΠ°ΡΠ° Π·Π° ΠΌΠ°ΡΠ΅ΡΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ° Π΅ ΠΏΡΠΈΡΡΠ°ΠΏ ΡΠΏΠΎΡΠ΅Π΄ ΠΊΠΎΡ Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈΠΎΡ ΡΠ΅Ρ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° ΠΌΠΎΠ΄Π΅Π»ΠΎΡ ΡΠ΅ ΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΠ° Π²ΠΎ Storage.
ΠΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π° ΡΠΌΠΈΡΠ»Π°, ΡΠΎΠ° Π΅:
- Π’Π°Π±Π΅Π»Π° - ΡΠΈΠ·ΠΈΡΠΊΠ° ΡΠ°Π±Π΅Π»Π° Π²ΠΎ Π‘ΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ΡΠΎ
- ΠΡΠ΅Π³Π»Π΅Π΄ - ΠΏΡΠ΅Π³Π»Π΅Π΄, Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΡΠ°Π±Π΅Π»Π° Π²ΠΎ Storage
ΠΠΎΡΡΠΎΡΠ°Ρ ΠΈ ΠΏΠΎΡΠ»ΠΎΠΆΠ΅Π½ΠΈ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ Π·Π° ΠΌΠ°ΡΠ΅ΡΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ°:
- ΠΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ - ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ Π²ΡΠΈΡΡΠ²Π°ΡΠ΅ (Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΡΠ°Π±Π΅Π»ΠΈ ΡΠΎ ΡΠ°ΠΊΡΠΈ); ΡΠ΅ Π΄ΠΎΠ΄Π°Π²Π°Π°Ρ Π½ΠΎΠ²ΠΈ Π»ΠΈΠ½ΠΈΠΈ, ΡΠ΅ Π°ΠΆΡΡΠΈΡΠ°Π°Ρ ΠΏΡΠΎΠΌΠ΅Π½Π΅ΡΠΈΡΠ΅ Π»ΠΈΠ½ΠΈΠΈ, ΡΠ΅ Π±ΡΠΈΡΠ°Ρ ΠΈΠ·Π±ΡΠΈΡΠ°Π½ΠΈΡΠ΅ Π»ΠΈΠ½ΠΈΠΈ
- ΠΡΠ΅ΠΌΠ΅ΡΠ΅Π½ - ΠΌΠΎΠ΄Π΅Π»ΠΎΡ Π½Π΅ ΡΠ΅ ΠΌΠ°ΡΠ΅ΡΠΈΡΠ°Π»ΠΈΠ·ΠΈΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ, ΡΡΠΊΡ ΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΠΊΠ°ΠΊΠΎ CTE Π²ΠΎ Π΄ΡΡΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
- Π‘ΠΈΡΠ΅ Π΄ΡΡΠ³ΠΈ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ ΡΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΡΠ°ΠΌΠΈ
ΠΠΎΠΊΡΠ°Ρ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈΡΠ΅ Π·Π° ΠΌΠ°ΡΠ΅ΡΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ°, ΠΏΠΎΡΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠ° Π·Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ°, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ:
- Π‘Π½Π΅Π³ΡΠ»ΠΊΠ°: ΠΌΠΈΠ½Π»ΠΈΠ²ΠΈ ΡΠ°Π±Π΅Π»ΠΈ, ΠΎΠ΄Π½Π΅ΡΡΠ²Π°ΡΠ΅ ΡΠΎ ΡΠΏΠΎΡΡΠ²Π°ΡΠ΅, Π³ΡΡΠΏΠΈΡΠ°ΡΠ΅ ΡΠ°Π±Π΅Π»ΠΈ, ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ Π³ΡΠ°Π½ΡΠΎΠ²ΠΈ, Π±Π΅Π·Π±Π΅Π΄Π½ΠΈ ΠΏΡΠ΅Π³Π»Π΅Π΄ΠΈ
- Redshift: Distkey, Sortkey (ΠΏΡΠ΅ΠΏΠ»Π΅ΡΠ΅Π½ΠΎ, ΡΠ»ΠΎΠΆΠ΅Π½ΠΎ), Late Binding Views
- Π³ΠΎΠ»Π΅ΠΌΠΎ ΠΏΡΠ°ΡΠ°ΡΠ΅: ΠΠΎΠ΄Π΅Π»Π±Π° ΠΈ Π³ΡΡΠΏΠΈΡΠ°ΡΠ΅ ΡΠ°Π±Π΅Π»ΠΈ, ΠΎΠ΄Π½Π΅ΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΏΠΎΡΡΠ²Π°ΡΠ΅, ΡΠΈΡΡΠΈΡΠ°ΡΠ΅ KMS, Π΅ΡΠΈΠΊΠ΅ΡΠΈ ΠΈ ΠΎΠ·Π½Π°ΠΊΠΈ
- Π‘Π²Π΅ΡΠΈ: Π€ΠΎΡΠΌΠ°Ρ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° (parquet, csv, json, orc, delta), partition_by, clustered_by, buckets, incremental_strategy
ΠΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ² ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΠΆΠ°Π½ΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ°:
- ΠΠΎΡΡΠ³ΡΠ΅Ρ
- Redshift
- Π³ΠΎΠ»Π΅ΠΌΠΎ ΠΏΡΠ°ΡΠ°ΡΠ΅
- Π‘Π½Π΅Π³ΡΠ»ΠΊΠ°
- ΠΡΠ΅ΡΡΠΎ (Π΄Π΅Π»ΡΠΌΠ½ΠΎ)
- ΠΡΠΊΡΠ° (Π΄Π΅Π»ΡΠΌΠ½ΠΎ)
- Microsoft SQL Server (Π°Π΄Π°ΠΏΡΠ΅Ρ Π½Π° Π·Π°Π΅Π΄Π½ΠΈΡΠ°ΡΠ°)
ΠΡΠ΄Π΅ Π΄Π° Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈΠΌΠ΅ Π½Π°ΡΠΈΠΎΡ ΠΌΠΎΠ΄Π΅Π»:
- ΠΠ° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΠΏΠΎΠ»Π½Π΅ΡΠ΅ ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅ΡΠ½ΠΎ (ΠΠΎΡΠ°ΡΠ½ΠΎ)
- ΠΡΠ΄Π΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ ΠΊΠΎΠΏΡΠΈΡΠ° Π·Π° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° ΠΈ ΡΠΎΡΡΠΈΡΠ°ΡΠ΅ Π·Π° 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 Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ Π½Π° ΠΏΡΠ΅ΡΠΏΠΎΡΡΠ°Π²ΠΊΠΈ (ΡΠ²ΡΠ΄Π΅ΡΠ°) Π·Π° Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈΠΎΡ ΡΠ΅Ρ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅:
- ΠΠ΅ ΠΡΠ»ΡΠ°
- Π£Π½ΠΈΠΊΠ°ΡΠ½ΠΈ ΠΠ»Π°Π½ΠΎΠ²ΠΈ
- Π Π΅ΡΠ΅ΡΠ΅Π½ΡΠ΅Π½ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ΅Ρ - ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ΅Π½ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ΅Ρ (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, customer_id Π²ΠΎ ΡΠ°Π±Π΅Π»Π°ΡΠ° ΡΠΎ Π½Π°ΡΠ°ΡΠΊΠΈ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ° Π½Π° id Π²ΠΎ ΡΠ°Π±Π΅Π»Π°ΡΠ° Π·Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ)
- Π£ΡΠΎΠ³Π»Π°ΡΡΠ²Π°ΡΠ΅ Π½Π° Π»ΠΈΡΡΠ°ΡΠ° Π½Π° ΠΏΡΠΈΡΠ°ΡΠ»ΠΈΠ²ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ
ΠΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΡΠ²ΠΎΠΈ ΡΠ΅ΡΡΠΎΠ²ΠΈ (ΠΏΡΠΈΠ»Π°Π³ΠΎΠ΄Π΅Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ), ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, % ΠΎΡΡΡΠ°ΠΏΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΠ΅ ΡΠΎ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡΠΈ ΠΎΠ΄ ΠΏΡΠ΅Π΄ Π΅Π΄Π΅Π½ Π΄Π΅Π½, Π΅Π΄Π½Π° Π½Π΅Π΄Π΅Π»Π°, Π΅Π΄Π΅Π½ ΠΌΠ΅ΡΠ΅Ρ. Π‘Π΅ΠΊΠΎΡΠ° ΠΏΡΠ΅ΡΠΏΠΎΡΡΠ°Π²ΠΊΠ° ΡΠΎΡΠΌΡΠ»ΠΈΡΠ°Π½Π° ΠΊΠ°ΠΊΠΎ SQL Π±Π°ΡΠ°ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ°Π½Π΅ ΡΠ΅ΡΡ.
ΠΠ° ΠΎΠ²ΠΎΡ Π½Π°ΡΠΈΠ½, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ ΡΠ°ΡΠΈΡΠ΅ Π½Π΅ΡΠ°ΠΊΠ°Π½ΠΈΡΠ΅ ΠΎΡΡΡΠ°ΠΏΡΠ²Π°ΡΠ° ΠΈ Π³ΡΠ΅ΡΠΊΠΈ Π²ΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ Π²ΠΎ ΠΏΡΠΎΠ·ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΠ°Π³Π°ΡΠΈΠ½.
ΠΠΎ ΠΎΠ΄Π½ΠΎΡ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ°, 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']
Π Π΅Π²Π΅ ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΎΠ²Π°Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π°ΡΠ° Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ°:
ΠΠ°ΠΊΡΠΎΠ° ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ
Π¦Π΅Π»ΡΠ° Π½Π° 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 Π΄ΠΎΠ°ΡΠ° ΡΠΎ ΠΌΠ΅Π½Π°ΡΠ΅Ρ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΊΠΎΡ ΠΈΠΌ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈΡΠ΅ Π΄Π° ΠΎΠ±ΡΠ°Π²ΡΠ²Π°Π°Ρ ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π΄Π° ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅ΡΠ½ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΈ ΠΌΠ°ΠΊΡΠΎΠ°.
ΠΠ²Π° Π·Π½Π°ΡΠΈ ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠ΅ Π²ΡΠΈΡΠ°Π°Ρ ΠΈ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅:
dbt_utils : ΡΠ°Π±ΠΎΡΠ° ΡΠΎ Date/Time, Surrogate Keys, Schema ΡΠ΅ΡΡΠΎΠ²ΠΈ, Pivot/Unpivot ΠΈ Π΄ΡΡΠ³ΠΈ- ΠΠΎΡΠΎΠ²ΠΈ Π²ΠΈΡΡΠΈΠ½ΡΠΊΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΈ Π·Π° ΡΡΠ»ΡΠ³ΠΈ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅
Π§ΠΈΡΡΠ°Ρ Π½Π° ΡΠ½Π΅Π³ ΠΈΠΠ΅Π½ΡΠ° - ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ΄Π°Π²Π½ΠΈΡΠΈ Π·Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, Π½Π° ΠΏΡ.
Redshift ΠΠ»Π΅Π·ΠΈ β ΠΠΎΠ΄ΡΠ» Π·Π° Π»ΠΎΠ³ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠ° 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, ΡΠ΅ΡΡ, ΡΠΈ Π·Π΅ΠΌΠ°ΡΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΠ°ΠΌΠΎ Π·Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ 3 Π΄Π΅Π½Π° ΠΈ Π½Π΅ ΠΏΠΎΠ²Π΅ΡΠ΅. ΠΠ΄Π½ΠΎΡΠ½ΠΎ, ΡΡΡΠ°ΡΠ΅ΡΠΎ Π²ΠΎ ΠΎΠ²ΠΈΠ΅ ΡΡΠ΅Π΄ΠΈΠ½ΠΈ ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠ±ΡΠ·ΠΎ ΠΈ ΡΠ΅ Π±Π°ΡΠ° ΠΏΠΎΠΌΠ°Π»ΠΊΡ ΡΠ΅ΡΡΡΡΠΈ. ΠΠΎΠ³Π° ΡΠ°Π±ΠΎΡΠΈ Π½Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π° prod ΡΠΎΡΡΠΎΡΠ±Π°ΡΠ° Π½Π° ΡΠΈΠ»ΡΠ΅ΡΠΎΡ ΡΠ΅ ΡΠ΅ ΠΈΠ³Π½ΠΎΡΠΈΡΠ°.
ΠΠ°ΡΠ΅ΡΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ° ΡΠΎ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΠΎ ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈ
Redshift Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΎΠ±ΡΠ°Π·Π΅Π½ DBMS ΠΊΠΎΡ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ Π·Π° ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° ΡΠ΅ΠΊΠΎΡΠ° ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅ΡΠ½Π° ΠΊΠΎΠ»ΠΎΠ½Π°. ΠΠ·Π±ΠΎΡΠΎΡ Π½Π° ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ°Π»ΠΈ ΠΏΡΠΎΡΡΠΎΡΠΎΡ Π½Π° Π΄ΠΈΡΠΊΠΎΡ Π·Π° 20-50%.
ΠΠ°ΠΊΡΠΎ
ΠΠ°ΠΊΡΠΎ ΠΏΠΎΡΠΏΠΈΡ:
{{ 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() }}"
ΠΠΎΠ΄ΡΠ»ΠΎΡ Π·Π° Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ° ΡΠ΅ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π΄Π° Π³ΠΈ ΡΠ½ΠΈΠΌΠΈΡΠ΅ ΡΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ ΠΌΠ΅ΡΠ°ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π²ΠΎ ΠΏΠΎΡΠ΅Π±Π½Π° ΡΠ°Π±Π΅Π»Π°, ΠΊΠΎΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΡΠ΅Π²ΠΈΠ·ΠΈΡΠ° ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΡΠ΅ΡΠ½ΠΈΡΠ΅ Π³ΡΠ»Π°.
ΠΠ°ΠΊΠ° ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π½Π°ΡΠ° ΡΠ°Π±Π»Π° Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ Π·Π° Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ° Π²ΠΎ Looker:
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° ΠΎΠ΄ΡΠΆΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ
ΠΠΊΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Π½Π΅ΠΊΠΎΠΈ Π΅ΠΊΡΡΠ΅Π½Π·ΠΈΠΈ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΠ° Π½Π° ΠΊΠΎΡΠΈΡΡΠ΅Π½ΠΎΡΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π΅ UDF (Π€ΡΠ½ΠΊΡΠΈΠΈ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΠΎΠ΄ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ), ΡΠΎΠ³Π°Ρ Π²Π΅ΡΠ·ΠΈΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° ΠΎΠ²ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠ½ΡΡΠΎΠ»Π°ΡΠ° Π½Π° ΠΏΡΠΈΡΡΠ°ΠΏΠΎΡ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΎΡΠΎ ΠΏΡΡΡΠ°ΡΠ΅ Π½ΠΎΠ²ΠΈ ΠΈΠ·Π΄Π°Π½ΠΈΡΠ° Π΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ Π·Π° ΠΏΡΠ°Π²Π΅ΡΠ΅ Π²ΠΎ DBT.
ΠΠΈΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ UDF Π²ΠΎ Python Π·Π° Π΄Π° ΠΏΡΠ΅ΡΠΌΠ΅ΡΠ°ΠΌΠ΅ Ρ Π°ΡΠΎΠ²ΠΈ, Π΄ΠΎΠΌΠ΅Π½ΠΈ Π·Π° Π΅-ΠΏΠΎΡΡΠ° ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅ Π½Π° Π±ΠΈΡΠΌΠ°ΡΠΊΠΈ.
ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΠΌΠ°ΠΊΡΠΎ ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π²Π° UDF Π½Π° ΠΊΠΎΡΠ° Π±ΠΈΠ»ΠΎ ΡΡΠ΅Π΄ΠΈΠ½Π° Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ (dev, ΡΠ΅ΡΡ, ΠΏΡΠΎΠ΄):
{% 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
ΠΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ DBT ΠΊΠ°ΠΊΠΎ ΡΡΠ»ΡΠ³Π° (Π£ΠΏΡΠ°Π²ΡΠ²Π°Π½Π° ΡΡΠ»ΡΠ³Π°). ΠΠΊΠ»ΡΡΠ΅Π½ΠΎ:
- Web IDE Π·Π° ΡΠ°Π·Π²ΠΎΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
- ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΠΈ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ Π½Π° ΡΠ°Π±ΠΎΡΠ°
- ΠΠ΄Π½ΠΎΡΡΠ°Π²Π΅Π½ ΠΈ ΡΠ΄ΠΎΠ±Π΅Π½ ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ Π΄Π½Π΅Π²Π½ΠΈΡΠΈΡΠ΅
- ΠΠ΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ° ΡΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π·Π° Π²Π°ΡΠΈΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ
- ΠΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅ CI (ΠΊΠΎΠ½ΡΠΈΠ½ΡΠΈΡΠ°Π½Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ°)
ΠΠ°ΠΊΠ»ΡΡΠΎΠΊ
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°ΡΠ° ΠΈ ΠΊΠΎΠ½ΡΡΠΌΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° DWH ΡΡΠ°Π½ΡΠ²Π° ΠΈΡΡΠΎ ΡΠΎΠ»ΠΊΡ ΠΏΡΠΈΡΠ°ΡΠ½ΠΎ ΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΎ ΠΊΠ°ΠΊΠΎ ΠΈ ΠΏΠΈΠ΅ΡΠ΅ΡΠΎ ΡΠΌΡΡΠΈ. DBT ΡΠ΅ ΡΠΎΡΡΠΎΠΈ ΠΎΠ΄ Jinja, ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ Π΅ΠΊΡΡΠ΅Π½Π·ΠΈΠΈ (ΠΌΠΎΠ΄ΡΠ»ΠΈ), ΠΊΠΎΠΌΠΏΠ°ΡΠ»Π΅Ρ, ΠΈΠ·Π²ΡΡΠΈΡΠ΅Π» ΠΈ ΠΌΠ΅Π½Π°ΡΠ΅Ρ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ. Π‘ΠΎ ΡΠΏΠΎΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΎΠ²ΠΈΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π΄ΠΎΠ±ΠΈΠ²Π°ΡΠ΅ ΡΠ΅Π»ΠΎΡΠ½Π° ΡΠ°Π±ΠΎΡΠ½Π° ΡΡΠ΅Π΄ΠΈΠ½Π° Π·Π° Π²Π°ΡΠΈΠΎΡ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠ΄Π²Π°Ρ ΠΈΠΌΠ° ΠΏΠΎΠ΄ΠΎΠ±Π°Ρ Π½Π°ΡΠΈΠ½ Π·Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠ° Π²ΠΎ ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° DWH Π΄Π΅Π½Π΅Ρ.
ΠΠ΅ΡΡΠ²Π°ΡΠ°ΡΠ° ΡΡΠΎ Π³ΠΈ ΡΠ»Π΅Π΄Π°Ρ ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΈΡΠ΅ Π½Π° DBT ΡΠ΅ ΡΠΎΡΠΌΡΠ»ΠΈΡΠ°Π½ΠΈ Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΠΎΠ² Π½Π°ΡΠΈΠ½:
- ΠΠΎΠ΄ΠΎΡ, Π° Π½Π΅ GUI, Π΅ Π½Π°ΡΠ΄ΠΎΠ±ΡΠ°ΡΠ° Π°ΠΏΡΡΡΠ°ΠΊΡΠΈΡΠ° Π·Π° ΠΈΠ·ΡΠ°Π·ΡΠ²Π°ΡΠ΅ ΡΠ»ΠΎΠΆΠ΅Π½Π° Π°Π½Π°Π»ΠΈΡΠΈΡΠΊΠ° Π»ΠΎΠ³ΠΈΠΊΠ°
- Π Π°Π±ΠΎΡΠ°ΡΠ° ΡΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΈ ΠΏΡΠΈΡΠΏΠΎΡΠΎΠ±ΠΈ Π½Π°ΡΠ΄ΠΎΠ±ΡΠΈΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π²ΠΎ ΡΠΎΡΡΠ²Π΅ΡΡΠΊΠΎΡΠΎ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΡΡΠ²ΠΎ (Π‘ΠΎΡΡΠ²Π΅ΡΡΠΊΠΎ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΡΡΠ²ΠΎ)
- ΠΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° ΠΊΡΠΈΡΠΈΡΠ½ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΡΠ΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½Π° ΠΎΠ΄ Π·Π°Π΅Π΄Π½ΠΈΡΠ°ΡΠ° Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈ ΠΊΠ°ΠΊΠΎ ΡΠΎΡΡΠ²Π΅Ρ ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄
- ΠΠ΅ ΡΠ°ΠΌΠΎ Π°Π»Π°ΡΠΊΠΈΡΠ΅ Π·Π° Π°Π½Π°Π»ΠΈΠ·Π°, ΡΡΠΊΡ ΠΈ ΠΊΠΎΠ΄ΠΎΡ ΡΓ¨ ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΠ΅ ΡΡΠ°Π½Π°Ρ ΡΠΎΠΏΡΡΠ²Π΅Π½ΠΎΡΡ Π½Π° Π·Π°Π΅Π΄Π½ΠΈΡΠ°ΡΠ° ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄
ΠΠ²ΠΈΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Π²Π΅ΡΡΠ²Π°ΡΠ° ΡΠΎΠ·Π΄Π°Π΄ΠΎΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ ΡΡΠΎ Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΏΡΠ΅ΠΊΡ 850 ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π΄Π΅Π½Π΅Ρ, ΠΈ ΡΠΈΠ΅ ΡΠ° ΡΠΎΡΠΌΠΈΡΠ°Π°Ρ ΠΎΡΠ½ΠΎΠ²Π°ΡΠ° Π½Π° ΠΌΠ½ΠΎΠ³Ρ Π²ΠΎΠ·Π±ΡΠ΄Π»ΠΈΠ²ΠΈ Π΅ΠΊΡΡΠ΅Π½Π·ΠΈΠΈ ΡΡΠΎ ΡΠ΅ Π±ΠΈΠ΄Π°Ρ ΡΠΎΠ·Π΄Π°Π΄Π΅Π½ΠΈ Π²ΠΎ ΠΈΠ΄Π½ΠΈΠ½Π°.
ΠΠ° Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΈΠΌΠ° Π²ΠΈΠ΄Π΅ΠΎ ΠΎΠ΄ ΠΎΡΠ²ΠΎΡΠ΅Π½Π° Π»Π΅ΠΊΡΠΈΡΠ° ΠΊΠΎΡΠ° ΡΠ° ΠΎΠ΄ΡΠΆΠ°Π² ΠΏΡΠ΅Π΄ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΌΠ΅ΡΠ΅ΡΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π΅Π» ΠΎΠ΄ ΠΎΡΠ²ΠΎΡΠ΅Π½Π° Π»Π΅ΠΊΡΠΈΡΠ° Π²ΠΎ ΠΠ’Π£Π‘ -
ΠΠΎΠΊΡΠ°Ρ DBT ΠΈ Data Warehousing, ΠΊΠ°ΠΊΠΎ Π΄Π΅Π» ΠΎΠ΄ ΠΊΡΡΡΠΎΡ Data Engineer Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° OTUS, ΡΠ°Ρ ΠΈ ΠΌΠΎΠΈΡΠ΅ ΠΊΠΎΠ»Π΅Π³ΠΈ ΠΎΠ΄ΡΠΆΡΠ²Π°ΠΌΠ΅ ΡΠ°ΡΠΎΠ²ΠΈ Π½Π° Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ Π΄ΡΡΠ³ΠΈ ΡΠ΅Π»Π΅Π²Π°Π½ΡΠ½ΠΈ ΠΈ ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈ ΡΠ΅ΠΌΠΈ:
- ΠΡΡ ΠΈΡΠ΅ΠΊΡΠΎΠ½ΡΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈ Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π·Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ
- ΠΠ΅ΠΆΠ±Π°ΡΡΠ΅ ΡΠΎ Spark ΠΈ Spark Streaming
- ΠΡΡΡΠ°ΠΆΡΠ²Π°ΡΠ΅ Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΈ Π°Π»Π°ΡΠΊΠΈ Π·Π° Π²ΡΠΈΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΈΠ·Π²ΠΎΡΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ
- ΠΠ·Π³ΡΠ°Π΄Π±Π° Π½Π° Π°Π½Π°Π»ΠΈΡΠΈΡΠΊΠΈ Π²ΠΈΡΡΠΈΠ½ΠΈ Π²ΠΎ DWH
- NoSQL ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈ: HBase, Cassandra, ElasticSearch
- ΠΡΠΈΠ½ΡΠΈΠΏΠΈ Π½Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΡΠ°
- ΠΠ°Π²ΡΡΠ΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ: Π·Π΄ΡΡΠΆΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠ½ΠΈ ΠΏΠΎΠ΄ ΠΌΠ΅Π½ΡΠΎΡΡΠΊΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΊΠ°
Π Π΅ΡΠ΅ΡΠ΅Π½ΡΠΈ:
DBT Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° - ΠΠΎΠ²Π΅Π΄ β ΠΡΠΈΡΠΈΡΠ°Π»Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°Π¨ΡΠΎ ΡΠΎΡΠ½ΠΎ Π΅ dbt? - ΠΡΠ΅Π³Π»Π΅Π΄Π°ΡΡΠ΅ ΡΠ° ΡΡΠ°ΡΠΈΡΠ°ΡΠ° ΠΎΠ΄ Π΅Π΄Π΅Π½ ΠΎΠ΄ Π°Π²ΡΠΎΡΠΈΡΠ΅ Π½Π° DBTΠΠ»Π°ΡΠΊΠ° Π·Π° Π³ΡΠ°Π΄Π΅ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π½Π° Amazon Redshift β YouTube, Π‘Π½ΠΈΠΌΠ°ΡΠ΅ Π½Π° ΠΎΡΠ²ΠΎΡΠ΅Π½Π° Π»Π΅ΠΊΡΠΈΡΠ° OTUSΠΠ°ΠΏΠΎΠ·Π½Π°Π²Π°ΡΠ΅ ΡΠΎ ΠΡΠΈΠ½ΠΏΠ»ΡΠΌ β Π‘Π»Π΅Π΄Π½Π°ΡΠ° ΠΎΡΠ²ΠΎΡΠ΅Π½Π° Π»Π΅ΠΊΡΠΈΡΠ° Π΅ 15 ΠΌΠ°Ρ 2020 Π³ΠΎΠ΄ΠΈΠ½Π°ΠΡΡΡ Π·Π° ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΡΡΠ²ΠΎ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ - ΠΠ’Π£Π‘ΠΡΠ°Π΄Π΅ΡΠ΅ ΡΠ°Π±ΠΎΡΠ΅Π½ ΡΠ΅ΠΊ Π½Π° Π·ΡΠ΅Π»ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈ - ΠΠΎΠ³Π»Π΅Π΄ Π½Π° ΠΈΠ΄Π½ΠΈΠ½Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠ°ΠΡΠ΅ΠΌΠ΅ Π΅ Π·Π° Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ° ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ β ΠΠ²ΠΎΠ»ΡΡΠΈΡΠ°ΡΠ° Π½Π° Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠ° ΠΈ Π²Π»ΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΈΠΎΡ ΠΊΠΎΠ΄ΠΠΎΠ½ΡΠΈΠ½ΡΠΈΡΠ°Π½Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ° ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΎ ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ Π·Π° Π³ΡΠ°Π΄Π΅ΡΠ΅ ΡΠΎ dbtCloud β ΠΡΠΈΠ½ΡΠΈΠΏΠΈ Π½Π° Π³ΡΠ°Π΄Π΅ΡΠ΅ CI ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ DBTΠΠ°ΠΏΠΎΡΠ½ΡΠ²Π°ΠΌΠ΅ ΡΠΎ ΡΠΏΠ°ΡΡΡΠ²ΠΎ Π·Π° DBT β ΠΠ΅ΠΆΠ±Π°, ΡΠ΅ΠΊΠΎΡ-ΠΏΠΎ-ΡΠ΅ΠΊΠΎΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π° ΡΠ°ΠΌΠΎΡΡΠΎΡΠ½Π° ΡΠ°Π±ΠΎΡΠ°Jaffle shop β Π£ΠΏΠ°ΡΡΡΠ²ΠΎ Π·Π° Github DBT β Github, ΠΊΠΎΠ΄ Π·Π° Π΅Π΄ΡΠΊΠ°ΡΠΈΠ²Π΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ
ΠΠ·Π²ΠΎΡ: www.habr.com