{% 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 (Ифодаҳои Ҷадвали умумӣ) - барои ташкил ва фаҳмидани код, ки дорои бисёр тағирот ва мантиқи тиҷорӣ мебошад
Биёед калидҳои сегментатсия ва ҷудокуниро барои 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 маълум аст (Графикаи мустақими асикликӣ).
Шумо метавонед санҷишҳои шахсии худро (санҷишҳои фармоишии маълумот) илова кунед, масалан,% инҳироф аз даромад бо нишондиҳандаҳо аз як рӯз, ҳафта, як моҳ пеш. Ҳар як тахмине, ки ҳамчун дархости 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']
Мақсади DBT на он қадар табдил додани маҷмӯи скриптҳои 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_utils: кор бо сана/вақт, калидҳои ивазкунанда, санҷишҳои схема, Pivot/Unpivot ва ғайра
Шаблонҳои намоишии тайёр барои хидматҳо ба монанди Барфреза и хат
Ҳатто дар дохили як кластери 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% кам кунад.
макро redshift.compress_table фармони ANALYZE COMPRESSION -ро иҷро мекунад, ҷадвали навро бо алгоритмҳои рамзгузории сутуни тавсияшуда, калидҳои муайяншудаи сегментатсия (диst_key) ва калидҳои ҷудокунӣ (sort_key) месозад, маълумотро ба он интиқол медиҳад ва дар ҳолати зарурӣ нусхаи кӯҳнаро нест мекунад.
Илова ба DBT ва анбори додаҳо, дар доираи курси муҳандиси маълумот дар платформаи OTUS, ман ва ҳамкорони ман дар як қатор дигар мавзӯъҳои муҳим ва муосир дарсҳо меомӯзем:
Консепсияҳои меъморӣ барои барномаҳои Big Data
Бо Spark ва Spark Streaming машқ кунед
Омӯзиши усулҳо ва асбобҳо барои боркунии манбаъҳои маълумот