ΠΠ° ΠΊΠ°ΠΊΠΈΡ
ΠΏΡΠΈΠ½ΡΠΈΠΏΠ°Ρ
ΡΡΡΠΎΠΈΡΡΡ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎΠ΅ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΠ°Π½Π½ΡΡ
?
Π€ΠΎΠΊΡΡ Π½Π° Π±ΠΈΠ·Π½Π΅Ρ-ΡΠ΅Π½Π½ΠΎΡΡΠΈ ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ΅ ΠΏΡΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ boilerplate code. Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ DWH ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·ΠΎΠΉ: Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΡΠ΅Π²ΡΡ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ CI. ΠΠΎΠ΄ΡΠ»ΡΠ½ΠΎΡΡΡ, ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌΠΎΡΡΡ, ΠΎΡΠΊΡΡΡΡΠΉ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΈ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎ. ΠΡΡΠΆΠ΅ΡΡΠ²Π΅Π½Π½Π°Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠ°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ (Data Lineage).
ΠΠ±ΠΎ Π²ΡΡΠΌ ΡΡΠΎΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΈ ΠΎ ΡΠΎΠ»ΠΈ DBT Π² ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ΅ Big Data & Analytics β Π΄ΠΎΠ±ΡΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ ΠΊΠ°Ρ.
ΠΡΠ΅ΠΌ ΠΏΡΠΈΠ²Π΅Ρ
ΠΠ° ΡΠ²ΡΠ·ΠΈ ΠΡΡΠ΅ΠΌΠΈΠΉ ΠΠΎΠ·ΡΡΡ. Π£ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ 5 Π»Π΅Ρ Ρ ΡΠ°Π±ΠΎΡΠ°Ρ Ρ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ
, Π·Π°Π½ΠΈΠΌΠ°ΡΡΡ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ΠΌ ETL/ELT, Π° ΡΠ°ΠΊΠΆΠ΅ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠΎΠΉ Π΄Π°Π½Π½ΡΡ
ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ. Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Ρ ΡΠ°Π±ΠΎΡΠ°Ρ Π²
ΠΡΠ°ΡΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ
Π€ΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ DBT β ΡΡΠΎ Π²ΡΡ ΠΎ Π±ΡΠΊΠ²Π΅ T Π² Π°ΠΊΡΠΎΠ½ΠΈΠΌΠ΅ ELT (Extract β Transform β Load).
Π‘ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠ°ΠΊΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΡΡ Π°Π½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ Π±Π°Π· Π΄Π°Π½Π½ΡΡ ΠΊΠ°ΠΊ BigQuery, Redshift, Snowflake, ΠΈΡΡΠ΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΡΠΌΡΡΠ» Π΄Π΅Π»Π°ΡΡ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π²Π½Π΅ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° ΠΠ°Π½Π½ΡΡ .Β
DBT Π½Π΅ Π²ΡΠ³ΡΡΠΆΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ², Π½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠ³ΡΠΎΠΌΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠ΅ΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΆΠ΅ Π·Π°Π³ΡΡΠΆΠ΅Π½Ρ Π² Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ (Π² Internal ΠΈΠ»ΠΈ External Storage).
ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 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 ΠΈ ΡΠ·ΡΠΊΠ°
Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ ΡΠΈΠΊΠ» for Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΌΠΌΡ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΏΠ»Π°ΡΠ΅ΠΆΠ°, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ Π² Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ set. Π’Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ref β Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΡΡΠ»Π°ΡΡΡΡ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ΄Π° Π½Π° Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ:
- ΠΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ref Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ Π² ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠ»ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π² Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅
- ref ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΡΡΡΠΎΠΈΡΡ Π³ΡΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ
ΠΠΌΠ΅Π½Π½ΠΎ
- If / else statements β ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΡ
- For loops β ΡΠΈΠΊΠ»Ρ
- Variables β ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅
- Macro β ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ²
ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ: Table, View, Incremental
Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ β ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ Π½Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π±ΡΠ΄Π΅Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ Π² Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅.
Π Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠΈ ΡΡΠΎ:
- Table β ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π² Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅
- View β ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π² Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅
ΠΡΡΡ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ:
- Incremental β ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ° (Π±ΠΎΠ»ΡΡΠΈΡ ΡΠ°Π±Π»ΠΈΡ ΡΠ°ΠΊΡΠΎΠ²); Π½ΠΎΠ²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΠ΅ β ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡΡΡ, ΡΠ΄Π°Π»Π΅Π½Π½ΡΠ΅ β Π²ΡΡΠΈΡΠ°ΡΡΡΡΒ
- Ephemeral β ΠΌΠΎΠ΄Π΅Π»Ρ Π½Π΅ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π½Π°ΠΏΡΡΠΌΡΡ, Π½ΠΎ ΡΡΠ°ΡΡΠ²ΡΠ΅Ρ ΠΊΠ°ΠΊ CTE Π² Π΄ΡΡΠ³ΠΈΡ ΠΌΠΎΠ΄Π΅Π»ΡΡ
- ΠΡΠ±ΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ
ΠΠ΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΊ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡΠΌ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡΠΊΡΡΠ²Π°ΡΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
- Snowflake: Transient tables, Merge behavior, Table clustering, Copying grants, Secure views
- Redshift: Distkey, Sortkey (interleaved, compound), Late Binding Views
- BigQuery: Table partitioning & clustering, Merge behavior, KMS Encryption, Labels & Tags
- Spark: File format (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: 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 (Don’t Repeat Yourself).
ΠΡΠΈΠΌΠ΅Ρ ΠΌΠ°ΠΊΡΠΎΡΠ°:
{% 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_utils : ΡΠ°Π±ΠΎΡΠ° Ρ Date/Time,Surrogate Keys, Schema tests, Pivot/Unpivot ΠΈ Π΄ΡΡΠ³ΠΈΠ΅- ΠΠΎΡΠΎΠ²ΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½Ρ Π²ΠΈΡΡΠΈΠ½ Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ
ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΊΠ°ΠΊ
Snowplow ΠΈStripe Β - ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ
Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡ ΠΠ°Π½Π½ΡΡ
, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ
Redshift Β Logging β ΠΠΎΠ΄ΡΠ»Ρ Π΄Π»Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ 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%.
ΠΠ°ΠΊΡΠΎΡ
Π‘ΠΈΠ³Π½Π°ΡΡΡΠ° ΠΌΠ°ΠΊΡΠΎΡΠ°:
{{ 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) }}
ΠΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠΊΠΎΠ² ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ
ΠΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Π΅ΡΠΈΡΡ Ρ ΡΠΊΠΈ (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)
- ΠΠ°ΠΆΠ½Π΅ΠΉΡΠ°Ρ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΊΠ°ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΎΡΠΊΡΡΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ
- ΠΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠΈ, Π½ΠΎ ΠΈ ΠΊΠΎΠ΄ Π²ΡΠ΅ ΡΠ°ΡΠ΅ Π±ΡΠ΄Π΅Ρ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡΡ Π΄ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π° Open Source
ΠΡΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΠ±Π΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠ΄ΠΈΠ»ΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ 850 ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡ , ΠΈ ΠΎΠ½ΠΈ ΡΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΎΡΠ½ΠΎΠ²Ρ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠΎΠ·Π΄Π°Π½Ρ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ.
ΠΠ»Ρ ΡΠ΅Ρ
, ΠΊΡΠΎ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π»ΡΡ, Π΅ΡΡΡ Π²ΠΈΠ΄Π΅ΠΎΠ·Π°ΠΏΠΈΡΡ ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΡΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΏΡΠΎΠ²Π΅Π» Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΡΡΠ΅Π² Π½Π°Π·Π°Π΄ Π² ΡΠ°ΠΌΠΊΠ°Ρ
ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΡΡΠΎΠΊΠ° Π² OTUS β
ΠΠΎΠΌΠΈΠΌΠΎ DBT ΠΈ Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡ ΠΠ°Π½Π½ΡΡ , Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΊΡΡΡΠ° Data Engineer Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅ OTUS, Ρ ΠΈ ΠΌΠΎΠΈ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ Π²Π΅Π΄Π΅ΠΌ Π·Π°Π½ΡΡΠΈΡ ΠΏΠΎ ΡΡΠ΄Ρ Π΄ΡΡΠ³ΠΈΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΡ ΠΈ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ΅ΠΌ:
- ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΠΎΠ»ΡΡΠΈΡ ΠΠ°Π½Π½ΡΡ
- ΠΡΠ°ΠΊΡΠΈΠΊΠ° ΡΠΎ Spark ΠΈ Spark Streaming
- ΠΠ·ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² Π΄Π°Π½Π½ΡΡ
- ΠΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ Π²ΠΈΡΡΠΈΠ½ Π² DWH
- ΠΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ NoSQL: HBase, Cassandra, ElasticSearch
- ΠΡΠΈΠ½ΡΠΈΠΏΡ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΈ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΠΈΒ
- Π€ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΡΠΎΠ΅ΠΊΡ: ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌ Π²ΡΠ΅ ΡΠΊΠΈΠ»Π»Ρ Π²ΠΎΠ΅Π΄ΠΈΠ½ΠΎ ΠΏΠΎΠ΄ ΠΌΠ΅Π½ΡΠΎΡΡΠΊΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ
Π‘ΡΡΠ»ΠΊΠΈ:
DBT documentation β Introduction β ΠΡΠΈΡΠΈΠ°Π»ΡΠ½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡWhat, exactly, is dbt? β ΠΠ±Π·ΠΎΡΠ½Π°Ρ ΡΡΠ°ΡΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π°Π²ΡΠΎΡΠΎΠ² DBTΒData Build Tool Π΄Π»Ρ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Amazon Redshift β YouTube, ΠΠ°ΠΏΠΈΡΡ ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΡΡΠΎΠΊΠ° OTUSΠΠ½Π°ΠΊΠΎΠΌΡΡΠ²ΠΎ Ρ Greenplum β ΠΠ»ΠΈΠΆΠ°ΠΉΡΠΈΠΉ ΠΎΡΠΊΡΡΡΡΠΉ ΡΡΠΎΠΊ 15 ΠΌΠ°Ρ 2020ΠΡΡΡ ΠΏΠΎ Data Engineering β OTUSBuilding a Mature Analytics Workflow β ΠΠ·Π³Π»ΡΠ΄ Π½Π° Π±ΡΠ΄ΡΡΠ΅Π΅ ΡΠ°Π±ΠΎΡΡ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΠΊΡItβs time for open source analytics β ΠΠ²ΠΎΠ»ΡΡΠΈΡ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠΈ ΠΈ Π²Π»ΠΈΡΠ½ΠΈΠ΅ Open SourceContinuous Integration and Automated Build Testing with dbtCloud β ΠΡΠΈΠ½ΡΠΈΠΏΡ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ CI Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ DBTGetting started with DBT tutorial β ΠΡΠ°ΠΊΡΠΈΠΊΠ°, ΠΠΎΡΠ°Π³ΠΎΠ²ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡJaffle shop β Github DBT Tutorial β Github, ΠΊΠΎΠ΄ ΡΡΠ΅Π±Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com