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

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ состоит ΠΈΠ·ΠΈΠ· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² всСго 2-Ρ… Ρ‚ΠΈΠΏΠΎΠ²:

  • МодСль (.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'] %}
Β 
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 ΠΈ языка Jinja (templating language).

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ использован Ρ†ΠΈΠΊΠ» for для формирования суммы ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ°, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ set. Π’Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция ref β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ΄Π° Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ:

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

ИмСнно Jinja добавляСт Π² DBT ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ возмоТности. НаиболСС часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠ· Π½ΠΈΡ…:

  • 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() Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ. НаличиС Π³Ρ€Π°Ρ„Π° позволяСт Π΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ:

  • Запуск ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ
  • ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·Π°Ρ†ΠΈΡ формирования Π²ΠΈΡ‚Ρ€ΠΈΠ½
  • Запуск ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π³Ρ€Π°Ρ„Π°Β 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π³Ρ€Π°Ρ„Π°:

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: 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']

А Π²ΠΎΡ‚ ΠΊΠ°ΠΊ эта докумСнтация выглядит ΡƒΠΆΠ΅ Π½Π° сгСнСрированном Π²Π΅Π±-сайтС:

Data Build Tool ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ Π”Π°Π½Π½Ρ‹Ρ… ΠΈ Π‘ΠΌΡƒΠ·ΠΈ

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

НазначСниС 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

Π‘ ΠΏΠΎΠ»Π½Ρ‹ΠΌ списком ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ Π½Π° 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<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:

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)

  • Π’Π°ΠΆΠ½Π΅ΠΉΡˆΠ°Ρ инфраструктура ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ сообщСством ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ
  • НС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ инструмСнты Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ, Π½ΠΎ ΠΈ ΠΊΠΎΠ΄ всС Ρ‡Π°Ρ‰Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ достояниСм сообщСства Open Source

Π­Ρ‚ΠΈ основныС убСТдСния ΠΏΠΎΡ€ΠΎΠ΄ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сСгодня ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ 850 компаниях, ΠΈ ΠΎΠ½ΠΈ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ основу ΠΌΠ½ΠΎΠ³ΠΈΡ… интСрСсных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ созданы Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

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

Помимо DBT ΠΈ Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰ Π”Π°Π½Π½Ρ‹Ρ…, Π² Ρ€Π°ΠΌΠΊΠ°Ρ… курса Data Engineer Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ OTUS, я ΠΈ ΠΌΠΎΠΈ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ Π²Π΅Π΄Π΅ΠΌ занятия ΠΏΠΎ ряду Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈ соврСмСнных Ρ‚Π΅ΠΌ:

  • АрхитСктурныС ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π‘ΠΎΠ»ΡŒΡˆΠΈΡ… Π”Π°Π½Π½Ρ‹Ρ…
  • ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° со Spark ΠΈ Spark Streaming
  • Π˜Π·ΡƒΡ‡Π΅Π½ΠΈΠ΅ способов ΠΈ инструмСнтов Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ источников Π΄Π°Π½Π½Ρ‹Ρ…
  • ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ аналитичСских Π²ΠΈΡ‚Ρ€ΠΈΠ½ Π² DWH
  • ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ NoSQL: HBase, Cassandra, ElasticSearch
  • ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΈ оркСстрации 
  • Π€ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠŸΡ€ΠΎΠ΅ΠΊΡ‚: собираСм всС скиллы Π²ΠΎΠ΅Π΄ΠΈΠ½ΠΎ ΠΏΠΎΠ΄ мСнторской ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ

Бсылки:

  1. DBT documentation β€” Introduction β€” ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ докумСнтация
  2. What, exactly, is dbt? β€” ΠžΠ±Π·ΠΎΡ€Π½Π°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² DBTΒ 
  3. Data Build Tool для Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Amazon Redshift β€” YouTube, Π—Π°ΠΏΠΈΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΡƒΡ€ΠΎΠΊΠ° OTUS
  4. Знакомство с Greenplum β€” Π‘Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΡƒΡ€ΠΎΠΊ 15 мая 2020
  5. ΠšΡƒΡ€Ρ ΠΏΠΎ Data Engineering β€” OTUS
  6. Building a Mature Analytics Workflow β€” Взгляд Π½Π° Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΡƒ
  7. It’s time for open source analytics β€” Π­Π²ΠΎΠ»ΡŽΡ†ΠΈΡ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ ΠΈ влияниС Open Source
  8. Continuous Integration and Automated Build Testing with dbtCloud β€” ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ построСниС CI с использованиСм DBT
  9. Getting started with DBT tutorial β€” ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, ΠŸΠΎΡˆΠ°Π³ΠΎΠ²Ρ‹Π΅ инструкции для ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹
  10. Jaffle shop β€” Github DBT Tutorial β€” Github, ΠΊΠΎΠ΄ ΡƒΡ‡Π΅Π±Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ курсС.

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