ΠΠ° ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ Π΅ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ ΠΈΠ΄Π΅Π°Π»Π½ΠΈΡΡ Data Warehouse?
Π€ΠΎΠΊΡΡΠΈΡΠ°ΠΉΡΠ΅ ΡΠ΅ Π²ΡΡΡ Ρ Π±ΠΈΠ·Π½Π΅Ρ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ΅ ΠΏΡΠΈ Π»ΠΈΠΏΡΠ°ΡΠ° Π½Π° ΡΠ°Π±Π»ΠΎΠ½Π΅Π½ ΠΊΠΎΠ΄. Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° DWH ΠΊΠ°ΡΠΎ ΠΊΠΎΠ΄ΠΎΠ²Π° Π±Π°Π·Π°: Π²Π΅ΡΡΠΈΠΈ, ΠΏΡΠ΅Π³Π»Π΅Π΄, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅ ΠΈ CI. ΠΠΎΠ΄ΡΠ»Π½ΠΎΡΡ, ΡΠ°Π·ΡΠΈΡΡΠ΅ΠΌΠΎΡΡ, ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ ΠΈ ΠΎΠ±ΡΠ½ΠΎΡΡ. Π£Π΄ΠΎΠ±Π½Π° Π·Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ (Data Lineage).
ΠΠ° Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΈ Π·Π° ΡΠΎΠ»ΡΡΠ° Π½Π° DBT Π² Π΅ΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Big Data & Analytics β Π΄ΠΎΠ±ΡΠ΅ Π΄ΠΎΡΠ»ΠΈ ΠΏΠΎΠ΄ ΠΊΠ°Ρ.
ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅
ΠΡΡΠ΅ΠΌΠΈ ΠΠΎΠ·ΠΈΡ Π΅ Π²ΡΠ² Π²ΡΡΠ·ΠΊΠ°. ΠΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 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 ΠΊΠΎΠ΄ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π² ΡΠΊΠ°Π·Π°Π½Π°ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ (Π³ΡΠ°ΡΠΈΠΊΠ°)
ΠΡΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΎΡ 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'] %}
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 ΠΈ Π΅Π·ΠΈΠΊ
ΠΡΠΈΠΌΠ΅ΡΡΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠΈΠΊΡΠ» Π·Π° Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠΌΠ°ΡΠ° Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π½Π° ΠΏΠ»Π°ΡΠ°Π½Π΅, ΠΏΠΎΡΠΎΡΠ΅Π½ Π² ΠΈΠ·ΡΠ°Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½. ΠΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ ΠΈ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Ref - Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΡΠ΅ΠΏΡΠ°ΡΠ°Π½Π΅ Π² ΠΊΠΎΠ΄Π° ΠΊΡΠΌ Π΄ΡΡΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ:
- ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Ref ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ΠΈ Π² ΡΠ΅Π»Π΅Π²ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π» ΠΊΡΠΌ ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΠ»ΠΈ ΠΈΠ·Π³Π»Π΅Π΄ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ
- Ref Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΡΠ΅ Π³ΡΠ°ΡΠΈΠΊΠ° Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ
Π’ΠΎΡΠ½ΠΎ
- If / else ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ - ΡΠ°Π·ΠΊΠ»ΠΎΠ½ΠΈΡΠ΅Π»Π½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ
- Π·Π° Π±ΡΠΈΠΌΠΊΠΈ - Π±ΡΠΈΠΌΠΊΠΈ
- ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
- ΠΠ°ΠΊΡΠΎ - ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΌΠ°ΠΊΡΠΎΡΠΈ
ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ: Π’Π°Π±Π»ΠΈΡΠ°, ΠΠ·Π³Π»Π΅Π΄, ΠΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ
Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡΡΠ° Π·Π° ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΡΠΏΠΎΡΠ΅Π΄ ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡΡ Π½Π°Π±ΠΎΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° ΡΠ΅ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ.
Π ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Π»ΠΈΠ½ΠΈΠΈ ΡΠΎΠ²Π° Π΅:
- Π’Π°Π±Π»ΠΈΡΠ° - ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠ° ΡΠ°Π±Π»ΠΈΡΠ° Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ
- View - ΠΈΠ·Π³Π»Π΅Π΄, Π²ΠΈΡΡΡΠ°Π»Π½Π° ΡΠ°Π±Π»ΠΈΡΠ° Π² Storage
ΠΠΌΠ° ΠΈ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΈ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ Π·Π° ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅:
- Incremental - ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ (Π³ΠΎΠ»Π΅ΠΌΠΈ ΡΠ°ΠΊΡΠΎΠ»ΠΎΠ³ΠΈΡΠ½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ); Π½ΠΎΠ²ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΡΡ, ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈΡΠ΅ ΡΠ΅ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ, ΠΈΠ·ΡΡΠΈΡΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·ΡΠΈΡΡΠ²Π°Ρ
- ΠΡΠ΅ΠΌΠ΅ΡΠ΅Π½ β ΠΌΠΎΠ΄Π΅Π»ΡΡ Π½Π΅ ΡΠ΅ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ, Π° ΡΡΠ°ΡΡΠ²Π° ΠΊΠ°ΡΠΎ CTE Π² Π΄ΡΡΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
- ΠΡΠΈΡΠΊΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΡΠ°ΠΌΠΈ
Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈΡΠ΅ Π·Π° ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅, ΠΈΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π·Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
- Π‘Π½Π΅ΠΆΠΈΠ½ΠΊΠ°: ΠΡΠ΅Ρ ΠΎΠ΄Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ, ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΡΠ»ΠΈΠ²Π°Π½Π΅, ΠΊΠ»ΡΡΡΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ, Π±Π΅Π·Π²ΡΠ·ΠΌΠ΅Π·Π΄Π½ΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π° Π·Π° ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅, Π·Π°ΡΠΈΡΠ΅Π½ΠΈ ΠΈΠ·Π³Π»Π΅Π΄ΠΈ
- Redshift: Diskey, Sorkey (Ρ Π²ΠΌΡΠΊΠ²Π°Π½Π΅, ΡΡΡΡΠ°Π²Π΅Π½), Late Binding Views
- BigQuery: Π Π°Π·Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ ΠΈ Π³ΡΡΠΏΠΈΡΠ°Π½Π΅, ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΡΠ»ΠΈΠ²Π°Π½Π΅, KMS ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅, Π΅ΡΠΈΠΊΠ΅ΡΠΈ ΠΈ Π΅ΡΠΈΠΊΠ΅ΡΠΈ
- ΠΡΠΊΡΠ°: Π€Π°ΠΉΠ»ΠΎΠ² ΡΠΎΡΠΌΠ°Ρ (ΠΏΠ°ΡΠΊΠ΅Ρ, csv, json, orc, Π΄Π΅Π»ΡΠ°), partition_by, clustered_by, ΠΊΠΎΡΠΈ, incremental_strategy
Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°:
- Postgres
- Redshift
- BigQuery
- Π‘Π½Π΅ΠΆΠΈΠ½ΠΊΠ°
- ΠΡΠ΅ΡΡΠΎ (ΡΠ°ΡΡΠΈΡΠ½ΠΎ)
- ΠΡΠΊΡΠ° (ΡΠ°ΡΡΠΈΡΠ½Π°)
- 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 : ΡΠ°Π±ΠΎΡΠ° Ρ Π΄Π°ΡΠ°/ΡΠ°Ρ, ΡΡΡΠΎΠ³Π°ΡΠ½ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅, ΡΠ΅ΡΡΠΎΠ²Π΅ Π½Π° ΡΡ Π΅ΠΌΠΈ, Pivot/Unpivot ΠΈ Π΄ΡΡΠ³ΠΈ- ΠΠΎΡΠΎΠ²ΠΈ Π²ΠΈΡΡΠΈΠ½ΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΈ Π·Π° ΡΡΠ»ΡΠ³ΠΈ ΠΊΠ°ΡΠΎ
ΡΠ½Π΅Π³ΠΎΡΠΈΠ½ ΠΈΠΠ°ΡΠΈΠ²ΠΊΠ° - ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π·Π° Π΄Π°Π½Π½ΠΈ
Redshift ΠΠ»ΠΈΠ·Π°Π½Π΅ - ΠΠΎΠ΄ΡΠ» Π·Π° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° DBT
ΠΡΠ»Π΅Π½ ΡΠΏΠΈΡΡΠΊ Ρ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π°
ΠΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
Π’ΡΠΊ ΡΠ΅ ΠΎΠΏΠΈΡΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΄ΡΡΠ³ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ Π°Π· ΠΈ Π΅ΠΊΠΈΠΏΡΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Data Warehouse
Π Π°Π·Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΡΡΠ΅Π΄ΠΈΡΠ΅ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ 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 Π΄Π½ΠΈ ΠΈ Π½Π΅ ΠΏΠΎΠ²Π΅ΡΠ΅. Π’ΠΎΠ΅ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π² ΡΠ΅Π·ΠΈ ΡΡΠ΅Π΄ΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π±ΡΡΠ·Π° ΠΈ ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΡΠ΅ΡΡΡΡΠΈ. ΠΠΎΠ³Π°ΡΠΎ ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Π²ΡΡΡ Ρ ΠΎΠΊΠΎΠ»Π½Π°ΡΠ° ΡΡΠ΅Π΄Π° ΡΡΠ³Π°Π½Π΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΈΠ»ΡΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ³Π½ΠΎΡΠΈΡΠ°Π½ΠΎ.
ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Ρ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΠΎ ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈ
Redshift Π΅ ΠΊΠΎΠ»ΠΎΠ½Π½Π° Π‘Π£ΠΠ, ΠΊΠΎΡΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π·Π°Π΄Π°Π²Π°ΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ Π·Π° ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π·Π° Π²ΡΡΠΊΠ° ΠΎΡΠ΄Π΅Π»Π½Π° ΠΊΠΎΠ»ΠΎΠ½Π°. ΠΠ·Π±ΠΎΡΡΡ Π½Π° ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈ Π·Π°Π΅ΠΌΠ°Π½ΠΎΡΠΎ Π΄ΠΈΡΠΊΠΎΠ²ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Ρ 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.
ΠΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Python UDF Π·Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° Ρ Π΅Ρ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ, Π΄ΠΎΠΌΠ΅ΠΉΠ½ΠΈ Π½Π° ΠΈΠΌΠ΅ΠΉΠ» Π°Π΄ΡΠ΅ΡΠΈ, Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° Π±ΠΈΡΠΎΠ²Π° ΠΌΠ°ΡΠΊΠ°.
ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΠΌΠ°ΠΊΡΠΎΡ, ΠΊΠΎΠΉΡΠΎ ΡΡΠ·Π΄Π°Π²Π° 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 ΠΎΠ±Π»Π°ΠΊ
ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ DBT ΠΊΠ°ΡΠΎ ΡΡΠ»ΡΠ³Π° (Π£ΠΏΡΠ°Π²Π»ΡΠ²Π°Π½Π° ΡΡΠ»ΡΠ³Π°). ΠΠΊΠ»ΡΡΠ΅Π½ΠΎ:
- Web IDE Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
- ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π±ΠΎΡΠ° ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° Π³ΡΠ°ΡΠΈΠΊ
- ΠΠ΅ΡΠ΅Π½ ΠΈ ΡΠ΄ΠΎΠ±Π΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π΄Π½Π΅Π²Π½ΠΈΡΠΈ
- Π£Π΅Π± ΡΠ°ΠΉΡ Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ
- Π‘Π²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° CI (Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½Π΅)
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΠΈΠ³ΠΎΡΠ²ΡΠ½Π΅ΡΠΎ ΠΈ ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΈΡΡΠ° Π½Π° DWH ΡΡΠ°Π²Π° ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΡΠΈΡΡΠ½ΠΎ ΠΈ Π·Π΄ΡΠ°Π²ΠΎΡΠ»ΠΎΠ²Π½ΠΎ, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΏΠΈΠ΅Π½Π΅ΡΠΎ Π½Π° ΡΠΌΡΡΠΈ. DBT ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ Jinja, ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ (ΠΌΠΎΠ΄ΡΠ»ΠΈ), ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ, Π΄Π²ΠΈΠ³Π°ΡΠ΅Π» (ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅Π») ΠΈ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ. Π‘ΡΠ±ΠΈΡΠ°ΠΉΠΊΠΈ ΡΠ΅Π·ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π·Π°Π΅Π΄Π½ΠΎ, Π²ΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΡΠ΅ ΡΡΠ»ΠΎΡΡΠ½Π° ΡΠ°Π±ΠΎΡΠ½Π° ΡΡΠ΅Π΄Π° Π·Π° Π²Π°ΡΠΈΡ Data Warehouse. ΠΠ΄Π²Π° Π»ΠΈ ΠΈΠΌΠ° ΠΏΠΎ-Π΄ΠΎΠ±ΡΡ Π½Π°ΡΠΈΠ½ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈΡΠ΅ Π² DWH Π΄Π½Π΅Ρ.
Π£Π±Π΅ΠΆΠ΄Π΅Π½ΠΈΡΡΠ°, ΡΠ»Π΅Π΄Π²Π°Π½ΠΈ ΠΎΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° DBT, ΡΠ° ΡΠΎΡΠΌΡΠ»ΠΈΡΠ°Π½ΠΈ, ΠΊΠ°ΠΊΡΠΎ ΡΠ»Π΅Π΄Π²Π°:
- ΠΠΎΠ΄ΡΡ, Π° Π½Π΅ GUI, Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠ°ΡΠ° Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ Π·Π° ΠΈΠ·ΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ»ΠΎΠΆΠ½Π° Π°Π½Π°Π»ΠΈΡΠΈΡΠ½Π° Π»ΠΎΠ³ΠΈΠΊΠ°
- Π Π°Π±ΠΎΡΠ°ΡΠ° Ρ Π΄Π°Π½Π½ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π°Π΄Π°ΠΏΡΠΈΡΠ° Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π½Π° ΡΠΎΡΡΡΠ΅ΡΠ½ΠΎΡΠΎ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΡΡΠ²ΠΎ (Π‘ΠΎΡΡΡΠ΅ΡΠ½ΠΎ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΡΡΠ²ΠΎ)
- ΠΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Ρ ΠΊΡΠΈΡΠΈΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ° ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠ°ΡΠ° ΠΎΠ±ΡΠ½ΠΎΡΡ ΠΊΠ°ΡΠΎ ΡΠΎΡΡΡΠ΅Ρ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄
- ΠΠ΅ ΡΠ°ΠΌΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈΡΠ΅ Π·Π° Π°Π½Π°Π»ΠΈΠ·, Π½ΠΎ ΠΈ ΠΊΠΎΠ΄ΡΡ Π²ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΠ΅ ΡΡΠ°Π²Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΎΡΡ Π½Π° ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ° Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄
Π’Π΅Π·ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Π²ΡΡΠ²Π°Π½ΠΈΡ ΡΠ° Π΄ΠΎΠ²Π΅Π»ΠΈ Π΄ΠΎ ΠΏΡΠΎΠ΄ΡΠΊΡ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 850 ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π΄Π½Π΅Ρ, ΠΈ ΡΠ΅ ΡΠΎΡΠΌΠΈΡΠ°Ρ ΠΎΡΠ½ΠΎΠ²Π°ΡΠ° Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ»Π½ΡΠ²Π°ΡΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ Π² Π±ΡΠ΄Π΅ΡΠ΅.
ΠΠ° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°Ρ, ΠΈΠΌΠ° Π²ΠΈΠ΄Π΅ΠΎ Π·Π°ΠΏΠΈΡ Π½Π° ΠΎΡΠΊΡΠΈΡ ΡΡΠΎΠΊ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΎΠ²Π΅Π΄ΠΎΡ
ΠΏΡΠ΅Π΄ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ΅ΡΠ΅ΡΠ° ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ ΠΎΡΠΊΡΠΈΡ ΡΡΠΎΠΊ Π² OTUS -
Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ DBT ΠΈ Data Warehouses, ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ ΠΊΡΡΡΠ° Data Engineer Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° OTUS, ΠΌΠΎΠΈΡΠ΅ ΠΊΠΎΠ»Π΅Π³ΠΈ ΠΈ Π°Π· ΠΏΡΠΎΠ²Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΡΡΠΎΡΠΈ ΠΏΠΎ ΡΠ΅Π΄ΠΈΡΠ° Π΄ΡΡΠ³ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈ ΠΈ ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈ ΡΠ΅ΠΌΠΈ:
- ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ Π³ΠΎΠ»Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ
- Π£ΠΏΡΠ°ΠΆΠ½ΡΠ²Π°ΠΉΡΠ΅ ΡΠ΅ ΡΡΡ Spark ΠΈ Spark Streaming
- ΠΠ°ΡΡΠ°Π²Π°Π½Π΅ Π½Π° Π½Π°ΡΠΈΠ½ΠΈ ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ Π½Π° Π΄Π°Π½Π½ΠΈ
- ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΡΠΈΡΠ½ΠΈ Π²ΠΈΡΡΠΈΠ½ΠΈ Π² DWH
- NoSQL ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ: HBase, Cassandra, ElasticSearch
- ΠΡΠΈΠ½ΡΠΈΠΏΠΈ Π½Π° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΈ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΡΡΠ°
- ΠΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ: ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΠΌΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ ΠΌΠ΅Π½ΡΠΎΡΡΠΊΠ° ΠΏΠΎΠ΄ΠΊΡΠ΅ΠΏΠ°
Π·Π° ΡΠΏΡΠ°Π²ΠΊΠ°:
DBT Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ β ΠΡΠΈΡΠΈΠ°Π»Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΠ°ΠΊΠ²ΠΎ ΡΠΎΡΠ½ΠΎ Π΅ dbt? β Π Π΅ΡΠ΅Π½Π·ΠΈΡ Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΡ Π°Π²ΡΠΎΡΠΈΡΠ΅ Π½Π° DBTΠΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π·Π° Amazon Redshift Storage β YouTube, OTUS Open Lesson RecordingΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Greenplum β ΠΠ°ΠΉ-Π±Π»ΠΈΠ·ΠΊΠΈΡΡ ΠΎΡΠΊΡΠΈΡ ΡΡΠΎΠΊ Π΅ 15 ΠΌΠ°ΠΉ 2020 Π³ΠΡΡΡ ΠΏΠΎ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΡΡΠ²ΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ β ΠΠ’Π£Π‘ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π·ΡΡΠ» ΡΠ°Π±ΠΎΡΠ΅Π½ ΠΏΡΠΎΡΠ΅Ρ Π·Π° Π°Π½Π°Π»ΠΈΠ· β ΠΠΎΠ³Π»Π΅Π΄ ΠΊΡΠΌ Π±ΡΠ΄Π΅ΡΠ΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ΅ΠΡΠ΅ΠΌΠ΅ Π΅ Π·Π° Π°Π½Π°Π»ΠΈΠ·ΠΈ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ β ΠΠ²ΠΎΠ»ΡΡΠΈΡΡΠ° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ Π²ΡΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ Π½Π° ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ΄ΠΠ΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½Π΅ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Ρ dbtCloud β ΠΡΠΈΠ½ΡΠΈΠΏΠΈ Π½Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° CI Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° DBTΠΡΡΠ²ΠΈ ΡΡΡΠΏΠΊΠΈ Ρ ΡΡΠΎΠΊΠ° Π·Π° DBT β ΠΡΠ°ΠΊΡΠΈΠΊΠ°, ΠΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΡΡΡΠΏΠΊΠ° ΠΏΠΎ ΡΡΡΠΏΠΊΠ° Π·Π° ΡΠ°ΠΌΠΎΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ΠΌΠ°Π³Π°Π·ΠΈΠ½ Π·Π° jaffle - Π£ΡΠΎΠΊ Π·Π° Github DBT β Github, ΠΊΠΎΠ΄ Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π·Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com