Data Build Tool ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ±Ρ‰ΠΎ ΠΈΠΌΠ°Ρ‚ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° Π”Π°Π½Π½ΠΈ ΠΈ Π‘ΠΌΡƒΠ·ΠΈ

Data Build Tool ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ±Ρ‰ΠΎ ΠΈΠΌΠ°Ρ‚ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° Π”Π°Π½Π½ΠΈ ΠΈ Π‘ΠΌΡƒΠ·ΠΈ
На ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈ сС основава ΠΈΠ΄Π΅Π°Π»Π½ΠΎΡ‚ΠΎ Π‘ΠΊΠ»Π°Π΄ΠΎΠ²ΠΎ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π½Π° Π”Π°Π½Π½ΠΈ?

Ѐокус Π²ΡŠΡ€Ρ…Ρƒ бизнСс стойността ΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ°Ρ‚Π° ΠΏΡ€ΠΈ ΠΎΡ‚ΡΡŠΡΡ‚Π²ΠΈΠ΅ Π½Π° boilerplate code. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° DWH ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄ΠΎΠ²Π° Π±Π°Π·Π°: вСрсиониранС, ΠΏΡ€Π΅Π³Π»Π΅Π΄ΠΈ, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ тСстванС ΠΈ CI. ΠœΠΎΠ΄ΡƒΠ»Π½ΠΎΡΡ‚, Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚, ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄ ΠΈ общност. Π£Π΄ΠΎΠ±Π½Π° потрСбитСлска докумСнтация ΠΈ визуализация Π½Π° зависимоститС (Data Lineage).

Π—Π° всичко Ρ‚ΠΎΠ²Π° Π² подробности ΠΈ Π·Π° ролята Π½Π° DBT Π² СкосистСмата Big Data & Analytics β€” Π΄ΠΎΠ±Ρ€Π΅ дошли ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅ Π½Π° всички

Аз съм АртСмий ΠšΠΎΠ·ΠΈΡ€ΡŒ. Π’Π΅Ρ‡Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ 5 Π³ΠΎΠ΄ΠΈΠ½ΠΈ работя с Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π½Π° Π΄Π°Π½Π½ΠΈ, Π·Π°Π½ΠΈΠΌΠ°Π²Π°ΠΌ сС с ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ETL/ELT, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ с Π°Π½Π°Π»ΠΈΠ· Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ визуализация. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° работя Π² Wheely, ΠΏΡ€Π΅ΠΏΠΎΠ΄Π°Π²Π°ΠΌ Π² OTUS Π½Π° курса Data Engineer, ΠΈ днСс искам Π΄Π° сподСля с вас статия, която написах Π² ΠΏΡ€Π΅Π΄Π΄Π²Π΅Ρ€ΠΈΠ΅Ρ‚ΠΎ Π½Π° старта Π½Π° Π½ΠΎΠ² Π½Π°Π±ΠΎΡ€ Π½Π° курса.

ΠšΡ€Π°Ρ‚ΡŠΠΊ ΠΏΡ€Π΅Π³Π»Π΅Π΄

Π€Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡŠΡ‚ DBT β€” Ρ‚ΠΎΠ²Π° Π΅ всичко Π·Π° Π±ΡƒΠΊΠ²Π°Ρ‚Π° T Π² Π°ΠΊΡ€ΠΎΠ½ΠΈΠΌΠ° ELT (Extract β€” Transform β€” Load).

Π‘ появата Π½Π° Ρ‚Π°ΠΊΠΈΠ²Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΈ ΠΌΠ°Ρ‰Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡Π½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΊΠ°Ρ‚ΠΎ BigQuery, Redshift, Snowflake, ΠΈΠ·Ρ‡Π΅Π·Π½Π° всякакво Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π° ΠΏΡ€Π°Π²ΠΈΠΌ трансформации извън Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° Π”Π°Π½Π½ΠΈ.Β 

DBT Π½Π΅ ΠΈΠ·Π²Π»ΠΈΡ‡Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ, Π½ΠΎ прСдоставя ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с Ρ‚Π΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π²Π΅Ρ‡Π΅ са Π·Π°Ρ€Π΅Π΄Π΅Π½ΠΈ Π² Π‘ΠΊΠ»Π°Π΄ (Π² Internal ΠΈΠ»ΠΈ External Storage).

Data Build Tool ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ±Ρ‰ΠΎ ΠΈΠΌΠ°Ρ‚ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° Π”Π°Π½Π½ΠΈ ΠΈ Π‘ΠΌΡƒΠ·ΠΈ
ΠžΡΠ½ΠΎΠ²Π½ΠΎΡ‚ΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° DBT Π΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅ ΠΊΠΎΠ΄Π°, Π΄Π° Π³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π° Π² SQL, ΠΈ Π΄Π° изпълни ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ Π² ΠΏΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π° послСдоватСлност Π² Π‘ΠΊΠ»Π°Π΄.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° DBT

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ сС ΡΡŠΡΡ‚ΠΎΠΈ ΠΎΡ‚ Π΄Π²Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ‚ Π΄Π²Π° Ρ‚ΠΈΠΏΠ°:

  • МодСл (.sql) β€” Π΅Π΄ΠΈΠ½ΠΈΡ†Π° трансформация, ΠΈΠ·Ρ€Π°Π·Π΅Π½Π° с SELECT заявка
  • Π€Π°ΠΉΠ» конфигурация (.yml) β€” ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, настройки, тСстовС, докумСнтация

На Π±Π°Π·ΠΎΠ²ΠΎ Π½ΠΈΠ²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π΅ слСдната:

  • ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡΡ‚ подготвя ΠΊΠΎΠ΄Π° Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ Π² ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π½Π° IDE
  • Π§Ρ€Π΅Π· CLI сС ΠΈΠ·Π²ΠΈΠΊΠ²Π° стартиранС Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅, DBT ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π° ΠΊΠΎΠ΄Π° Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ Π² SQL
  • Бкомпилираният SQL ΠΊΠΎΠ΄ сС изпълнява Π² Π‘ΠΊΠ»Π°Π΄ Π² Π·Π°Π΄Π°Π΄Π΅Π½Π°Ρ‚Π° послСдоватСлност (Π³Ρ€Π°Ρ„)

Π•Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° стартиранСто ΠΎΡ‚ CLI:

Data Build Tool ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ±Ρ‰ΠΎ ΠΈΠΌΠ°Ρ‚ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° Π”Π°Π½Π½ΠΈ ΠΈ Π‘ΠΌΡƒΠ·ΠΈ

Всичко Π΅ SELECT

Π’ΠΎΠ²Π° Π΅ ΠΊΠΈΠ»Π»Π΅Ρ€-функция Π½Π° Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Data Build Tool. Π‘ Π΄Ρ€ΡƒΠ³ΠΈ Π΄ΡƒΠΌΠΈ, DBT абстрахира цСлия ΠΊΠΎΠ΄, ΡΠ²ΡŠΡ€Π·Π°Π½ с матСриализацията Π½Π° Π²Π°ΡˆΠΈΡ‚Π΅ заявки Π² Π‘ΠΊΠ»Π°Π΄ (Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΠΈ ΠΎΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ CREATE, INSERT, UPDATE, DELETE ALTER, GRANT, …).

Всяка ΠΌΠΎΠ΄Π΅Π» ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π° написванСто Π½Π° Π΅Π΄Π½Π° SELECT заявка, която опрСдСля рСзултатния Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ.

Π’ΡŠΠ·ΠΌΠΎΠΆΠ½Π° Π΅ многостСпСнна Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅, която консолидира Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ мноТСство Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΠΌΠΎΠ΄Π΅Π», ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π° Π²ΠΈΡ‚Ρ€ΠΈΠ½Π° Π·Π° ΠΏΠΎΡ€ΡŠΡ‡ΠΊΠΈ (f_orders):

{% set payment_methods = ['credit_card', 'coupon', 'bank_transfer', 'gift_card'] %}

с ΠΏΠΎΡ€ΡŠΡ‡ΠΊΠΈ ΠΊΠ°Ρ‚ΠΎ (

   select * from {{ ref('stg_orders') }}

),

плащания ΠΏΠΎ ΠΏΠΎΡ€ΡŠΡ‡ΠΊΠΈ ΠΊΠ°Ρ‚ΠΎ (

   select * from {{ ref('order_payments') }}

),

Ρ„ΠΈΠ½Π°Π»Π½ΠΎ ΠΊΠ°Ρ‚ΠΎ (

   select
       orders.order_id,
       orders.customer_id,
       orders.order_date,
       orders.status,
       {% for payment_method in payment_methods -%}
       order_payments.{{payment_method}}_amount,
       {% endfor -%}
       order_payments.total_amount as amount
   from orders
       left join order_payments using (order_id)

)

select * from final

Какво интСрСсно ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Ρ‚ΡƒΠΊ?

На ΠΏΡŠΡ€Π²ΠΎ място: Използвани са CTE (ΠžΠ±Ρ‰ΠΈ Π’Π°Π±Π»ΠΈΡ‡Π½ΠΈ Π˜Π·Ρ€Π°Π·ΠΈ) β€” Π·Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Π½Π΅ ΠΈ Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π°, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ ΠΌΠ½ΠΎΠ³ΠΎ прСобразувания ΠΈ бизнСс Π»ΠΎΠ³ΠΈΠΊΠ°

На Π²Ρ‚ΠΎΡ€ΠΎ място: ΠšΠΎΠ΄ΡŠΡ‚ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° β€” Π΅ смСсица ΠΎΡ‚ SQL ΠΈ Π΅Π·ΠΈΠΊ Jinja (Π΅Π·ΠΈΠΊ Π·Π° шаблони).

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Ρ†ΠΈΠΊΡŠΠ» for Π·Π° Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° сумата ΠΏΠΎ всСки ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π° ΠΏΠ»Π°Ρ‰Π°Π½Π΅, посочСн Π² ΠΈΠ·Ρ€Π°Π·Π° set. Използва сС ΠΈ функцията ref β€” Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° Ρ€Π΅Ρ„Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π² ΠΊΠΎΠ΄Π° Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ:

  • По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° компилацията ref Ρ‰Π΅ бъдС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½ Π² Ρ†Π΅Π»Π΅Π²ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» към Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΠ»ΠΈ прСдставлСниС Π² Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ
  • ref позволява ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π³Ρ€Π°Ρ„ Π½Π° зависимоститС Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅

Π’ΠΎΡ‡Π½ΠΎ Ρ‚ΠΎΠ²Π° Jinja прСдоставя Π½Π° DBT ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ. Най-чСсто ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡ‚Π΅ ΠΎΡ‚ тях са:

  • If / else ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈ β€” условни ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈ
  • For Ρ†ΠΈΠΊΠ»ΠΈ β€” Ρ†ΠΈΠΊΠ»ΠΈ
  • ΠŸΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ β€” ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
  • ΠœΠ°ΠΊΡ€ΠΎ β€” създаванС Π½Π° макроси

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ: Π’Π°Π±Π»ΠΈΡ†Π°, ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅, Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»Π½ΠΎ

БтратСгията Π·Π° ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ β€” ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΏΡ€ΠΈ ΠΊΠΎΠΉΡ‚ΠΎ рСзултатният Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° Ρ‰Π΅ бъдС Π·Π°ΠΏΠ°Π·Π΅Π½ Π² Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ.

Π’ основСн ΠΏΠ»Π°Π½ Ρ‚ΠΎΠ²Π° Π΅:

  • Π’Π°Π±Π»ΠΈΡ†Π° β€” физичСска Ρ‚Π°Π±Π»ΠΈΡ†Π° Π² Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ
  • ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ β€” Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° Π² Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ

Има ΠΈ ΠΏΠΎ-слоТни стратСгии Π·Π° матСриализация:

  • Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»Π½ΠΎ β€” ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»Π½ΠΎ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° (Π³ΠΎΠ»Π΅ΠΌΠΈ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ Ρ„Π°ΠΊΡ‚ΠΈ); Π½ΠΎΠ²ΠΈ Ρ€Π΅Π΄ΠΎΠ²Π΅ сС добавят, ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈΡ‚Π΅ β€” Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚, ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚ΠΈΡ‚Π΅ β€” сС почистват 
  • Ephemeral β€” ΠΌΠΎΠ΄Π΅Π»ΡŠΡ‚ Π½Π΅ сС ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ, Π½ΠΎ участва ΠΊΠ°Ρ‚ΠΎ CTE Π² Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
  • Всички Π΄Ρ€ΡƒΠ³ΠΈ стратСгии, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° добавятС сами

Π’ допълнСниС към стратСгиитС Π·Π° матСриализация сС ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Ρ‚ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ Π·Π° оптимизация спорСд ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

  • Snowflake: ΠŸΡ€Π΅Ρ…ΠΎΠ΄Π½ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ, ПовСдСниС ΠΏΡ€ΠΈ обСдиняванС, ΠšΠ»ΡŠΡΡ‚Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ, ΠšΠΎΠΏΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€Π°Π²Π°, Π‘ΠΈΠ³ΡƒΡ€Π½ΠΈ прСдставлСния
  • Redshift: Distkey, Sortkey (ΠΈΠ½Ρ‚Π΅Ρ€Π»Π΅Π²ΠΈΡ€Π°Π½, ΡΡŠΡΡ‚Π°Π²Π΅Π½), Късно ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° прСдставлСния
  • BigQuery: ΠŸΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€Π°Π½Π΅ ΠΈ ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ, ПовСдСниС ΠΏΡ€ΠΈ обСдиняванС, ΠšΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅ с KMS, Π•Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΈ ΠΈ Π’Π°Π³ΠΎΠ²Π΅
  • Spark: Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° Ρ„Π°ΠΉΠ»Π° (parquet, csv, json, orc, delta), partition_by, clustered_by, buckets, incremental_strategy

Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ слСднитС Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°:

  • Postgres
  • Redshift
  • BigQuery
  • Snowflake
  • Presto (частично)
  • Spark (частично)
  • Microsoft SQL Server (community adapter)

НСка ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈΠΌ нашия ΠΌΠΎΠ΄Π΅Π»:

  • Π”Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ с ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»Π½ΠΎ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ (Incremental)
  • Π”Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ Π·Π° сСгмСнтиранС ΠΈ сортиранС Π·Π° Redshift

-- ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π°:
-- Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»Π½ΠΎ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅, ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΊΠ»ΡŽΡ‡ Π·Π° обновяванС Π½Π° записи (unique_key)
-- ΠšΠ»ΡŽΡ‡ Π·Π° сСгмСнтиранС (dist), ΠΊΠ»ΡŽΡ‡ Π·Π° сортиранС (sort)
{{
  config(
        materialized='incremental',
        unique_key='order_id',
        dist="customer_id",
        sort="order_date"
    )
}}

{% set payment_methods = ['credit_card', 'coupon', 'bank_transfer', 'gift_card'] %}

with orders as (

   select * from {{ ref('stg_orders') }}
   where 1=1
   {% if is_incremental() -%}
       -- Π’ΠΎΠ·ΠΈ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ Ρ‰Π΅ бъдС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ само Π·Π° ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»Π½ΠΎ стартиранС
       and order_date >= (select max(order_date) from {{ this }})
   {%- endif %}

),

order_payments as (

   select * from {{ ref('order_payments') }}

),

final as (

   select
       orders.order_id,
       orders.customer_id,
       orders.order_date,
       orders.status,
       {% for payment_method in payment_methods -%}
       order_payments.{{payment_method}}_amount,
       {% endfor -%}
       order_payments.total_amount as amount
   from orders
       left join order_payments using (order_id)

)

select * from final

Π“Ρ€Π°Ρ„ Π½Π° зависимоститС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅

Π’ΠΎΠΉ Π΅ ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π΄ΡŠΡ€Π²ΠΎ Π½Π° зависимоститС. Π’ΠΎΠΉ Π΅ DAG (Directed Acyclic Graph β€” НаправСн АцикличСн Π“Ρ€Π°Ρ„).

DBT ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π° Π³Ρ€Π°Ρ„ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° конфигурацията Π½Π° всички ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ ref() Π²ΡŠΡ‚Ρ€Π΅ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ към Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ. НаличиСто Π½Π° Π³Ρ€Π°Ρ„ позволява слСднитС Π½Π΅Ρ‰Π°:

  • Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ Π² ΠΏΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π° послСдоватСлност
  • ΠŸΠ°Ρ€Π°Π»Π΅Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π½Π° ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π²ΠΈΡ‚Ρ€ΠΈΠ½ΠΈ
  • Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΠΏΠΎΠ΄Π³Ρ€Π°Ρ„Β 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° визуализация Π½Π° Π³Ρ€Π°Ρ„Π°:

Data Build Tool ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ±Ρ‰ΠΎ ΠΈΠΌΠ°Ρ‚ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° Π”Π°Π½Π½ΠΈ ΠΈ Π‘ΠΌΡƒΠ·ΠΈ
ВсСки възСл Π² Π³Ρ€Π°Ρ„Π° β€” Ρ‚ΠΎΠ²Π° Π΅ ΠΌΠΎΠ΄Π΅Π», Ρ€ΡŠΠ±ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° Π³Ρ€Π°Ρ„Π° сС Π·Π°Π΄Π°Π²Π°Ρ‚ Ρ‡Ρ€Π΅Π· ΠΈΠ·Ρ€Π°Π·Π° 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']

А Π΅Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Π°Π·ΠΈ докумСнтация Π²Π΅Ρ‡Π΅ Π½Π° гСнСрирания уСбсайт:

Data Build Tool ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ±Ρ‰ΠΎ ΠΈΠΌΠ°Ρ‚ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° Π”Π°Π½Π½ΠΈ ΠΈ Π‘ΠΌΡƒΠ·ΠΈ

ΠœΠ°ΠΊΡ€ΠΎΡΠΈ ΠΈ ΠœΠΎΠ΄ΡƒΠ»ΠΈ

ΠžΡΠ½ΠΎΠ²Π½Π°Ρ‚Π° Ρ†Π΅Π» Π½Π° 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_utils: Ρ€Π°Π±ΠΎΡ‚Π° с Π”Π°Ρ‚Π°/Час, Π’Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅, ВСстовС Π½Π° схСма, ΠŸΠΈΠ²ΠΎΡ‚/Π”Π΅ΠΏΠΈΠ²ΠΎΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ
  • Π“ΠΎΡ‚ΠΎΠ²ΠΈ шаблони Π·Π° Π²ΠΈΡ‚Ρ€ΠΈΠ½ΠΈ Π·Π° услуги ΠΊΠ°Ρ‚ΠΎ Snowplow ΠΈ StripeΒ 
  • Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π·Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π½Π° Π”Π°Π½Π½ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ RedshiftΒ 
  • Logging β€” ΠœΠΎΠ΄ΡƒΠ» Π·Π° Π»ΠΎΠ³ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° DBT

Π‘ пълния списък Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Ρ‚Π΅ Π½Π° dbt hub.

ΠžΡ‰Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ

Π’ΡƒΠΊ Ρ‰Π΅ опиша няколко Π΄Ρ€ΡƒΠ³ΠΈ интСрСсни характСристики ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π°Π· ΠΈ Π΅ΠΊΠΈΠΏΡŠΡ‚ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π½Π° Π”Π°Π½Π½ΠΈ Π² Wheely.

РаздСлянС Π½Π° срСдитС 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%.

ΠœΠ°ΠΊΡ€ΠΎΡ redshift.compress_table Ρ‰Π΅ изпълни ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° 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:

Data Build Tool ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ±Ρ‰ΠΎ ΠΈΠΌΠ°Ρ‚ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° Π”Π°Π½Π½ΠΈ ΠΈ Π‘ΠΌΡƒΠ·ΠΈ

Автоматизация Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ

Ако ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ някакви Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½Π° функционалността Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΎΡ‚ΠΎ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, ΠΊΠ°Ρ‚ΠΎ 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)

Data Build Tool ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ±Ρ‰ΠΎ ΠΈΠΌΠ°Ρ‚ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° Π”Π°Π½Π½ΠΈ ΠΈ Π‘ΠΌΡƒΠ·ΠΈ

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈΠ³ΠΎΡ‚Π²ΡΠ½Π΅Ρ‚ΠΎ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° DWH става Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° приятно ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΈ ΠΏΠΈΠ΅Π½Π΅Ρ‚ΠΎ Π½Π° смутита. DBT сС ΡΡŠΡΡ‚ΠΎΠΈ ΠΎΡ‚ Jinja, потрСбитСлски Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΡ (ΠΌΠΎΠ΄ΡƒΠ»ΠΈ), ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€, ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π» (executor) ΠΈ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ. Π‘ΡŠΠ±Ρ€Π°Π»ΠΈ Ρ‚Π΅Π·ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π·Π°Π΅Π΄Π½ΠΎ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Ρ‚Π΅ ΠΏΡŠΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π½ΠΎ срСдищС Π·Π° Π²Π°ΡˆΠ΅Ρ‚ΠΎ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π½Π° Π”Π°Π½Π½ΠΈ. ДнСс Π΅Π΄Π²Π° Π»ΠΈ ΠΈΠΌΠ° ΠΏΠΎ-Π΄ΠΎΠ±ΡŠΡ€ Π½Π°Ρ‡ΠΈΠ½ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° трансформациитС Π² DWH.

Data Build Tool ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ±Ρ‰ΠΎ ΠΈΠΌΠ°Ρ‚ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° Π”Π°Π½Π½ΠΈ ΠΈ Π‘ΠΌΡƒΠ·ΠΈ

УбСТдСнията, ΠΊΠΎΠΈΡ‚ΠΎ слСдват Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° DBT, сС Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€Π°Ρ‚ Ρ‚Π°ΠΊΠ°:

  • ΠšΠΎΠ΄ΡŠΡ‚, Π° Π½Π΅ GUI, Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€Π°Ρ‚Π° абстракция Π·Π° изразяванС Π½Π° слоТна Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°.
  • Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° с Π΄Π°Π½Π½ΠΈ трябва Π΄Π° Π°Π΄Π°ΠΏΡ‚ΠΈΡ€Π° Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° софтуСр (Software Engineering).

  • Най-Π²Π°ΠΆΠ½Π°Ρ‚Π° инфраструктура Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с Π΄Π°Π½Π½ΠΈ трябва Π΄Π° сС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π° ΠΎΡ‚ общността Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ ΠΊΠ°Ρ‚ΠΎ софтуСр с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄.
  • НС само Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡Π½ΠΈΡ‚Π΅ инструмСнти, Π½ΠΎ ΠΈ ΠΊΠΎΠ΄ΡŠΡ‚ всС ΠΏΠΎ-чСсто Ρ‰Π΅ става част ΠΎΡ‚ общността с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄.

Π’Π΅Π·ΠΈ основни убСТдСния ΡΡŠΠ·Π΄Π°Π΄ΠΎΡ…Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚, ΠΊΠΎΠΉΡ‚ΠΎ днСс сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ 850 ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΈ Ρ‚Π΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Ρ‚ основата Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ интСрСсни Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΡ, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ създадСни Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅.

Π—Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ сС интСрСсуват, ΠΈΠΌΠ° видСозапис Π½Π° ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ ΡƒΡ€ΠΎΠΊ, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Π΄ΠΎΡ… ΠΏΡ€Π΅Π΄ΠΈ няколко мСсСца Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° открития ΡƒΡ€ΠΎΠΊ Π² OTUS β€” Data Build Tool Π·Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Amazon Redshift..

Π’ допълнСниС към DBT ΠΈ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°Ρ‚Π° Π½Π° Π”Π°Π½Π½ΠΈ, Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° курса Data Engineer Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° OTUS, Π°Π· ΠΈ ΠΌΠΎΠΈΡ‚Π΅ ΠΊΠΎΠ»Π΅Π³ΠΈ Π²ΠΎΠ΄ΠΈΠΌ занятия ΠΏΠΎ Ρ€Π΅Π΄ΠΈΡ†Π° Π΄Ρ€ΡƒΠ³ΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»Π½ΠΈ ΠΈ ΡΡŠΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈ Ρ‚Π΅ΠΌΠΈ:

  • АрхитСктурни ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Π½Π° прилоТСния с Π“ΠΎΠ»Π΅ΠΌΠΈ Π”Π°Π½Π½ΠΈ.
  • ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° със Spark ΠΈ Spark Streaming.
  • Π˜Π·ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° Π½Π°Ρ‡ΠΈΠ½ΠΈ ΠΈ инструмСнти Π·Π° Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ Π½Π° Π΄Π°Π½Π½ΠΈ.
  • Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡Π½ΠΈ Π²ΠΈΡ‚Ρ€ΠΈΠ½ΠΈ Π² DWH.
  • ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ NoSQL: HBase, Cassandra, ElasticSearch.
  • ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈ Π½Π° организация Π½Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΈ оркСстрация.Β 
  • Π€ΠΈΠ½Π°Π»Π΅Π½ ΠŸΡ€ΠΎΠ΅ΠΊΡ‚: ΡΡŠΠ±ΠΈΡ€Π°ΠΌΠ΅ всички умСния Π²ΠΎΠ΅Π΄Π½ΠΎ ΠΏΠΎΠ΄ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€ΡΠΊΠ° ΠΏΠΎΠ΄ΠΊΡ€Π΅ΠΏΠ°.

Π’Ρ€ΡŠΠ·ΠΊΠΈ:

  1. DBT докумСнтация β€” Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. β€” ΠžΡ„ΠΈΡ†ΠΈΠ°Π»Π½Π° докумСнтация.
  2. Какво Ρ‚ΠΎΡ‡Π½ΠΎ Π΅ dbt? β€” ΠŸΡ€Π΅Π³Π»Π΅Π΄Π½Π° статия Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π°Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ Π½Π° DBT.Β 
  3. Data Build Tool Π·Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Amazon Redshift. β€” YouTube, Запис Π½Π° открития ΡƒΡ€ΠΎΠΊ OTUS.
  4. Π—Π°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ с Greenplum. β€” Най-близкият ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ ΡƒΡ€ΠΎΠΊ 15 ΠΌΠ°ΠΉ 2020.
  5. ΠšΡƒΡ€Ρ ΠΏΠΎ Data Engineering. β€” OTUS.
  6. Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° зрял Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡Π΅Π½ Ρ€Π°Π±ΠΎΡ‚Π΅Π½ ΠΏΠΎΡ‚ΠΎΠΊ. β€” Взгляд към Π±ΡŠΠ΄Π΅Ρ‰Π΅Ρ‚ΠΎ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с Π΄Π°Π½Π½ΠΈ ΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ°Ρ‚Π°.
  7. Π’Ρ€Π΅ΠΌΠ΅ Π΅ Π·Π° Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ° с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄. β€” Π•Π²ΠΎΠ»ΡŽΡ†ΠΈΡ Π½Π° Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ°Ρ‚Π° ΠΈ влияниСто Π½Π° Open Source.
  8. ΠΠ΅ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚Π° интСграция ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ тСстванС Π½Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ с dbtCloud. β€” ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° CI с ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° DBT.
  9. Π—Π°ΠΏΠΎΡ‡Π²Π°Π½Π΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° с DBT - ΡƒΡ‡Π΅Π±Π½ΠΈΠΊ. β€” ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, Π‘Ρ‚ΡŠΠΏΠΊΠΎΠ²ΠΈ инструкции Π·Π° самостоятСлна Ρ€Π°Π±ΠΎΡ‚Π°.
  10. Jaffle shop β€” Github DBT Π’ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π» β€” Github, ΠΊΠΎΠ΄ Π½Π° учСбния ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

НаучСтС ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° курса.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster