نیک آموز > وبلاگ > مهندسی داده > آموزش DBT در ۷ گام؛ ساخت و مدیریت خط لوله داده با SQL آموزش DBT در ۷ گام؛ ساخت و مدیریت خط لوله داده با SQL مهندسی داده مسیر مهندسی داده نوشته شده توسط: تیم فنی نیک آموز تاریخ انتشار: ۳۰ آذر ۱۴۰۰ آخرین بروزرسانی: 25 اسفند 1404 زمان مطالعه: 15 دقیقه ۴.۲ (۶۸۵) آموزش dbt مقدمهای برای آشنایی با ابزاری محبوب در مهندسی داده است. اگر دانشجو، تحلیلگر یا مهندس داده هستید و میخواهید با نحوه استفاده از DBT آشنا شوید، این مطلب برای شماست. بیشتر نرمافزارهای امروزی از دیتابیسهای رابطهای یا NoSQL استفاده میکنند و زبان مشترک اغلب آنها SQL است. بهدلیل حجم زیاد دادهها و کند شدن کوئریهای تحلیلی روی جداول اصلی، شرکتها معمولاً دادهها را بهصورت دورهای خوانده، پردازش کرده و نتایج را در جداول خلاصه یا انباره داده ذخیره میکنند. برای مثال میتوان آمار فروش ساعتی یک فروشگاه را محاسبه و در جدول تجمیعی ذخیره کرد تا ابزارهای هوش تجاری بهجای جدول اصلی از آن استفاده کنند. DBT دقیقاً برای مدیریت چنین فرایندهای مبتنی بر SQL توسعه یافته است. در این مقاله از نیک آموز، قصد داریم به صورت کاربردی با این ابزار مفید حوزه زیرساخت داده، آشنا شویم. 💡 با شرکت در دوره Data Lakehouse مقدماتی، مبانی معماری مدرن داده را بهصورت اصولی بیاموزید و یادگیری حرفهای خود را آغاز کنید. فهرست محتوایی Toggle DBT مرحله تبدیل در خط لوله ELTپروژهپیشنیازهاتنظیمات و اتصالاتجریان دادهمنبعSnapshotsزمانبندیسخن پایانی آموزش dbtسوالات متداول آموزش dbt۱. DBT چیست و چه کاربردی دارد؟۲. DBT در کدام مرحله از خط لوله داده استفاده میشود؟۳. مدلها در DBT چه هستند؟۴. چه نوع تستهایی در DBT وجود دارد؟۵. Snapshot در DBT چه کاربردی دارد؟۶. چرا از جداول تجمیعی در پردازش داده استفاده میشود؟۷. چگونه میتوان اجرای دستورات DBT را زمانبندی کرد؟ DBT مرحله تبدیل در خط لوله ELT در کاربردهای امروزی پردازش داده، به جای ETL گاهی اوقات از ELT استفاده میکنیم. یعنی ابتدا داده را دریافت میکنیم (E)، آنها را ذخیره کرده (L) و پس از آن به پردازش دادهها و به روز رسانی دیتابیس، اقدام میکنیم. (T) در خط لوله ELT، دادههای خام در انبار داده بارگذاری میشوند که با این کار، دو مرحله استخراج (Extract) و بارگذاری دادهها (Load) یعنی مراحل E و L انجام شده است. در مرحله تبدیل (Trasform)، اگر مبدا و مقصد ما از SQL پشتیبانی کند، DBT میتواند وارد عمل شود. در این صورت، دادههای خام که در انبار داده بارگذاری شدهاند با استفاده از کوئریهای SQL که روی دادههای انبار داده اجرا میشود به جداول قابل استفاده تبدیل میشوند. DBT یک راه آسان برای ایجاد، تبدیل و اعتبارسنجی دادهها در یک انبار داده ارائه میدهد. یعنی مرحله T در خط لوله ELT را انجام میدهد. در DBT ما با مدلهایی کار میکنیم که یک فایل SQL با دستور Select است. این مدلها میتوانند به مدلهای دیگر وابسته باشند، تستهایی بر روی آنها تعریف شده باشد و همچنین میتوانند به صورت جدول یا view ایجاد شوند. نام مدلهای ایجاد شده توسط DBT نام فایل آنهاست. به عنوان مثال. فایل dim_customers.sql مدلی با نام dim_customers را نشان میدهد. این مدل به مدلهای stg_eltool__customers و stg_eltool__state بستگی دارد. همچنین مدل dim_customers را میتوان در سایر تعاریف مدل ارجاع داد. قطعه کد زیر یک فرایند تبدیل ساده را در DBT نشان میدهد. with customers as ( select * from {{ ref('stg_eltool__customers') }} ), state as ( select * from {{ ref('stg_eltool__state') }} ) select c.customer_id, c.zipcode, c.city, c.state_code, s.state_name, c.datetime_created, c.datetime_updated, c.dbt_valid_from::TIMESTAMP as valid_from, CASE WHEN c.dbt_valid_to IS NULL THEN '9999-12-31'::TIMESTAMP ELSE c.dbt_valid_to::TIMESTAMP END as valid_to from customers c join state s on c.state_code = s.state_code ما میتوانیم تستهایی را برای اجرا روی دادههای پردازش شده با استفاده از dbt تعریف کنیم. dbt به ما امکان میدهد ۲ نوع تست ایجاد کنیم، تستها عبارتند از: تستهای عمومی: Unique ،not_null ،accepted_values و relationships تستهایی هستند که روی هر ستون اعمال میشوند و در فایل YAML تعریف شدهاند. تستهای سفارشی: اسکریپت های Sql که در فولدر تستها ایجاد میشوند. آنها میتوانند هر کوئریای باشند. اگر اسکریپتهای sql هیچ ردیفی را برنگردانند، نتیجه تست موفقیتآمیز است و در غیر این صورت تست ناموفق است. version: 2 models: - name: dim_customers columns: - name: customer_id tests: - not_null # checks if customer_id column in dim_customers is not null - name: fct_orders پروژه سناریوی زیر را در نظر بگیرید: تیم بازاریابی از ما درخواست میکند که یک جدول customer_orders عدم نرمالسازی شده با اطلاعات مربوط به هر سفارشی که توسط مشتریان ارسال میشود، ایجاد کنیم. فرض میکنیم که دادههای مشتریان و سفارشها توسط فرآیندی در انبار داده بارگذاری میشوند. فرآیندی که برای آوردن این دادهها به انبار داده ما استفاده میشود، مراحل EL از خط پردازش داده ELT است. این قسمت را میتوان با استفاده از یک سرویس مانند Fivetran، Stitch یا سرویسهای منبع باز مانند Singer ،Airbyte یا با استفاده از یک سرویس سفارشی انجام داد. در ادامه قصد داریم ببینیم که دادههای ما با جدول غیرنرمال، چطور به دادههای نهایی تبدیل میشوند. پروژه dbt پیشنیازها برای پیادهسازی این سناریو و انجام این کارگاه عملی، به پیشنیازهای زیر نیاز خواهیم داشت. Docker and Docker compose dbt pgcli git git clone https://github.com/josephmachado/simple_dbt_project.git export DBT_PROFILES_DIR=$(pwd) docker compose up -d cd simple_dbt_project کانتینر docker انبار داده را از گیت دریافت و راهاندازی کنید. به طور پیشفرض dbt به دنبال کانکشنهای دیتابس، در فایل ~/.dbt/profiles.yml میگردد. متغیر محیطی DBT_PROFILES_DIR به dbt می گوید که فایل profiles.yml را در دایرکتوری کاری فعلی جستجو کند. همچنین میتوانید با استفاده از dbt init یک پروژه dbt ایجاد کنید. این روش یک نمونه پروژه را در اختیار شما قرار میدهد که میتوانید آن را تغییر دهید. در پوشه simple_dbt_project فولدرهای زیر را مشاهده خواهید کرد. پیشنیاز dbt فولدر analysis: هر فایل sql که در این پوشه یافت میشود، با اجرای dbt compile به sql خام کامپایل میشود. آنها توسط dbt اجرا نمیشوند، اما میتوان آنها را در هر ابزار دلخواه کپی کرد. فولدر data: میتوانیم دادههای خامی را که میخواهیم در انبار داده خود بارگذاری کنیم، در این فولدر ذخیره کنیم. گرچه معمولاً برای ذخیره دادههای نقشهبرداری[۱] کوچک استفاده میشود. ماکروها: Dbt به کاربران اجازه میدهد تا ماکروهایی ایجاد کنند که توابع مبتنی بر sql هستند. این ماکروها را میتوان در پروژههای دیگر استفاده مجدد نمود. در بخشهای زیر به بررسی فولدرهای باقی مانده یعنی models، snapshots و tests میپردازیم. تنظیمات و اتصالات در این بخش اتصالات انبار و تنظیمات پروژه را بررسی میکنیم. yml Dbt به فایل profiles.yml که حاوی جزئیات کانکشن به دیتابیس یا انبارداده باشد نیاز دارد. ما جزئیات اتصال به انبار داده را در /simple_dbt_project/profiles.yml تعریف کرده ایم. متغیر target محیط را تعریف میکند. پیشفرض dev است. ما میتوانیم چندین target داشته باشیم که هنگام اجرای دستورات dbt میتوان آنها را مشخص کرد. پروفایل sde_dbt_tutorial است. فایل profiles.yml میتواند حاوی چندین پروفایل برای زمانی که بیش از یک پروژه dbt دارید باشد. 💡 با دوره مهندسی داده، مهارتهای کلیدی برای طراحی، پردازش و مدیریت دادههای بزرگ را بهصورت حرفهای بیاموزید. yml در این فایل میتوانید پروفایل مورد استفاده و مسیرهای انواع مختلف فایلها را تعریف کنید. Materialization متغیری است که نحوه ایجاد یک مدل توسط dbt را کنترل میکند. به طور پیشفرض، هر مدل یک view خواهد بود. ما مدلها را در مسیر models/marts/core/ قرار دادهایم. [۱] Mapping # Configuring models models: sde_dbt_tutorial: # Applies to all files under models/marts/core/ marts: core: materialized: table جریان داده در این قسمت خواهیم دید که چگونه جدول customer_orders از جداول منبع ایجاد میشود. منبع جداول منبع به جداول بارگذاری شده در انبار توسط فرآیند EL اشاره دارد. از آنجایی که dbt آنها را ایجاد نکرده است، باید آنها را تعریف کنیم. این تعریف امکان ارجاع به جداول منبع را با استفاده از تابع منبع فراهم میکند. برای مثال {{ source(‘warehouse’, ‘orders’) }} به جدول warehouse.orders اشاره دارد. همچنین میتوانیم تستهایی را برای اطمینان از صحت دادههای منبع تعریف کنیم. تعاریف تست: yun.ir/xxik68 تعاریف منبع: https://github.com Snapshots ویژگی های یک موجودیت تجاری در طول زمان تغییر میکند. این تغییرات باید در انبار داده ما ثبت شوند. به عنوان مثال، یک کاربر ممکن است به یک آدرس جدید منتقل شود. در مدلسازی انبار داده به این مورد تغییر آهسته ابعاد گفته میشود. Dbt به ما این امکان را میدهد که با استفاده از ویژگی snapshot این جداول SCD2 را به راحتی ایجاد کنیم. هنگام ایجاد یک snapshot، باید پایگاه داده، شِما، استراتژی و ستون یکتا را برای بهروزرسانی ردیفها، تعریف کنیم: dbt snapshot Dbt در اولین اجرا یک snapshot را ایجاد میکند و در اجراهای متوالی مقادیر تغییر یافته را بررسی میکند و ردیفهای قدیمیتر را به روز رسانی میکند. این روال را به شکل زیر شبیهسازی میکنیم. pgcli -h localhost -U dbt -p 5432 -d dbt # password1234 COPY warehouse.customers(customer_id, zipcode, city, state_code, datetime_created, datetime_updated) FROM '/input_data/customer_new.csv' DELIMITER ',' CSV HEADER; مجدد دستور snapshot را اجرا کنید. dbt snapshot داده خام داده خام جدول Snapshot جدول Snapshot سطر با کد پستی ۵۹۶۵۵ ستون dbt_valid_to آن بهروزرسانی شده است. ستونهای dbt_valid_from و dbt_valid_to بازه زمانی را نشان میدهند که دادههای آن ردیف معتبر بوده است. در صورتی که dbt_valid_to مقدار null داشته باشد به این معنا است که همچنان این ردیف معتبر است. فایل customers.SQL را از آدرس زیر میتوانید دریافت کنید. https://github.com/josephmachado/simple_dbt_project/blob/master/sde_dbt_tutorial/snapshots/customers.sql مخزن داده میانی مخزن داده میانی، یک مکان داده موقت است که دادهها را تا زمان مشخصی به عنوان مثال یک ماه یا بیشتر نگهداری میکند، با این هدف که هرگاه پردازشهای تحلیلی برنامه به دادههای پایگاه داده نیاز پیدا کرد، از دادههای روی مخزن داده میانی استفاده کند. این کار باعث میشود پایگاه داده عملیاتی که بیشتر درگیر کوئریهای درج، حذف و ویرایش قرار دارد، برای پردازش دادهها مورد مراجعه قرار نگیرد و وجود مخزن داده میانی، نقش کاهش بار روی پایگاه داده عملیاتی را بر عهده دارد. 💡 برای آشنایی با روشهای کاربردی بهینهسازی سیستمهای داده، مقاله «۵ گام برای مقیاسپذیر کردن خطوط پردازش داده» را مطالعه کنید. شما ممکن است متوجه eltool در نام مدلهای staging شده باشید. اگر از دادههای Fivetran برای مرحله استخراج و مرحله بارگذاری دادها استفاده کنیم (مراحل EL)، مدلهای ما stg_fivetran__orders نامیده میشوند و فایل YAML آن به صورت stg_fivetran.yml خواهد بود. در stg_eltool__customers.sql به جای تابع منبع از تابع ref استفاده میکنیم زیرا این مدل از مدل snapshot گرفته شده است. در dbt میتوانیم از تابع ref برای اشاره به هر مدلی که توسط dbt ایجاد شده است استفاده کنیم. تعاریف تست: https://github.com/josephmachado/simple_dbt_project/blob/master/sde_dbt_tutorial/models/staging/stg_eltool.yml تعاریف مدل: https://github.com/josephmachado/simple_dbt_project/blob/master/sde_dbt_tutorial/models/staging/stg_eltool__customers.sql https://github.com/josephmachado/simple_dbt_project/blob/master/sde_dbt_tutorial/models/staging/stg_eltool__orders.sql https://github.com/josephmachado/simple_dbt_project/blob/master/sde_dbt_tutorial/models/staging/stg_eltool__state.sql Mart Marts شامل جداول اصلی برای کاربران نهایی و جداول vertical-specific تجاری تشکیل شده است. در مثال ما، یک فولدر department-specific برای تعریف مدلهای درخواست شده بخش بازاریابی داریم. Core core، مدلهای واقعیت و ابعادی را که باید توسط کاربران نهایی استفاده شود، تعریف میکند. تعاریف تست: https://github.com تعاریف مدل: https://github.com/josephmachado/simple_dbt_project/blob/master/sde_dbt_tutorial/models/marts/core/dim_customers.sql https://github.com/josephmachado/simple_dbt_project/blob/master/sde_dbt_tutorial/models/marts/core/fct_orders.sql Dbt چهار تست عمومی ارائه میدهد. عبارتند از: unique, not_null, accepted_values relationships. میتوانیم تستهای one-off را در فولدر Tests ایجاد کنیم. تستهای one-off https://github.com/josephmachado/simple_dbt_project/blob/master/sde_dbt_tutorial/tests/assert_customer_dimension_has_no_row_loss.sql Marketing در این بخش مدلهایی را برای بازاریابی کاربران نهایی تعریف میکنیم. یک پروژه میتواند چندین vertical تجاری داشته باشد. داشتن یک فولدر برای هر vertical تجاری راه آسانی را برای سازماندهی مدلها فراهم میکند. تعاریف تست: https://github.com/josephmachado/simple_dbt_project/blob/master/sde_dbt_tutorial/models/marts/marketing/marketing.yml تعاریف مدل: https://github.com/josephmachado/simple_dbt_project/blob/master/sde_dbt_tutorial/models/marts/marketing/customer_orders.sql اجرای DBT ما تعاریف مدلهای مورد نیاز را داریم. مدلها را به صورت زیر ایجاد میکنیم. dbt snapshot dbt run ... Finished running 4 view models, 2 table models ... مدل stg_eltool__customers به مدل snapshots.customers_snapshot نیاز دارد. دقت داشته باشید snapshotها با اجرای دستور dbt run ایجاد نمی شوند، بنابراین ابتدا dbt snapshot را اجرا میکنیم. مدلهای staging و marketing به عنوان view ایجاد میشوند و دو مدل core به عنوان جداول ایجاد میشوند. دستور snapshot باید مستقل از دستور run اجرا شود تا جداول snapshot به روز بمانند. اگر جداول snapshot قدیمی باشد، مدلها نادرست خواهند بود. test روی مدلهای تعریف شده میتوانیم تستهایی را اجرا کنیم. توجه داشته باشید که بر خلاف تست استاندارد، این تستها پس از پردازش دادهها اجرا میشوند. میتوانید تستها را مطابق دستور زیر اجرا کنید. dbt test ... Finished running 10 tests... دستور بالا تمام تستهای تعریف شده در پروژه را اجرا میکند. برای مشاهده مدلها میتوانید وارد انبار داده شوید. pgcli -h localhost -U dbt -p 5432 -d dbt # password is password1234 select * from warehouse.customer_orders limit 3; q dbt docs یکی از ویژگی های قدرتمند dbt اسناد آن است. برای تولید اسناد و ارائه آنها، دستورات زیر را اجرا کنید: dbt docs generate dbt docs serve پس از اجرای کد بالا برای مشاهده مستندات میتوانید به آدرس http://localhost:8080 مراجعه کنید. مشاهده مستندات زمانبندی تا اینجا نحوه ایجاد snapshotها، مدلها، اجرای تستها و تولید مستندات را دیدهایم. اینها همه دستوراتی هستند که از طریق cli اجرا میشوند. Dbt مدلها را در کوئریهای SQL در فولدر target (که بخشی از git repo نیست) کامپایل میکند و آنها را در انبار داده اجرا میکند. برای برنامهریزی اجراهای dbt، snapshotها و تستها باید از یک زمانبندی استفاده کنیم. ابر Dbt یک گزینه عالی برای انجام زمانبندی آسان است. دستورات dbt را میتوان توسط زمانبندیهای محبوب دیگر مانند cron، Airflow، Dagster و غیره برنامهریزی کرد. سخن پایانی آموزش dbt Dbt یک انتخاب عالی برای ساخت خطوط لوله ELT است. dbt با ترکیب بهترین شیوههای انبار داده، تست، مستندسازی، سهولت استفاده و پشتیبانی آنلاین، خود را به عنوان یک ابزار ضروری برای مهندسان داده معرفی کرده است. یادگیری و درک dbt میتواند به طور قابل توجهی شانس شما را برای یافتن شغل در جایگاه مهندسی داده افزایش دهد. سوالات متداول آموزش dbt ۱. DBT چیست و چه کاربردی دارد؟ DBT ابزاری در حوزه مهندسی داده است که برای تبدیل، مدلسازی و اعتبارسنجی دادهها در انبار داده استفاده میشود و به کمک SQL فرآیند پردازش و سازماندهی دادهها را سادهتر میکند. ۲. DBT در کدام مرحله از خط لوله داده استفاده میشود؟ DBT در مرحله Transform در خط لوله ELT استفاده میشود؛ یعنی پس از بارگذاری دادههای خام در انبار داده، عملیات تبدیل و آمادهسازی دادهها را انجام میدهد. ۳. مدلها در DBT چه هستند؟ مدلها فایلهای SQL هستند که معمولاً شامل دستور SELECT میباشند و برای تبدیل دادهها به جداول یا Viewهای قابل استفاده در انبار داده به کار میروند. ۴. چه نوع تستهایی در DBT وجود دارد؟ در DBT دو نوع تست وجود دارد: تستهای عمومی مانند unique، not_null، accepted_values و relationships و همچنین تستهای سفارشی که با اسکریپتهای SQL تعریف میشوند. ۵. Snapshot در DBT چه کاربردی دارد؟ Snapshot برای ثبت تغییرات دادهها در طول زمان استفاده میشود و به ایجاد جداولی کمک میکند که تاریخچه تغییرات یک موجودیت را نگهداری میکنند. ۶. چرا از جداول تجمیعی در پردازش داده استفاده میشود؟ جداول تجمیعی باعث میشوند ابزارهای تحلیلی و هوش تجاری بهجای استفاده از جداول بزرگ و اصلی، از دادههای خلاصهشده استفاده کنند و در نتیجه فشار کمتری به پایگاه داده وارد شود. ۷. چگونه میتوان اجرای دستورات DBT را زمانبندی کرد؟ اجرای دستورات DBT مانند snapshot، run و test میتواند با ابزارهایی مانند dbt Cloud، cron، Airflow یا Dagster زمانبندی و به صورت خودکار اجرا شود. اگر به یادگیری بیشتر علاقهمند هستید، ادامه مقالات ما را نیز از دست ندهید: چطور تسک های مهندسی داده خود را درک کنیم؟ ۵ راهکار عملی! ۶ مسئولیت کلیدی مهندس داده در دنیای دادهمحور امروز! آپدیت میلیونها رکورد در MySQL: آموزش بهروزرسانی ۵ میلیون رکورد با Batch Update بدون Lock چگونه به عنوان یک مهندس داده در SQL پیشرفت کنیم؟ منبع https://www.startdataengineering.com/post/dbt-data-build-tool-tutorial/ چه رتبه ای میدهید؟ میانگین ۴.۲ / ۵. از مجموع ۶۸۵ اولین نفر باش دانلود مقاله آموزش DBT در ۷ گام؛ ساخت و مدیریت خط لوله داده با SQL فرمت PDF 12 صفحه حجم 1 مگابایت دانلود مقاله معرفی نویسنده مقالات 414 مقاله توسط این نویسنده تیم فنی نیک آموز معرفی محصول حسن احمدخانی دوره آنلاین Data Lakehouse مقدماتی طلایی55,750,000 تومان39,025,000 توماننقرهای15,750,000 تومان11,025,000 تومان مقالات مرتبط ۰۱ اسفند مهندسی داده تکامل معماریهای داده از Data Warehouse تا Data Lake و Data Lakehouse فرید طاهری ۰۴ مهر مهندسی داده معماری Data Lakehouse چیست و چگونه کار میکند؟ نگین فاتحی ۲۴ شهریور مهندسی داده ردیس چیست؟ راهنمای کامل Redis و معرفی ۱۰ نوع Data Type در آن نگین فاتحی ۱۸ شهریور مهندسی داده ۵ مرحله ساده برای تحلیل داده با ChatGPT و پایتون نگین فاتحی دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ