
çæ³çãªããŒã¿ ãŠã§ã¢ããŠã¹ã¯ã©ã®ãããªååã«åºã¥ããŠæ§ç¯ãããŠããŸãã?
å®åçãªã³ãŒãããªãäžã§ãããžãã¹äŸ¡å€ãšåæã«çŠç¹ãåœãŠãŸããã³ãŒãããŒã¹ãšããŠã® DWH ã®ç®¡ç: ããŒãžã§ã³ç®¡çãã¬ãã¥ãŒãèªåãã¹ããCIãã¢ãžã¥ãŒã«åŒãæ¡åŒµå¯èœããªãŒãã³ãœãŒã¹ãã³ãã¥ããã£ããŠãŒã¶ãŒãã¬ã³ããªãŒãªããã¥ã¡ã³ããšäŸåé¢ä¿ã®èŠèŠå (ããŒã¿ãªããŒãžã¥)ã
ããããã¹ãŠãšãããã°ããŒã¿ãšåæãšã³ã·ã¹ãã ã«ããã DBT ã®åœ¹å²ã«ã€ããŠè©³ããã¯ãcat ãžããããã
ãããã
ã¢ã«ãããŒã»ã³ãºã£ã«ããé£çµ¡ããããŸãã 5 幎以äžãç§ã¯ããŒã¿ ãŠã§ã¢ããŠã¹ãETL/ELT ã®æ§ç¯ãããŒã¿åæãšèŠèŠåã«åãçµãã§ããŸãããç§ã¯çŸåšåããŠããŸã , ç§ã¯OTUSã§ã³ãŒã¹ãæããŠããŸã ãããŠä»æ¥ã¯ãéå§ãäºæããŠæžããèšäºãå ±æããããšæããŸã ã³ãŒã¹ãžã®æ°èŠç»é².
æŠèŠ
DBT ãã¬ãŒã ã¯ãŒã¯ã¯ãELT (æœåº - 倿 - ããŒã) ã®é åèªã® T ããã¹ãŠã§ãã
BigQueryãRedshiftãSnowflake ãªã©ã®çç£æ§ãšã¹ã±ãŒã©ãã«ãªåæããŒã¿ããŒã¹ã®åºçŸã«ãããããŒã¿ ãŠã§ã¢ããŠã¹ã®å€ã§å€æãè¡ãæå³ããªããªããŸããã
DBT ã¯ãœãŒã¹ããããŒã¿ãããŠã³ããŒãããŸããããæ¢ã«ã¹ãã¬ãŒãž (å éšã¹ãã¬ãŒãžãŸãã¯å€éšã¹ãã¬ãŒãž) ã«ããŒããããŠããããŒã¿ãæäœããåªããæ©äŒãæäŸããŸãã

DBT ã®äž»ãªç®çã¯ãã³ãŒããååŸã㊠SQL ã«ã³ã³ãã€ã«ãããªããžããªå
ã§æ£ããé åºã§ã³ãã³ããå®è¡ããããšã§ãã
DBT ãããžã§ã¯ãã®æ§é
ãããžã§ã¯ãã¯ã次㮠2 çš®é¡ã®ã¿ã®ãã£ã¬ã¯ããªãšãã¡ã€ã«ã§æ§æãããŸãã
- ã¢ãã« (.sql) - SELECT ã¯ãšãªã«ãã£ãŠè¡šçŸããã倿ã®åäœ
- æ§æãã¡ã€ã« (.yml) - ãã©ã¡ãŒã¿ãŒãèšå®ããã¹ããããã¥ã¡ã³ã
åºæ¬çãªã¬ãã«ã§ã¯ãäœæ¥ã¯æ¬¡ã®ããã«æ§æãããŠããŸãã
- ãŠãŒã¶ãŒã¯ä»»æã®äŸ¿å©ãª IDE ã§ã¢ãã« ã³ãŒããæºåããŸãã
- CLI ã䜿çšããŠã¢ãã«ãèµ·åãããDBT ãã¢ãã« ã³ãŒãã SQL ã«ã³ã³ãã€ã«ããŸãã
- ã³ã³ãã€ã«ããã SQL ã³ãŒãã¯ã¹ãã¬ãŒãžå ã§æå®ãããé åºã§å®è¡ãããŸã (ã°ã©ã)
CLI ããå®è¡ãããšæ¬¡ã®ããã«ãªããŸãã

ãã¹ãŠã¯SELECTã§ã
ããã¯ãããŒã¿æ§ç¯ããŒã« ãã¬ãŒã ã¯ãŒã¯ã®éèŠãªæ©èœã§ããèšãæããã°ãDBT ã¯ãã¯ãšãªãã¹ãã¢ã«å ·äœåããããšã«é¢é£ãããã¹ãŠã®ã³ãŒããæœè±¡åããŸã (ã³ãã³ã CREATEãINSERTãUPDATEãDELETE ALTERãGRANT ãªã©ããã®ããªãšãŒã·ã§ã³)ã
ã©ã®ã¢ãã«ã§ããçµæã®ããŒã¿ ã»ãããå®çŸ©ãã 1 ã€ã® 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 (å ±éããŒãã«åŒ) ãäœ¿çš - å€ãã®å€æãšããžãã¹ ããžãã¯ãå«ãã³ãŒããæŽçããŠçè§£ããããã«
2 çªç®: ã¢ãã« ã³ãŒã㯠SQL ãšèšèªã®æ··åç©ã§ãã (ãã³ãã¬ãŒãèšèª)ã
ãã®äŸã§ã¯ã«ãŒãã䜿çšããŠããŸã ã® åŒã§æå®ããã忝æãæ¹æ³ã®éé¡ãçæããã«ã¯ ã»ãã·ã§ã³ã«ãæ©èœã䜿ãããŠããŸã åç § â ã³ãŒãå ã§ä»ã®ã¢ãã«ãåç §ããæ©èœ:
- ã³ã³ãã€ã«äž åç § ã¹ãã¬ãŒãžå ã®ããŒãã«ãŸãã¯ãã¥ãŒãžã®ã¿ãŒã²ãã ãã€ã³ã¿ãŒã«å€æãããŸã
- åç § ã¢ãã«ã®äŸåé¢ä¿ã°ã©ããæ§ç¯ã§ããŸã
ããªãã¡ DBT ã«ã»ãŒç¡éã®å¯èœæ§ã远å ããŸããæãäžè¬çã«äœ¿çšããããã®ã¯æ¬¡ã®ãšããã§ãã
- If / else ã¹ããŒãã¡ã³ã - åå²ã¹ããŒãã¡ã³ã
- for ã«ãŒã
- 倿°
- ãã¯ã - ãã¯ãã®äœæ
ãããªã¢ã©ã€ãŒãŒã·ã§ã³: ããŒãã«ããã¥ãŒãã€ã³ã¯ãªã¡ã³ã¿ã«
ãããªã¢ã©ã€ãŒãŒã·ã§ã³æŠç¥ã¯ãçµæãšããŠåŸãããã¢ãã« ããŒã¿ã®ã»ãããã¹ãã¬ãŒãžã«ä¿åããæ¹æ³ã§ãã
åºæ¬çã«ã¯æ¬¡ã®ãšããã§ãã
- ããŒãã« - ã¹ãã¬ãŒãžå ã®ç©çããŒãã«
- ãã¥ãŒ - ã¹ãã¬ãŒãžå ã®ãã¥ãŒãä»®æ³ããŒãã«
ããã«è€éãªå ·äœåæŠç¥ããããŸãã
- å¢å - (倧ããªãã¡ã¯ã ããŒãã«ã®) å¢åèªã¿èŸŒã¿ãæ°ããè¡ã远å ããã倿Žãããè¡ãæŽæ°ãããåé€ãããè¡ã¯ã¯ãªã¢ãããŸã
- äžæç - ã¢ãã«ã¯çŽæ¥å ·äœåãããŸããããä»ã®ã¢ãã«ã« CTE ãšããŠåå ããŸãã
- èªåã§è¿œå ã§ãããã®ä»ã®æŠç¥
ãããªã¢ã©ã€ãŒãŒã·ã§ã³æŠç¥ã«å ããŠã次ã®ãããªç¹å®ã®ã¹ãã¬ãŒãžãæé©åããæ©äŒããããŸãã
- ã¹ããŒãã¬ãŒã¯: äžæããŒãã«ãããŒãžåäœãããŒãã« ã¯ã©ã¹ã¿ãªã³ã°ãã³ããŒèš±å¯ãå®å šãªãã¥ãŒ
- ã¬ããã·ãã: DistkeyãSortkey (ã€ã³ã¿ãŒãªãŒããè€å)ãLate Binding Views
- ããã°ã¯ãšãªãŒ: ããŒãã«ã®ããŒãã£ã·ã§ãã³ã°ãšã¯ã©ã¹ã¿ãªã³ã°ãããŒãžåäœãKMS æå·åãã©ãã«ãšã¿ã°
- ã¹ããŒã¯: ãã¡ã€ã«åœ¢åŒ (parquetãcsvãjsonãorcãdelta)ãpartition_byãclustered_byããã±ãããincremental_strategy
çŸåšã次ã®ã¹ãã¬ãŒãžããµããŒããããŠããŸãã
- Postgres
- ã¬ããã·ãã
- ããã°ã¯ãšãªãŒ
- ã¹ããŒãã¬ãŒã¯
- ãã¬ã¹ãïŒäžéšïŒ
- ã¹ããŒã¯ïŒäžéšïŒ
- 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 (æåéå·¡åã°ã©ã) ãšããŠãç¥ãããŠããŸãã
DBT ã¯ããã¹ãŠã®ãããžã§ã¯ã ã¢ãã«ã®æ§æã«åºã¥ããŠã°ã©ããæ§ç¯ããŸããã€ãŸããã¢ãã«å ã®ä»ã®ã¢ãã«ãžã® ref() ãªã³ã¯ã§ããã°ã©ãã䜿çšãããšã次ã®ããšãå¯èœã«ãªããŸãã
- ã¢ãã«ãæ£ããé åºã§å®è¡ãã
- åºé 圢æã®äžŠåå
- ä»»æã®ãµãã°ã©ãã®å®è¡
ã°ã©ãã®èŠèŠåã®äŸ:

ã°ã©ãã®åããŒãã¯ã¢ãã«ã§ãããã°ã©ãã®ãšããžã¯åŒ ref ã«ãã£ãŠæå®ãããŸãã
ããŒã¿å質ãšããã¥ã¡ã³ã
DBT ã§ã¯ãã¢ãã«èªäœãçæããã ãã§ãªããçµæã®ããŒã¿ã»ããã«é¢ããæ¬¡ã®ãããªããŸããŸãªä»®å®ããã¹ãã§ããŸãã
- Null ã§ã¯ãããŸãã
- ãŠããŒã¯ãª
- åç §æŽåæ§ - åç §æŽåæ§ (ããšãã°ãorders ããŒãã«ã® customer_id ã¯ãcustomers ããŒãã«ã® id ã«å¯Ÿå¿ããŸã)
- 蚱容å¯èœãªå€ã®ãªã¹ããšã®äžèŽ
ããšãã°ã1 æ¥ã1 é±éã1 ãæåã®ã€ã³ãžã±ãŒã¿ãŒã«ããåçã® % åå·®ãªã©ãç¬èªã®ãã¹ã (ã«ã¹ã¿ã ããŒã¿ ãã¹ã) ã远å ããããšãã§ããŸãã 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']
çæããã Web ãµã€ãäžã§ãã®ããã¥ã¡ã³ããã©ã®ããã«è¡šç€ºããããã¯æ¬¡ã®ãšããã§ãã

ãã¯ããšã¢ãžã¥ãŒã«
DBT ã®ç®çã¯ãSQL ã¹ã¯ãªããã®ã»ããã«ãªãããšã§ã¯ãªããç¬èªã®å€æãæ§ç¯ãããããã®ã¢ãžã¥ãŒã«ãé åžããããã®åŒ·åã§æ©èœè±å¯ãªææ®µããŠãŒã¶ãŒã«æäŸããããšã§ãã
ãã¯ãã¯ãã¢ãã«å ã§é¢æ°ãšããŠåŒã³åºãããšãã§ããæ§æèŠçŽ ãšåŒã®ã»ããã§ãããã¯ãã䜿çšãããšãDRY (Don't Reply Yourself) ãšã³ãžãã¢ãªã³ã°ååã«åŸã£ãŠãã¢ãã«ãšãããžã§ã¯ãéã§ 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 ã«ã¯ããŠãŒã¶ãŒãåã ã®ã¢ãžã¥ãŒã«ããã¯ããå ¬éããã³åå©çšã§ããããã«ããããã±ãŒãž ãããŒãžã£ãŒãä»å±ããŠããŸãã
ããã¯ã次ã®ãããªã©ã€ãã©ãªãããŒãããŠäœ¿çšã§ããããšãæå³ããŸãã
- : æ¥ä»/æå»ããµãã²ãŒã ããŒãã¹ããŒã ãã¹ãããããã/ã¢ã³ãããããªã©ã®æäœ
- 次ã®ãããªãµãŒãã¹çšã®æ¢è£œã®ã·ã§ãŒã±ãŒã¹ ãã³ãã¬ãŒã О
- ç¹å®ã®ããŒã¿ ã¹ãã¢çšã®ã©ã€ãã©ãªã
- â 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 -%}
)
ãã®ã³ãŒãã¯æåéãæ¬¡ã®ããã«è¿°ã¹ãŠããŸã: ç°å¢åã éçºããã¹ããCI éå» 3 æ¥éã®ã¿ããŒã¿ãååŸãããã以éã¯ããŒã¿ãååŸããŸãããã€ãŸãããããã®ç°å¢ã§ã®å®è¡ã¯ã¯ããã«é«éã«ãªããå¿ èŠãªãªãœãŒã¹ãå°ãªããªããŸããç°å¢äžã§å®è¡ããå Žå çªã ãã£ã«ã¿æ¡ä»¶ã¯ç¡èŠãããŸãã
代æ¿åãšã³ã³ãŒãã£ã³ã°ã䜿çšããå®äœå
Redshift ã¯ãåã ã®åããšã«ããŒã¿å§çž®ã¢ã«ãŽãªãºã ãèšå®ã§ããåæå DBMS ã§ããæé©ãªã¢ã«ãŽãªãºã ãéžæãããšããã£ã¹ã¯å®¹éã 20 ïœ 50% åæžã§ããŸãã
倧ãã 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) }}
ã¢ãã«ã®å®è¡ã®ãã°ãèšé²ãã
ã¢ãã«ã®åå®è¡ã«ããã¯ãã¢ã¿ããã§ããŸããããã¯ã¯ãèµ·ååãŸãã¯ã¢ãã«ã®äœæå®äºçŽåŸã«å®è¡ãããŸãã
pre-hook: "{{ logging.log_model_start_event() }}"
post-hook: "{{ logging.log_model_end_event() }}"
ãã®ã³ã° ã¢ãžã¥ãŒã«ã䜿çšãããšãå¿ èŠãªãã¹ãŠã®ã¡ã¿ããŒã¿ãå¥ã®ããŒãã«ã«èšé²ã§ããåŸã§ããã«ããã¯ã®ç£æ»ãšåæã«äœ¿çšã§ããŸãã
Looker ã®ãã° ããŒã¿ã«åºã¥ãããã·ã¥ããŒãã¯æ¬¡ã®ããã«ãªããŸãã

ã¹ãã¬ãŒãžã¡ã³ããã³ã¹ã®èªåå
UDF (ãŠãŒã¶ãŒå®çŸ©é¢æ°) ãªã©ã䜿çšãããªããžããªã®æ©èœã®æ¡åŒµæ©èœã䜿çšããå Žåããããã®é¢æ°ã®ããŒãžã§ã³ç®¡çãã¢ã¯ã»ã¹å¶åŸ¡ãæ°ãããªãªãŒã¹ã®èªåããŒã«ã¢ãŠãã DBT ã§è¡ããšéåžžã«äŸ¿å©ã§ãã
Python ã® UDF ã䜿çšããŠãããã·ã¥ãé»åã¡ãŒã« ãã¡ã€ã³ãããã³ããããã¹ã¯ ãã³ãŒããèšç®ããŸãã
ä»»æã®å®è¡ç°å¢ (devãtestãprod) ã§ 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 ã§ã¯ãPostgreSQL ãããŒã¹ã«ãã Amazon Redshift ã䜿çšããŠããŸãã Redshift ã®å ŽåãããŒãã«ã®çµ±èšã宿çã«åéãããã£ã¹ã¯é åãè§£æŸããããšãéèŠã§ã (ãããã ANALYZE ããã³ VACUUM ã³ãã³ã)ã
ãããè¡ãããã«ãredshift_maintenance ãã¯ãã®ã³ãã³ããæ¯æ©å®è¡ãããŸãã
{% macro redshift_maintenance() %}
{% set vacuumable_tables=run_query(vacuumable_tables_sql) %}
{% for row in vacuumable_tables %}
{% set message_prefix=loop.index ~ " of " ~ loop.length %}
{%- set relation_to_vacuum = adapter.get_relation(
database=row['table_database'],
schema=row['table_schema'],
identifier=row['table_name']
) -%}
{% do run_query("commit") %}
{% if relation_to_vacuum %}
{% set start=modules.datetime.datetime.now() %}
{{ dbt_utils.log_info(message_prefix ~ " Vacuuming " ~ relation_to_vacuum) }}
{% do run_query("VACUUM " ~ relation_to_vacuum ~ " BOOST") %}
{{ dbt_utils.log_info(message_prefix ~ " Analyzing " ~ relation_to_vacuum) }}
{% do run_query("ANALYZE " ~ relation_to_vacuum) %}
{% set end=modules.datetime.datetime.now() %}
{% set total_seconds = (end - start).total_seconds() | round(2) %}
{{ dbt_utils.log_info(message_prefix ~ " Finished " ~ relation_to_vacuum ~ " in " ~ total_seconds ~ "s") }}
{% else %}
{{ dbt_utils.log_info(message_prefix ~ ' Skipping relation "' ~ row.values() | join ('"."') ~ '" as it does not exist') }}
{% endif %}
{% endfor %}
{% endmacro %}
DBTã¯ã©ãŠã
DBTããµãŒãã¹ïŒãããŒãžããµãŒãã¹ïŒãšããŠå©çšããããšãå¯èœã§ããå«ãŸãããã®:
- ãããžã§ã¯ããšã¢ãã«ãéçºããããã® Web IDE
- ãžã§ãã®æ§æãšã¹ã±ãžã¥ãŒã«èšå®
- ãã°ãžã®ç°¡åãã€äŸ¿å©ãªã¢ã¯ã»ã¹
- ãããžã§ã¯ãã®ããã¥ã¡ã³ããæ²èŒãããŠãã Web ãµã€ã
- CIïŒç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒãæ¥ç¶ãã

ãŸãšã
DWH ãæºåããŠæåããããšã¯ãã¹ã ãŒãžãŒã飲ãã®ãšåããããæ¥œãããŠæçã«ãªããŸãã DBT ã¯ãJinjaããŠãŒã¶ãŒæ¡åŒµæ©èœ (ã¢ãžã¥ãŒã«)ãã³ã³ãã€ã©ãŒããšã°ãŒãã¥ãŒã¿ãŒãããã³ããã±ãŒãž ãããŒãžã£ãŒã§æ§æãããŸãããããã®èŠçŽ ãçµã¿åãããããšã§ãããŒã¿ ãŠã§ã¢ããŠã¹ã®å®å šãªäœæ¥ç°å¢ãåŸãããŸããçŸåšãDWH å ã®å€é©ã管çããããããè¯ãæ¹æ³ã¯ã»ãšãã©ãããŸããã
DBT ã®éçºè ãåŸãä¿¡å¿µã¯æ¬¡ã®ããã«å®åŒåãããŸãã
- è€éãªåæããžãã¯ã衚çŸããã«ã¯ãGUI ã§ã¯ãªãã³ãŒããæé©ãªæœè±¡åã§ã
- ããŒã¿ã®æäœã«ã¯ããœãããŠã§ã¢ ãšã³ãžãã¢ãªã³ã°ã®ãã¹ã ãã©ã¯ãã£ã¹ãé©çšããå¿ èŠããããŸã (ãœãããŠã§ã¢ ãšã³ãžãã¢ãªã³ã°)
- éèŠãªããŒã¿ã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ãªãŒãã³ãœãŒã¹ãœãããŠã§ã¢ãšããŠãŠãŒã¶ãŒã³ãã¥ããã£ã«ãã£ãŠç®¡çãããã¹ãã§ã
- åæããŒã«ã ãã§ãªããã³ãŒãããŸããŸããªãŒãã³ãœãŒã¹ ã³ãã¥ããã£ã®ææç©ã«ãªãã§ããã
ãããã®æ žãšãªã信念ã¯ãçŸåš 850 瀟ãè¶ ããäŒæ¥ã§äœ¿çšãããŠãã補åãçã¿åºããå°æ¥äœæãããå€ãã®ãšããµã€ãã£ã³ã°ãªæ¡åŒµæ©èœã®åºç€ã圢æããŠããŸãã
èå³ã®ããæ¹ã®ããã«ãOTUS ã§ã®å ¬éã¬ãã¹ã³ã®äžç°ãšããŠæ°ãæåã«ç§ãè¡ã£ãå ¬éã¬ãã¹ã³ã®ãããªããããŸã - .
DBT ãšããŒã¿ ãŠã§ã¢ããŠãžã³ã°ã«å ããŠãOTUS ãã©ãããã©ãŒã ã®ããŒã¿ ãšã³ãžã㢠ã³ãŒã¹ã®äžç°ãšããŠãååãšç§ã¯ä»ã®å€ãã®é¢é£ããçŸä»£çãªãããã¯ã«é¢ããã¯ã©ã¹ãæããŠããŸãã
- ããã°ããŒã¿ ã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£æŠå¿µ
- Spark ãš Spark Streaming ã䜿ã£ãŠç·Žç¿ãã
- ããŒã¿ãœãŒã¹ãããŒãããããã®æ¹æ³ãšããŒã«ã調ã¹ã
- DWH ã§ã®åæã·ã§ãŒã±ãŒã¹ã®æ§ç¯
- NoSQL ã®æŠå¿µ: HBaseãCassandraãElasticSearch
- ã¢ãã¿ãªã³ã°ãšãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã®åå
- æçµãããžã§ã¯ã: ã¡ã³ã¿ãªã³ã°ãµããŒãã®äžã§ãã¹ãŠã®ã¹ãã«ããŸãšãã
ãªã³ã¯ïŒ
- â å ¬åŒããã¥ã¡ã³ã
- â DBT ã®èè ã®äžäººã«ããã¬ãã¥ãŒèšäº
- â YouTubeãOTUS å ¬éã¬ãã¹ã³ã®é²ç»
- â æ¬¡åã®å ¬éã¬ãã¹ã³ã¯15幎2020æXNUMXæ¥ã§ã
- âãªãŒã¿ã¹
- â ããŒã¿ãšåæã®æªæ¥ã屿ãã
- â ã¢ããªãã£ã¯ã¹ã®é²åãšãªãŒãã³ãœãŒã¹ã®åœ±é¿
- â DBT ã䜿çšãã CI æ§ç¯ã®åå
- â ç¬ç«ããäœæ¥ã®ããã®å®è·µã段éçãªæç€º
- â Githubãæè²ãããžã§ã¯ã ã³ãŒã
åºæïŒ habr.com

