Data Build Tool jew dak li hu komuni bejn Data Warehouse u Smoothie
Fuq liema prinċipji hija mibnija Data Warehouse ideali?
Iffoka fuq il-valur tan-negozju u l-analiżi fin-nuqqas ta 'kodiċi boilerplate. Ġestjoni ta' DWH bħala bażi ta' kodiċi: verżjoni, reviżjoni, ittestjar awtomatizzat u CI. Modulari, estensibbli, sors miftuħ u komunità. Dokumentazzjoni faċli għall-utent u viżwalizzazzjoni tad-dipendenza (Data Lineage).
Aktar dwar dan kollu u dwar ir-rwol tad-DBT fl-ekosistema tal-Big Data & Analytics - welcome to cat.
Hello lil kulħadd
Artemy Kozyr hija f'kuntatt. Għal aktar minn 5 snin ilni naħdem ma’ mħażen tad-dejta, nibni ETL/ELT, kif ukoll analitika u viżwalizzazzjoni tad-dejta. Bħalissa qed naħdem fiha Fil-mod, ngħallem fl-OTUS fuq kors Inġinier tad-Dejta, u llum irrid naqsam magħkom artiklu li ktibt b'antiċipazzjoni tal-bidu reġistrazzjoni ġdida għall-kors.
Reviżjoni qasira
Il-qafas DBT huwa kollu dwar it-T fl-akronimu ELT (Extract - Transform - Load).
Bil-miġja ta 'databases analitiċi produttivi u skalabbli bħal BigQuery, Redshift, Snowflake, ma kien hemm l-ebda skop li jsiru trasformazzjonijiet barra d-Data Warehouse.
DBT ma jniżżilx dejta minn sorsi, iżda jipprovdi opportunitajiet kbar biex taħdem b'dejta li diġà tgħabba fil-Ħażna (f'Ħażna Interna jew Esterna).
L-għan ewlieni tad-DBT huwa li tieħu l-kodiċi, tikkumpilah f'SQL, tesegwixxi l-kmandi fis-sekwenza korretta fir-Repożitorju.
Struttura tal-Proġett DBT
Il-proġett jikkonsisti f'direttorji u fajls ta' 2 tipi biss:
Mudell (.sql) - unità ta 'trasformazzjoni espressa minn mistoqsija SELECT
Fajl ta 'konfigurazzjoni (.yml) - parametri, settings, testijiet, dokumentazzjoni
Fuq livell bażiku, ix-xogħol huwa strutturat kif ġej:
L-utent jipprepara kodiċi tal-mudell fi kwalunkwe IDE konvenjenti
Il-kodiċi SQL ikkumpilat jiġi esegwit fil-Ħażna f'sekwenza partikolari (graff)
Hawn kif tista' tidher li taħdem mill-CLI:
Kollox huwa SELECT
Din hija karatteristika qattiel tal-qafas tal-Għodda tal-Bini tad-Data. Fi kliem ieħor, DBT jastraxxi l-kodiċi kollu assoċjat mal-materjalizzazzjoni tal-mistoqsijiet tiegħek fil-Aħżen (varjazzjonijiet mill-kmandi CREATE, INSERT, UPDATE, DELETE ALTER, GRANT, ...).
Kwalunkwe mudell jinvolvi l-kitba ta' mistoqsija waħda SELECT li tiddefinixxi s-sett tad-dejta li jirriżulta.
F'dan il-każ, il-loġika tat-trasformazzjoni tista 'tkun f'diversi livelli u tikkonsolida data minn diversi mudelli oħra. Eżempju ta' mudell li se jibni vetrina tal-ordnijiet (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
X'affarijiet interessanti nistgħu naraw hawn?
L-ewwel: Użat CTE (Common Table Expressions) - biex torganizza u tifhem kodiċi li fih ħafna trasformazzjonijiet u loġika tan-negozju
It-tieni: Il-kodiċi tal-mudell huwa taħlita ta 'SQL u lingwa Jinja (lingwa tal-mudelli).
L-eżempju juża linja għall biex tiġġenera l-ammont għal kull metodu ta 'ħlas speċifikat fl-espressjoni stabbiliti. Il-funzjoni tintuża wkoll ref — il-kapaċità li ssir referenza għal mudelli oħra fil-kodiċi:
Waqt il-kumpilazzjoni ref se jiġi kkonvertit għal punter fil-mira għal tabella jew viżjoni fil-Ħażna
Ejja nagħmlu l-mili tiegħu inkrementali (Inkrementali)
Ejja nżidu ċwievet tas-segmentazzjoni u l-issortjar għal 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
Mudell graff tad-dipendenza
Hija wkoll siġra tad-dipendenza. Huwa magħruf ukoll bħala DAG (Grafika Aċiklika Diretta).
DBT jibni graff ibbażat fuq il-konfigurazzjoni tal-mudelli kollha tal-proġett, jew aħjar, ref() links fi ħdan mudelli għal mudelli oħra. Li jkollok graff jippermettilek tagħmel l-affarijiet li ġejjin:
Mudelli tat-tmexxija fis-sekwenza korretta
Parallelizzazzjoni tal-formazzjoni ta' storefront
Tmexxija ta' subgrafu arbitrarju
Eżempju ta' viżwalizzazzjoni tal-grafika:
Kull nodu tal-graff huwa mudell; it-truf tal-graff huma speċifikati mill-espressjoni ref.
Kwalità tad-Data u Dokumentazzjoni
Minbarra li tiġġenera l-mudelli nfushom, id-DBT jippermettilek tittestja għadd ta’ suppożizzjonijiet dwar is-sett tad-dejta li jirriżulta, bħal:
Mhux Null
Uniku
Integrità ta' Referenza - integrità referenzjali (per eżempju, customer_id fit-tabella tal-ordnijiet jikkorrispondi għal id fit-tabella tal-klijenti)
Tqabbil mal-lista ta' valuri aċċettabbli
Huwa possibbli li żżid it-testijiet tiegħek stess (testijiet tad-dejta apposta), bħal, pereżempju, % devjazzjoni tad-dħul b'indikaturi minn ġurnata, ġimgħa, xahar ilu. Kwalunkwe suppożizzjoni fformulata bħala mistoqsija SQL tista' ssir test.
B'dan il-mod, tista 'taqbad devjazzjonijiet u żbalji mhux mixtieqa fid-dejta fit-twieqi tal-Maħżen.
F'termini ta' dokumentazzjoni, DBT jipprovdi mekkaniżmi għaż-żieda, il-verżjoni u d-distribuzzjoni tal-metadejta u l-kummenti fil-livelli tal-mudell u anke tal-attributi.
Hawn kif tidher iż-żieda ta' testijiet u dokumentazzjoni fil-livell tal-fajl tal-konfigurazzjoni:
- 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']
U hawn kif tidher din id-dokumentazzjoni fuq il-websajt iġġenerata:
Makros u Moduli
L-iskop tad-DBT mhuwiex tant li jsir sett ta 'skripts SQL, iżda li jipprovdi lill-utenti b'mezzi b'saħħithom u b'ħafna karatteristiċi biex jibnu t-trasformazzjonijiet tagħhom stess u jqassmu dawn il-moduli.
Il-makros huma settijiet ta' kostruzzjonijiet u espressjonijiet li jistgħu jissejħu bħala funzjonijiet fi ħdan mudelli. Il-makros jippermettulek tuża mill-ġdid l-SQL bejn mudelli u proġetti skont il-prinċipju tal-inġinerija DRY (M'għandekx Irrepeti lilek innifsek).
Eżempju makro:
{% 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 %}
U l-użu tiegħu:
{% set column_name = 'product' %}
select
product,
{{ rename_category(column_name) }} -- вызов макроса
from my_table
DBT jiġi ma 'maniġer tal-pakketti li jippermetti lill-utenti jippubblikaw u jerġgħu jużaw moduli u macros individwali.
Dan ifisser li tkun tista' tagħbija u tuża libreriji bħal:
dbt_utils: taħdem mad-Data/Ħin, Ċwievet Surrogati, testijiet tal-Iskema, Pivot/Unpivot u oħrajn
Mudelli ta’ vetrina lesti għal servizzi bħal Snowplow и Stripe
Libreriji għal Data Stores speċifiċi, eż. Redshift
Lista sħiħa ta' pakketti tista' tinstab fuq hub dbt.
Saħansitra aktar possibbiltajiet
Hawnhekk ser niddeskrivi ftit karatteristiċi u implimentazzjonijiet interessanti oħra li jien u t-tim nużaw biex nibnu Data Warehouse fih Fil-mod.
Separazzjoni ta' ambjenti runtime DEV - TEST - PROD
Anke fi ħdan l-istess cluster DWH (fi skemi differenti). Per eżempju, billi tuża l-espressjoni li ġejja:
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 -%}
)
Dan il-kodiċi litteralment jgħid: għall-ambjenti dev, test, ci tieħu data biss għall-aħħar 3 ijiem u mhux aktar. Jiġifieri, it-tħaddim f'dawn l-ambjenti se jkun ħafna aktar mgħaġġel u jeħtieġ inqas riżorsi. Meta taħdem fuq l-ambjent produzzjoni il-kundizzjoni tal-filtru tkun injorata.
Redshift huwa DBMS kolonni li jippermettilek li tissettja algoritmi ta 'kompressjoni tad-dejta għal kull kolonna individwali. L-għażla ta 'algoritmi ottimali tista' tnaqqas l-ispazju tad-diska b'20-50%.
Makro redshift.compress_table se jesegwixxi l-kmand ANALYZE COMPRESSION, toħloq tabella ġdida bl-algoritmi ta 'kodifikazzjoni tal-kolonna rakkomandati, ċwievet ta' segmentazzjoni speċifikati (dist_key) u ċwievet ta 'ssortjar (sort_key), jittrasferixxi d-data lilha, u, jekk meħtieġ, ħassar il-kopja l-antika.
Il-modulu tal-illoggjar jippermettilek tirreġistra l-metadejta kollha meħtieġa f'tabella separata, li sussegwentement tista 'tintuża biex tivverifika u tanalizza l-konġestjonijiet.
Dan huwa kif jidher id-dashboard ibbażat fuq id-dejta tal-illoggjar f'Looker:
Awtomazzjoni tal-Manutenzjoni tal-Ħażna
Jekk tuża xi estensjonijiet tal-funzjonalità tar-Repożitorju użat, bħal UDF (Funzjonijiet Iddefiniti mill-Utent), allura l-verżjoni ta 'dawn il-funzjonijiet, il-kontroll tal-aċċess, u t-tnedija awtomatizzata ta' ħarġiet ġodda hija konvenjenti ħafna biex tagħmel f'DBT.
Aħna nużaw UDF f'Python biex nikkalkulaw il-hashes, id-dominji tal-email, u d-dekodifikazzjoni tal-bitmask.
Eżempju ta' makro li joħloq UDF fuq kwalunkwe ambjent ta' eżekuzzjoni (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 %}
Fuq Wheely nużaw Amazon Redshift, li hija bbażata fuq PostgreSQL. Għal Redshift, huwa importanti li tiġbor regolarment statistika fuq it-tabelli u tillibera spazju fuq id-diska - il-kmandi ANALYZE u VACUUM, rispettivament.
Biex tagħmel dan, il-kmandi mill-makro redshift_maintenance jiġu esegwiti kull lejl:
{% 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
Huwa possibbli li tuża DBT bħala servizz (Servizz Immexxi). Inklużi:
Web IDE għall-iżvilupp ta 'proġetti u mudelli
Konfigurazzjoni u skedar tax-xogħol
Aċċess sempliċi u konvenjenti għal zkuk
Websajt bid-dokumentazzjoni tal-proġett tiegħek
Konnessjoni ta' CI (Integrazzjoni Kontinwa)
Konklużjoni
Il-preparazzjoni u l-konsum tad-DWH isiru pjaċevoli u ta 'benefiċċju daqs ix-xorb ta' smoothie. DBT jikkonsisti minn Jinja, estensjonijiet tal-utent (moduli), kompilatur, eżekutur, u maniġer tal-pakketti. Billi tgħaqqad dawn l-elementi flimkien ikollok ambjent tax-xogħol sħiħ għad-Data Warehouse tiegħek. Bilkemm hemm mod aħjar biex timmaniġġja t-trasformazzjoni fi ħdan id-DWH illum.
It-twemmin segwit mill-iżviluppaturi tad-DBT huwa fformulat kif ġej:
Il-kodiċi, mhux GUI, huwa l-aħjar astrazzjoni biex tesprimi loġika analitika kumplessa
Il-ħidma mad-dejta għandha tadatta l-aħjar prattiki fl-inġinerija tas-softwer (Inġinerija tas-Software)
L-infrastruttura kritika tad-dejta għandha tkun ikkontrollata mill-komunità tal-utenti bħala softwer ta' sors miftuħ
Mhux biss l-għodod analitiċi, iżda wkoll il-kodiċi se jsiru dejjem aktar proprjetà tal-komunità Open Source
Dawn it-twemmin ewlieni nissel prodott li jintuża minn aktar minn 850 kumpanija llum, u jiffurmaw il-bażi ta 'ħafna estensjonijiet eċċitanti li se jinħolqu fil-futur.
Minbarra d-DBT u l-Magazzinaġġ tad-Data, bħala parti mill-kors tal-Inġinier tad-Data fuq il-pjattaforma OTUS, jien u l-kollegi tiegħi ngħallmu klassijiet dwar għadd ta’ suġġetti oħra rilevanti u moderni:
Kunċetti Arkitettoniċi għal Applikazzjonijiet ta' Big Data
Prattika bi Spark u Spark Streaming
Jesploraw metodi u għodod għat-tagħbija tas-sorsi tad-dejta
Bini ta’ vetrini analitiċi fid-DWH
Kunċetti NoSQL: HBase, Cassandra, ElasticSearch
Prinċipji ta' monitoraġġ u orkestrazzjoni
Proġett Finali: tpoġġi l-ħiliet kollha flimkien taħt appoġġ ta' mentoring