рдбреЗрдЯрд╛ рдмрд┐рд▓реНрдб рдЯреВрд▓ рдпрд╛ рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ рдФрд░ рд╕реНрдореВрдереА рдХреЗ рдмреАрдЪ рдХреНрдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ


рдПрдХ рдЖрджрд░реНрд╢ рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреНрдпрд╛ рд╣реИрдВ?

рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдореВрд▓реНрдп рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдХреА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред DWH рдХреЛ рдПрдХ рдХреЛрдбрдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛: рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдирд╛, рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдирд╛, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдФрд░ CIред рдкреНрд░рддрд┐рд░реВрдкрдХрддрд╛, рд╡рд┐рд╕реНрддрд╛рд░рд╢реАрд▓рддрд╛, рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдФрд░ рд╕рдореБрджрд╛рдпред рджреЛрд╕реНрддрд╛рдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рджреГрд╢реНрдп (рдбреЗрдЯрд╛ рд╡рдВрд╢)ред

рдЗрд╕ рд╕рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдмрд┐рдЧ рдбреЗрдЯрд╛ рдПрдВрдб рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдбреАрдмреАрдЯреА рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░


Artemy Kozyr рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВред 5 рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдореИрдВ рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕, рдИрдЯреАрдПрд▓ / рдИрдПрд▓рдЯреА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдбреЗрдЯрд╛ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдФрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ Wheely рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ , рдбреЗрдЯрд╛ рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЛрд░реНрд╕ рдкрд░ OTUS рдореЗрдВ рдкрдврд╝рд╛рддрд╛ рд╣реВрдВ, рдФрд░ рдЖрдЬ рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдЦ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдореИрдВрдиреЗ рдирдП рдкрд╛рдареНрдпрдХреНрд░рдо рд╕реЗрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдкреВрд░реНрд╡ рд╕рдВрдзреНрдпрд╛ рдкрд░ рд▓рд┐рдЦрд╛ рдерд╛ ред

рд▓рдШреБ рд╕рдореАрдХреНрд╖рд╛


DBT рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рднреА рдЕрдХреНрд╖рд░ T рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬреЛ рдХрд┐ рд╕рдВрдХреНрд╖рд┐рдкреНрдд ELT (рдПрдХреНрд╕реНрдЯреНрд░реЗрдХреНрдЯ - рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо - рд▓реЛрдб) рдореЗрдВ рд╣реИред

BigQuery, Redshift, Snowflake рдЬреИрд╕реЗ рдЙрддреНрдкрд╛рджрдХ рдФрд░ рд╕реНрдХреЗрд▓реЗрдмрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ рдХреЗ рдмрд╛рд╣рд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рднреА рдЕрд░реНрде рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ред 

DBT рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдЕрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдЯреЛрд░реЗрдЬ (рдЖрдВрддрд░рд┐рдХ рдпрд╛ рдЕрдиреНрдп рд╕рдВрдЧреНрд░рд╣рдг рдореЗрдВ) рд▓реЛрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдмрд░рджрд╕реНрдд рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред


DBT рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдХреЛрдб рд▓реЗрдирд╛, SQL рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реИред

DBT рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ 2 рдкреНрд░рдХрд╛рд░ рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдФрд░ рдлрд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • рдореЙрдбрд▓ (.sql) - рдПрдХ рдЪрдпрди рдХреНрд╡реЗрд░реА рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЗрдХрд╛рдИ
  • рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ (.yml) - рдкреИрд░рд╛рдореАрдЯрд░, рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдкрд░реАрдХреНрд╖рдг, рдкреНрд░рд▓реЗрдЦрди

рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рд╕реНрддрд░ рдкрд░, рдХрд╛рд░реНрдп рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рдВрд░рдЪрд┐рдд рд╣реИ:

  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЖрдИрдбреАрдИ рдореЗрдВ рдореЙрдбрд▓ рдХреЛрдб рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ
  • рд╕реАрдПрд▓рдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореЙрдбрд▓ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, DBT SQL рдореЗрдВ рдореЙрдбрд▓ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ
  • рд╕рдВрдХрд▓рд┐рдд SQL рдХреЛрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрдиреБрдХреНрд░рдо (рдЧреНрд░рд╛рдлрд╝) рдореЗрдВ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ рдХрд┐ CLI рд╕реЗ рд▓реЙрдиреНрдЪ рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:


рд╕рдм рдХреБрдЫ рд╕рд┐рд▓реЗрдХреНрдЯ рд╣реИ


рдпрд╣ рдбреЗрдЯрд╛ рдмрд┐рд▓реНрдб рдЯреВрд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдПрдХ рдХрд┐рд▓рд░ рдлреАрдЪрд░ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, DBT рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ рдореЗрдВ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рднреМрддрд┐рдХрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдХреЛрдбреЛрдВ (рд╕рд╛рд░, рдЗрдиреНрд╕рд░реНрдЯ, рдЕрджреНрдпрддрди, 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 (рдХреЙрдорди рдЯреЗрдмрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рд░реВрдкрд╛рдВрддрд░рдг рдФрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ

ред рджреВрд╕рд░рд╛: рдореЙрдбрд▓ рдХреЛрдб SQL рдФрд░ рдЬрд┐рдВрдЬрд╛ рднрд╛рд╖рд╛ (рдЕрд╕реНрдерд╛рдпреА рднрд╛рд╖рд╛) рдХрд╛ рдорд┐рд╢реНрд░рдг рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд▓реВрдк рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рддреНрдпреЗрдХ рднреБрдЧрддрд╛рди рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд░рд╛рд╢рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред Ref рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рдЕрдиреНрдп рдореЙрдбрд▓реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛:

  • рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп, рд░реЗрдлрд░реА рдХреЛ рд▓рдХреНрд╖реНрдп рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  • рд░реЗрдлрд░реА рдЖрдкрдХреЛ рдореЙрдбрд▓ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдПрдХ рдЧреНрд░рд╛рдл рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

рдпрд╣ рдЬрд┐рдВрдЬрд╛ рд╣реИ рдЬреЛ рдбреАрдмреАрдЯреА рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдЕрд╕реАрдорд┐рдд рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ:

  • рдпрджрд┐ / рдЕрдиреНрдп рдХрдерди
  • рдЫреЛрд░реЛрдВ рдХреЗ рд▓рд┐рдП - рдЫреЛрд░реЛрдВ
  • рдЪрд░ - рдЪрд░
  • рдореИрдХреНрд░реЛ - рдореИрдХреНрд░реЛрдЬрд╝ рдмрдирд╛рдПрдБ

рд╕рд╛рдордЧреНрд░реАрдХрд░рдг: рддрд╛рд▓рд┐рдХрд╛, рджреГрд╢реНрдп, рд╡реГрджреНрдзрд┐рд╢реАрд▓


рд╕рд╛рдордЧреНрд░реАрдХрд░рдг рд░рдгрдиреАрддрд┐ - рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореЙрдбрд▓ рдбреЗрдЯрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реЗрдЯ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдПрдХ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ, рдпрд╣ рд╣реИ:

  • рддрд╛рд▓рд┐рдХрд╛ - рд╕рдВрдЧреНрд░рд╣рдг рдореЗрдВ рднреМрддрд┐рдХ рддрд╛рд▓рд┐рдХрд╛
  • рд╡реНрдпреВ - рд╡реНрдпреВ, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдЯреЗрдмрд▓

рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рд╛рдордЧреНрд░реАрдХрд░рдг рд░рдгрдиреАрддрд┐рдпрд╛рдБ рд╣реИрдВ:

  • рд╡реГрджреНрдзрд┐рд╢реАрд▓ - рд╡реГрджреНрдзрд┐рд╢реАрд▓ рд▓реЛрдбрд┐рдВрдЧ (рдмрдбрд╝реЗ рддрдереНрдп рддрд╛рд▓рд┐рдХрд╛рдУрдВ); рдирдИ рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИрдВ, рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдЧрдП рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рдЯрд╛рдП рдЧрдП рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ 
  • рдкрдВрдЪрд╛рдВрдЧ - рдореЙрдбрд▓ рд╕реАрдзреЗ рднреМрддрд┐рдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдореЙрдбрд▓реЛрдВ рдореЗрдВ рд╕реАрдЯреАрдИ рдХреЗ рд░реВрдк рдореЗрдВ рднрд╛рдЧ рд▓реЗрддрд╛ рд╣реИ
  • рдХреЛрдИ рдЕрдиреНрдп рд░рдгрдиреАрддрд┐рдпрд╛рдБ рдЬреЛ рдЖрдк рд╕реНрд╡рдпрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ

рднреМрддрд┐рдХрдХрд░рдг рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреЛрджрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдЕрд╡рд╕рд░ рдЦреЛрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

  • рд╕реНрдиреЛрдлреНрд▓реЗрдХ : рдХреНрд╖рдгрд┐рдХ рдЯреЗрдмрд▓, рдорд░реНрдЬ рд╡реНрдпрд╡рд╣рд╛рд░, рдЯреЗрдмрд▓ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ, рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛, рд╕реБрд░рдХреНрд╖рд┐рдд рджреГрд╢реНрдп
  • рд░реЗрдбрд╢рд┐рдлреНрдЯ : рдбрд┐рд╕реНрдЯреЗрдХ, рд╕реЙрдВрдЯрдХреА (рдЗрдВрдЯрд░рд▓реЗрд╡реНрдб, рдХрдВрдкрд╛рдЙрдВрдб), рд▓реЗрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╡реНрдпреВ
  • BigQuery : рдЯреЗрдмрд▓ рд╡рд┐рднрд╛рдЬрди рдФрд░ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ, рдорд░реНрдЬ рд╡реНрдпрд╡рд╣рд╛рд░, рдХреЗрдПрдордПрд╕ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди, рд▓реЗрдмрд▓ рдФрд░ рдЯреИрдЧ
  • рд╕реНрдкрд╛рд░реНрдХ : рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк (рд▓рдХрдбрд╝реА рдХреА рдЫрдд, csv, json, orc, рдбреЗрд▓реНрдЯрд╛), partition_by, clustered_by, buckets, incremental_strategy

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрдВрдбрд╛рд░ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ:

  • postgres
  • рд▓рд╛рд▓ рд╢рд┐рдлреНрдЯ
  • BigQuery
  • рд╣рд┐рдордкрд╛рдд рдХрд╛ рдПрдХ рдЦрдВрдб
  • рдкреНрд░реЗрд╕реНрдЯреЛ (рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ)
  • рд╕реНрдкрд╛рд░реНрдХ (рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ)
  • Microsoft SQL рд╕рд░реНрд╡рд░ (рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдПрдбрд╛рдкреНрдЯрд░)

рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВ:

  • рдЗрд╕рдХреА рднрд░рдг рд╡реГрджреНрдзрд┐ (рд╡реГрджреНрдзрд┐рд╢реАрд▓) рдХрд░реЗрдВ
  • 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

рдореЙрдбрд▓ рдирд┐рд░реНрднрд░рддрд╛ рдЧреНрд░рд╛рдл


рд╡рд╣ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рд╡реГрдХреНрд╖ рд╣реИред рд╡рд╣ рдПрдХ рдбреАрдПрдЬреА (рдбрд╛рдпрд░реЗрдХреНрдЯреЗрдб рдПрд╕рд╛рдЗрдХреНрд▓рд┐рдХ рдЧреНрд░рд╛рдл - рджрд┐рд╢рд╛рддреНрдордХ рдПрд╕рд╛рдЗрдХреНрд▓рд┐рдХ рдЧреНрд░рд╛рдл) рд╣реИред

DBT рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЧреНрд░рд╛рдл рдмрдирд╛рддрд╛ рд╣реИ, рдпрд╛ рдЕрдиреНрдп рдореЙрдбрд▓реЛрдВ рдХреЗ рд▓рд┐рдП ref () рд▓рд┐рдВрдХ рдореЙрдбрд▓ рдХреЗ рдЕрдВрджрд░ рд╣реЛрддрд╛ рд╣реИред рдЧреНрд░рд╛рдл рд░рдЦрдиреЗ рд╕реЗ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  • рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рдореЙрдбрд▓
  • рд╡рд┐рдВрдбреЛ рдбреНрд░реЗрд╕рд┐рдВрдЧ рдХрд╛ рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг
  • рдордирдорд╛рдирд╛ рд╕рдмрдЧреНрд░рд╛рдл рдЪрд▓рд╛рдирд╛ 

рдЧреНрд░рд╛рдлрд╝ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЙрджрд╛рд╣рд░рдг:


рдЧреНрд░рд╛рдл рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдПрдХ рдореЙрдбрд▓ рд╣реИ, рдЧреНрд░рд╛рдлрд╝ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд░реЗрдл рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдбреЗрдЯрд╛ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдФрд░ рдкреНрд░рд▓реЗрдЦрди


рд╕реНрд╡рдпрдВ рдореЙрдбрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛, DBT рдЖрдкрдХреЛ рдкрд░рд┐рдгрд╛рдореА рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рджрд╛рд╡реЗ рдкрд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ:

  • рд╢реВрдиреНрдп рдирд╣реАрдВ
  • рдЕрджреНрд╡рд┐рддреАрдп
  • рд╕рдВрджрд░реНрдн рдЕрдЦрдВрдбрддрд╛ - рд╕рдВрджрд░реНрдн рдЕрдЦрдВрдбрддрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрд░реНрдбрд░ рдЯреЗрдмрд▓ рдореЗрдВ customer_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']

рдФрд░ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд▓реЗрдЦрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрддреНрдкрдиреНрди рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рджрд┐рдЦрддрд╛ рд╣реИ:


рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░ рдореЙрдбреНрдпреВрд▓


рдбреАрдмреАрдЯреА рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрд╕рдХреНрдпреВрдПрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдФрд░ рдЗрди рдореЙрдбреНрдпреВрд▓реЛрдВ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рд╕реБрд╡рд┐рдзрд╛ рд╕рдВрдкрдиреНрди рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИред

рдореИрдХреНрд░реЛрдЬрд╝ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕реЗрдЯ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореЙрдбрд▓ рдХреЗ рднреАрддрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдХреНрд░реЛрдЬрд╝ рдЖрдкрдХреЛ DRY (рдбреЛрдВрдЯ рд░рд┐рдкреАрдЯ рдпреЛрд░рд╕реЗрд▓реНрдл) рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореЙрдбрд▓ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмреАрдЪ SQL рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдореИрдХреНрд░реЛ рдЙрджрд╛рд╣рд░рдг:

{% 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_utils : рджрд┐рдирд╛рдВрдХ / рд╕рдордп, рд╕рд░реЛрдЧреЗрдЯ рдХреБрдВрдЬреА, рд╕реНрдХреАрдорд╛ рдкрд░реАрдХреНрд╖рдг, рдкрд┐рд╡рдЯ / рдЕрдирдкреНрд░реАрд╕реНрдЯ рдФрд░ рдЕрдиреНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛
  • рд╕реНрдиреЛрдкреНрд▓реЛ рдФрд░ рд╕реНрдЯреНрд░рд╛рдЗрдк рдЬреИрд╕реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рд╢реЛрдХреЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ 
  • рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдЬреИрд╕реЗ Redshift 
  • рд▓реЙрдЧрд┐рдВрдЧ - DBT рд▓реЙрдЧрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓

рд╕рдВрдХреБрд▓ рдХреА рдкреВрд░реА рд╕реВрдЪреА dbt рд╣рдм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

рдФрд░ рднреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ


рдпрд╣рд╛рдВ рдореИрдВ рдХрдИ рдЕрдиреНрдп рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдХрд┐ рдореИрдВ рдФрд░ рдЯреАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реНрд╣реАрд▓реА рдореЗрдВ рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ ред

рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдкреГрдердХреНрдХрд░рдг DEV - рдкрд░реАрдХреНрд╖рдг - 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 -%}
 
)

рдпрд╣ рдХреЛрдб рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдХрд╣рддрд╛ рд╣реИ: рджреЗрд╡, рдкрд░реАрдХреНрд╖рдг, рд╕реАрдЖрдИ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП , рдХреЗрд╡рд▓ рдкрд┐рдЫрд▓реЗ 3 рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд▓реЗрдВ рдФрд░ рдЕрдм рдФрд░ рдирд╣реАрдВред рдпрд╣реА рд╣реИ, рдЗрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ рджреМрдбрд╝рдирд╛ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЬрдм рдПрдХ рдардВрдвреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдкрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд┐рд▓реНрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реНрддрдВрдн рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рднреМрддрд┐рдХрдХрд░рдг


Redshift рдПрдХ рдХреЙрд▓рдо DBMS рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрдкреАрдбрд╝рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╖реНрдЯрддрдо рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЪреБрдирд╛рд╡ рдХрдмреНрдЬреЗ рд╡рд╛рд▓реЗ рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди рдХреЛ 20-50% рддрдХ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред Redshift.compress_table

рдореИрдХреНрд░реЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг COMPRESSION рдЖрджреЗрд╢ рдкрд░ рдЕрдорд▓, рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╕реНрддрдВрдн рдХреЛрдбрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╡рд┐рднрд╛рдЬрди рдЪрд╛рдмрд┐рдпрд╛рдБ рдиреЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ (dist_key) рдФрд░ рдкреНрд░рдХрд╛рд░ (key_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) }}

рд▓реЙрдЧрд┐рдВрдЧ рдореЙрдбрд▓ рд▓реЙрдиреНрдЪ


рдореЙрдбрд▓ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП, рдЖрдк рд╣реБрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд▓реЙрдиреНрдЪ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ рдореЙрдбрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

   pre-hook: "{{ logging.log_model_start_event() }}"
   post-hook: "{{ logging.log_model_end_event() }}"

рд▓реЙрдЧрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрдк рдмрд╛рдж рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ (рдмрд╛рдзрд╛рдУрдВ) рдХрд╛ рдСрдбрд┐рдЯ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рд▓реБрдХрдЕрдк рдбреЗрдЯрд╛ рдореЗрдВ рд▓реБрдХрдЕрдк рдбреЗрдЯрд╛ рдкрд░ рдбреИрд╢рдмреЛрд░реНрдб рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


рднрдВрдбрд╛рд░рдг рд╕реНрд╡рдЪрд╛рд▓рди


рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕реНрдЯреЛрд░реЗрдЬ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдХрд┐рд╕реА рднреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдпреВрдбреАрдПрдл (рдпреВрдЬрд░ рдбрд┐рдлрд╛рдЗрдВрдб рдлрдВрдХреНрд╢рдВрд╕), рддреЛ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрд╕реНрдХрд░рдгрдмрджреНрдз рдХрд░рдирд╛, рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдФрд░ рдирдП рд░рд┐рд▓реАрдЬ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░реЛрд▓ рдЖрдЙрдЯ рдХрд░рдирд╛ рдбреАрдмреАрдЯреА рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рд╣рдо рд╣реИрд╢ рдорд╛рди, рдореЗрд▓ рдбреЛрдореЗрди рдбреЛрдореЗрди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдмрд┐рдЯрдХреЙрдиреНрд╕ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЬрдЧрд░ рдореЗрдВ UDF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдореИрдХреНрд░реЛ рдЬреЛ рдХрд┐рд╕реА рднреА рд░рдирдЯрд╛рдЗрдо рдкрд░ рдпреВрдбреАрдПрдл рдмрдирд╛рддрд╛ рд╣реИ (рджреЗрд╡, рдкрд░реАрдХреНрд╖рдг, рдареЗрд╕):

{% 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_mainurance рдореИрдХреНрд░реЛ рд╕реЗ рдХрдорд╛рдВрдб рд╣рд░ рд░рд╛рдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ:

{% 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 рдХреЛ рдПрдХ рд╕реЗрд╡рд╛ (рдкреНрд░рдмрдВрдзрд┐рдд рд╕реЗрд╡рд╛) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдПрдХ рд╕реЗрдЯ рдореЗрдВ:

  • рд╡реЗрдм рдЖрдИрдбреАрдИ рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдФрд░ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП
  • рдиреМрдХрд░реА рд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рдЕрдиреБрд╕реВрдЪреА рд╕реЗрдЯрд┐рдВрдЧ
  • рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкрд╣реБрдБрдЪ
  • рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рд╛рде рд╡реЗрдм рд╕рд╛рдЗрдЯ
  • CI (рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг) рдХрдиреЗрдХреНрд╢рди


рдирд┐рд╖реНрдХрд░реНрд╖


рдЦрд╛рдирд╛ рдкрдХрд╛рдиреЗ рдФрд░ рдЦрдкрдд DWH рдЪрд┐рдХрдирд╛рдИ рдкреАрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрдЦрдж рдФрд░ рдлрд╛рдпрджреЗрдордВрдж рд╣реИред DBT рдореЗрдВ рдЬрд┐рдВрдЬрд╛, рдХрд╕реНрдЯрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рдореЙрдбреНрдпреВрд▓), рдХрдВрдкрд╛рдЗрд▓рд░, рдЗрдВрдЬрди (рдирд┐рд╖реНрдкрд╛рджрдХ) рдФрд░ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрди рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдПрдХрддреНрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд╛ рдкреВрд░рд╛ рдорд╛рд╣реМрд▓ рдорд┐рд▓рддрд╛ рд╣реИред рдЖрдЬ DWH рдХреЗ рднреАрддрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИред



рдбреАрдмреАрдЯреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреАрдЫрд╛ рдХреА рдЧрдИ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  • рдХреЛрдб, рдЬреАрдпреВрдЖрдИ рдирд╣реАрдВ, рдЬрдЯрд┐рд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рддрд░реНрдХ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрдореВрд░реНрдд рд╣реИ
  • рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╛рд╕ рдХреА рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ (рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ) рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

  • рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдбреЗрдЯрд╛ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдУрдкрди рд╕реЛрд░реНрд╕ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рди рдХреЗрд╡рд▓ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдЯреВрд▓, рдмрд▓реНрдХрд┐ рдХреЛрдб рддреЗрдЬреА рд╕реЗ рдУрдкрди рд╕реЛрд░реНрд╕ рд╕рдореБрджрд╛рдп рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЬрд╛рдПрдЧрд╛ред

рдЗрди рдореБрдЦреНрдп рдорд╛рдиреНрдпрддрд╛рдУрдВ рдиреЗ рдПрдХ рдРрд╕реЗ рдЙрддреНрдкрд╛рдж рдХреЛ рдЬрдиреНрдо рджрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЖрдЬ 850 рд╕реЗ рдЕрдзрд┐рдХ рдХрдВрдкрдирд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЖрдзрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗред

рдЬреЛ рд▓реЛрдЧ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдЦреБрд▓реЗ рд╕рдмрдХ рдХрд╛ рдПрдХ рд╡реАрдбрд┐рдпреЛ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ OTUS - Data Build Tool for Amazon Redshift рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдПрдХ рдЦреБрд▓реЗ рдкрд╛рда рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд┐рддрд╛рдпрд╛ рдерд╛ ред

рдУрдЯреАрдпреВрдПрд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдбреЗрдЯрд╛ рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЛрд░реНрд╕ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдбреАрдмреАрдЯреА рдФрд░ рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдФрд░ рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рдХрдИ рдЕрдиреНрдп рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдФрд░ рдЖрдзреБрдирд┐рдХ рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рдХрдХреНрд╖рд╛рдПрдВ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

  • рдмрд┐рдЧ рдбреЗрдЯрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ
  • рд╕реНрдкрд╛рд░реНрдХ рдФрд░ рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ
  • рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдФрд░ рдЙрдкрдХрд░рдг
  • 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,




.



All Articles