البرنامج التعليمي: إنشاء نماذج dbt وتشغيلها واختبارها محليا
يرشدك هذا البرنامج التعليمي إلى كيفية إنشاء نماذج dbt وتشغيلها واختبارها محليا. يمكنك أيضا تشغيل مشاريع dbt كمهام وظيفة Azure Databricks. لمزيد من المعلومات، راجع استخدام تحويلات dbt في مهمة Azure Databricks.
قبل البدء
لاتباع هذا البرنامج التعليمي، يجب أولا توصيل مساحة عمل Azure Databricks ب dbt Core. لمزيد من المعلومات، راجع الاتصال ب dbt Core.
الخطوة 1: إنشاء النماذج وتشغيلها
في هذه الخطوة، يمكنك استخدام محرر النص المفضل لديك لإنشاء نماذج، وهي select
عبارة عن عبارات تنشئ إما طريقة عرض جديدة (الافتراضي) أو جدولا جديدا في قاعدة بيانات، استنادا إلى البيانات الموجودة في نفس قاعدة البيانات. ينشئ هذا الإجراء نموذجا يستند إلى جدول العينة diamonds
من مجموعات بيانات العينة.
استخدم التعليمات البرمجية التالية لإنشاء هذا الجدول.
DROP TABLE IF EXISTS diamonds;
CREATE TABLE diamonds USING CSV OPTIONS (path "/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv", header "true")
في دليل المشروع
models
، قم بإنشاء ملف باسمdiamonds_four_cs.sql
مع عبارة SQL التالية. تحدد هذه العبارة تفاصيل قيراط والقص واللون والوضوح فقط لكل معين منdiamonds
الجدول. ترشدconfig
الكتلة dbt لإنشاء جدول في قاعدة البيانات استنادا إلى هذه العبارة.{{ config( materialized='table', file_format='delta' ) }}
select carat, cut, color, clarity from diamonds
تلميح
للحصول على خيارات إضافية
config
مثل استخدام تنسيق ملف Delta والاستراتيجيةmerge
التزايدية، راجع تكوينات Databricks في وثائق dbt.في دليل المشروع
models
، أنشئ ملفا ثانيا باسمdiamonds_list_colors.sql
مع عبارة SQL التالية. تحدد هذه العبارة قيما فريدة منcolors
العمود فيdiamonds_four_cs
الجدول، مع فرز النتائج بترتيب أبجدي أولا إلى آخر. نظرا لعدم وجودconfig
كتلة، يوجه هذا النموذج dbt لإنشاء طريقة عرض في قاعدة البيانات استنادا إلى هذه العبارة.select distinct color from {{ ref('diamonds_four_cs') }} sort by color asc
في دليل المشروع
models
، أنشئ ملفا ثالثا باسمdiamonds_prices.sql
مع عبارة SQL التالية. هذا البيان متوسط أسعار الماس حسب اللون، وفرز النتائج حسب متوسط السعر من الأعلى إلى الأدنى. يرشد هذا النموذج dbt لإنشاء طريقة عرض في قاعدة البيانات استنادا إلى هذه العبارة.select color, avg(price) as price from diamonds group by color order by price desc
مع تنشيط البيئة الظاهرية
dbt run
، قم بتشغيل الأمر مع المسارات إلى الملفات الثلاثة السابقة. فيdefault
قاعدة البيانات (كما هو محدد فيprofiles.yml
الملف)، ينشئ dbt جدولا واحدا باسمdiamonds_four_cs
واثنين من طرق العرض المسماةdiamonds_list_colors
وdiamonds_prices
. يحصل dbt على أسماء طرق العرض والجدول هذه من أسماء الملفات ذات الصلة.sql
.dbt run --model models/diamonds_four_cs.sql models/diamonds_list_colors.sql models/diamonds_prices.sql
... ... | 1 of 3 START table model default.diamonds_four_cs.................... [RUN] ... | 1 of 3 OK created table model default.diamonds_four_cs............... [OK ...] ... | 2 of 3 START view model default.diamonds_list_colors................. [RUN] ... | 2 of 3 OK created view model default.diamonds_list_colors............ [OK ...] ... | 3 of 3 START view model default.diamonds_prices...................... [RUN] ... | 3 of 3 OK created view model default.diamonds_prices................. [OK ...] ... | ... | Finished running 1 table model, 2 view models ... Completed successfully Done. PASS=3 WARN=0 ERROR=0 SKIP=0 TOTAL=3
قم بتشغيل التعليمات البرمجية SQL التالية لسرد معلومات حول طرق العرض الجديدة وتحديد كافة الصفوف من الجدول وطرق العرض.
إذا كنت تتصل بمجموعة، يمكنك تشغيل رمز SQL هذا من دفتر ملاحظات متصل بالمجموعة، مع تحديد SQL كلغة افتراضية لدفتر الملاحظات. إذا كنت تتصل بمستودع SQL، يمكنك تشغيل رمز SQL هذا من استعلام.
SHOW views IN default;
+-----------+----------------------+-------------+ | namespace | viewName | isTemporary | +===========+======================+=============+ | default | diamonds_list_colors | false | +-----------+----------------------+-------------+ | default | diamonds_prices | false | +-----------+----------------------+-------------+
SELECT * FROM diamonds_four_cs;
+-------+---------+-------+---------+ | carat | cut | color | clarity | +=======+=========+=======+=========+ | 0.23 | Ideal | E | SI2 | +-------+---------+-------+---------+ | 0.21 | Premium | E | SI1 | +-------+---------+-------+---------+ ...
SELECT * FROM diamonds_list_colors;
+-------+ | color | +=======+ | D | +-------+ | E | +-------+ ...
SELECT * FROM diamonds_prices;
+-------+---------+ | color | price | +=======+=========+ | J | 5323.82 | +-------+---------+ | I | 5091.87 | +-------+---------+ ...
الخطوة 2: إنشاء نماذج أكثر تعقيدا وتشغيلها
في هذه الخطوة، يمكنك إنشاء نماذج أكثر تعقيدا لمجموعة من جداول البيانات ذات الصلة. تحتوي جداول البيانات هذه على معلومات حول دوري رياضي خيالي لثلاثة فرق تلعب موسما مكونا من ست مباريات. ينشئ هذا الإجراء جداول البيانات، وينشئ النماذج، ويشغل النماذج.
قم بتشغيل التعليمات البرمجية SQL التالية لإنشاء جداول البيانات الضرورية.
إذا كنت تتصل بمجموعة، يمكنك تشغيل رمز SQL هذا من دفتر ملاحظات متصل بالمجموعة، مع تحديد SQL كلغة افتراضية لدفتر الملاحظات. إذا كنت تتصل بمستودع SQL، يمكنك تشغيل رمز SQL هذا من استعلام.
تبدأ الجداول وطرق العرض في هذه الخطوة بالمساعدة
zzz_
في التعرف عليها كجزء من هذا المثال. لا تحتاج إلى اتباع هذا النمط للجداول وطرق العرض الخاصة بك.DROP TABLE IF EXISTS zzz_game_opponents; DROP TABLE IF EXISTS zzz_game_scores; DROP TABLE IF EXISTS zzz_games; DROP TABLE IF EXISTS zzz_teams; CREATE TABLE zzz_game_opponents ( game_id INT, home_team_id INT, visitor_team_id INT ) USING DELTA; INSERT INTO zzz_game_opponents VALUES (1, 1, 2); INSERT INTO zzz_game_opponents VALUES (2, 1, 3); INSERT INTO zzz_game_opponents VALUES (3, 2, 1); INSERT INTO zzz_game_opponents VALUES (4, 2, 3); INSERT INTO zzz_game_opponents VALUES (5, 3, 1); INSERT INTO zzz_game_opponents VALUES (6, 3, 2); -- Result: -- +---------+--------------+-----------------+ -- | game_id | home_team_id | visitor_team_id | -- +=========+==============+=================+ -- | 1 | 1 | 2 | -- +---------+--------------+-----------------+ -- | 2 | 1 | 3 | -- +---------+--------------+-----------------+ -- | 3 | 2 | 1 | -- +---------+--------------+-----------------+ -- | 4 | 2 | 3 | -- +---------+--------------+-----------------+ -- | 5 | 3 | 1 | -- +---------+--------------+-----------------+ -- | 6 | 3 | 2 | -- +---------+--------------+-----------------+ CREATE TABLE zzz_game_scores ( game_id INT, home_team_score INT, visitor_team_score INT ) USING DELTA; INSERT INTO zzz_game_scores VALUES (1, 4, 2); INSERT INTO zzz_game_scores VALUES (2, 0, 1); INSERT INTO zzz_game_scores VALUES (3, 1, 2); INSERT INTO zzz_game_scores VALUES (4, 3, 2); INSERT INTO zzz_game_scores VALUES (5, 3, 0); INSERT INTO zzz_game_scores VALUES (6, 3, 1); -- Result: -- +---------+-----------------+--------------------+ -- | game_id | home_team_score | visitor_team_score | -- +=========+=================+====================+ -- | 1 | 4 | 2 | -- +---------+-----------------+--------------------+ -- | 2 | 0 | 1 | -- +---------+-----------------+--------------------+ -- | 3 | 1 | 2 | -- +---------+-----------------+--------------------+ -- | 4 | 3 | 2 | -- +---------+-----------------+--------------------+ -- | 5 | 3 | 0 | -- +---------+-----------------+--------------------+ -- | 6 | 3 | 1 | -- +---------+-----------------+--------------------+ CREATE TABLE zzz_games ( game_id INT, game_date DATE ) USING DELTA; INSERT INTO zzz_games VALUES (1, '2020-12-12'); INSERT INTO zzz_games VALUES (2, '2021-01-09'); INSERT INTO zzz_games VALUES (3, '2020-12-19'); INSERT INTO zzz_games VALUES (4, '2021-01-16'); INSERT INTO zzz_games VALUES (5, '2021-01-23'); INSERT INTO zzz_games VALUES (6, '2021-02-06'); -- Result: -- +---------+------------+ -- | game_id | game_date | -- +=========+============+ -- | 1 | 2020-12-12 | -- +---------+------------+ -- | 2 | 2021-01-09 | -- +---------+------------+ -- | 3 | 2020-12-19 | -- +---------+------------+ -- | 4 | 2021-01-16 | -- +---------+------------+ -- | 5 | 2021-01-23 | -- +---------+------------+ -- | 6 | 2021-02-06 | -- +---------+------------+ CREATE TABLE zzz_teams ( team_id INT, team_city VARCHAR(15) ) USING DELTA; INSERT INTO zzz_teams VALUES (1, "San Francisco"); INSERT INTO zzz_teams VALUES (2, "Seattle"); INSERT INTO zzz_teams VALUES (3, "Amsterdam"); -- Result: -- +---------+---------------+ -- | team_id | team_city | -- +=========+===============+ -- | 1 | San Francisco | -- +---------+---------------+ -- | 2 | Seattle | -- +---------+---------------+ -- | 3 | Amsterdam | -- +---------+---------------+
في دليل المشروع
models
، قم بإنشاء ملف باسمzzz_game_details.sql
مع عبارة SQL التالية. تنشئ هذه العبارة جدولا يوفر تفاصيل كل لعبة، مثل أسماء الفرق والنتائج. ترشدconfig
الكتلة dbt لإنشاء جدول في قاعدة البيانات استنادا إلى هذه العبارة.-- Create a table that provides full details for each game, including -- the game ID, the home and visiting teams' city names and scores, -- the game winner's city name, and the game date.
{{ config( materialized='table', file_format='delta' ) }}
-- Step 4 of 4: Replace the visitor team IDs with their city names. select game_id, home, t.team_city as visitor, home_score, visitor_score, -- Step 3 of 4: Display the city name for each game's winner. case when home_score > visitor_score then home when visitor_score > home_score then t.team_city end as winner, game_date as date from ( -- Step 2 of 4: Replace the home team IDs with their actual city names. select game_id, t.team_city as home, home_score, visitor_team_id, visitor_score, game_date from ( -- Step 1 of 4: Combine data from various tables (for example, game and team IDs, scores, dates). select g.game_id, go.home_team_id, gs.home_team_score as home_score, go.visitor_team_id, gs.visitor_team_score as visitor_score, g.game_date from zzz_games as g, zzz_game_opponents as go, zzz_game_scores as gs where g.game_id = go.game_id and g.game_id = gs.game_id ) as all_ids, zzz_teams as t where all_ids.home_team_id = t.team_id ) as visitor_ids, zzz_teams as t where visitor_ids.visitor_team_id = t.team_id order by game_date desc
في دليل المشروع
models
، قم بإنشاء ملف باسمzzz_win_loss_records.sql
مع عبارة SQL التالية. تنشئ هذه العبارة طريقة عرض تسرد سجلات خسارة الفريق لهذا الموسم.-- Create a view that summarizes the season's win and loss records by team. -- Step 2 of 2: Calculate the number of wins and losses for each team. select winner as team, count(winner) as wins, -- Each team played in 4 games. (4 - count(winner)) as losses from ( -- Step 1 of 2: Determine the winner and loser for each game. select game_id, winner, case when home = winner then visitor else home end as loser from {{ ref('zzz_game_details') }} ) group by winner order by wins desc
مع تنشيط البيئة الظاهرية
dbt run
، قم بتشغيل الأمر مع المسارات إلى الملفين السابقين. فيdefault
قاعدة البيانات (كما هو محدد فيprofiles.yml
الملف)، ينشئ dbt جدولا واحدا باسمzzz_game_details
وطريقة عرض واحدة باسمzzz_win_loss_records
. يحصل dbt على أسماء طرق العرض والجدول هذه من أسماء الملفات ذات الصلة.sql
.dbt run --model models/zzz_game_details.sql models/zzz_win_loss_records.sql
... ... | 1 of 2 START table model default.zzz_game_details.................... [RUN] ... | 1 of 2 OK created table model default.zzz_game_details............... [OK ...] ... | 2 of 2 START view model default.zzz_win_loss_records................. [RUN] ... | 2 of 2 OK created view model default.zzz_win_loss_records............ [OK ...] ... | ... | Finished running 1 table model, 1 view model ... Completed successfully Done. PASS=2 WARN=0 ERROR=0 SKIP=0 TOTAL=2
قم بتشغيل التعليمات البرمجية SQL التالية لسرد معلومات حول طريقة العرض الجديدة وتحديد كافة الصفوف من الجدول وطريقة العرض.
إذا كنت تتصل بمجموعة، يمكنك تشغيل رمز SQL هذا من دفتر ملاحظات متصل بالمجموعة، مع تحديد SQL كلغة افتراضية لدفتر الملاحظات. إذا كنت تتصل بمستودع SQL، يمكنك تشغيل رمز SQL هذا من استعلام.
SHOW VIEWS FROM default LIKE 'zzz_win_loss_records';
+-----------+----------------------+-------------+ | namespace | viewName | isTemporary | +===========+======================+=============+ | default | zzz_win_loss_records | false | +-----------+----------------------+-------------+
SELECT * FROM zzz_game_details;
+---------+---------------+---------------+------------+---------------+---------------+------------+ | game_id | home | visitor | home_score | visitor_score | winner | date | +=========+===============+===============+============+===============+===============+============+ | 1 | San Francisco | Seattle | 4 | 2 | San Francisco | 2020-12-12 | +---------+---------------+---------------+------------+---------------+---------------+------------+ | 2 | San Francisco | Amsterdam | 0 | 1 | Amsterdam | 2021-01-09 | +---------+---------------+---------------+------------+---------------+---------------+------------+ | 3 | Seattle | San Francisco | 1 | 2 | San Francisco | 2020-12-19 | +---------+---------------+---------------+------------+---------------+---------------+------------+ | 4 | Seattle | Amsterdam | 3 | 2 | Seattle | 2021-01-16 | +---------+---------------+---------------+------------+---------------+---------------+------------+ | 5 | Amsterdam | San Francisco | 3 | 0 | Amsterdam | 2021-01-23 | +---------+---------------+---------------+------------+---------------+---------------+------------+ | 6 | Amsterdam | Seattle | 3 | 1 | Amsterdam | 2021-02-06 | +---------+---------------+---------------+------------+---------------+---------------+------------+
SELECT * FROM zzz_win_loss_records;
+---------------+------+--------+ | team | wins | losses | +===============+======+========+ | Amsterdam | 3 | 1 | +---------------+------+--------+ | San Francisco | 2 | 2 | +---------------+------+--------+ | Seattle | 1 | 3 | +---------------+------+--------+
الخطوة 3: إنشاء الاختبارات وتشغيلها
في هذه الخطوة، يمكنك إنشاء اختبارات، وهي تأكيدات تقوم بها حول نماذجك. عند تشغيل هذه الاختبارات، يخبرك dbt ما إذا كان كل اختبار في مشروعك يمر أو يفشل.
هناك نوعان من الاختبارات. ترجع اختبارات المخطط، المطبقة في YAML، عدد السجلات التي لا تجتاز تأكيدا. عندما يكون هذا الرقم صفرا، تمر جميع السجلات، وبالتالي تنجح الاختبارات. اختبارات البيانات هي استعلامات محددة يجب أن ترجع صفر سجلات لتمريرها.
في دليل المشروع
models
، أنشئ ملفا باسمschema.yml
بالمحتوى التالي. يتضمن هذا الملف اختبارات المخطط التي تحدد ما إذا كانت الأعمدة المحددة تحتوي على قيم فريدة أو ليست خالية أو تحتوي على القيم المحددة فقط أو مجموعة.version: 2 models: - name: zzz_game_details columns: - name: game_id tests: - unique - not_null - name: home tests: - not_null - accepted_values: values: ['Amsterdam', 'San Francisco', 'Seattle'] - name: visitor tests: - not_null - accepted_values: values: ['Amsterdam', 'San Francisco', 'Seattle'] - name: home_score tests: - not_null - name: visitor_score tests: - not_null - name: winner tests: - not_null - accepted_values: values: ['Amsterdam', 'San Francisco', 'Seattle'] - name: date tests: - not_null - name: zzz_win_loss_records columns: - name: team tests: - unique - not_null - relationships: to: ref('zzz_game_details') field: home - name: wins tests: - not_null - name: losses tests: - not_null
في دليل المشروع
tests
، قم بإنشاء ملف باسمzzz_game_details_check_dates.sql
مع عبارة SQL التالية. يتضمن هذا الملف اختبار بيانات لتحديد ما إذا كانت أي ألعاب حدثت خارج الموسم العادي.-- This season's games happened between 2020-12-12 and 2021-02-06. -- For this test to pass, this query must return no results. select date from {{ ref('zzz_game_details') }} where date < '2020-12-12' or date > '2021-02-06'
في دليل المشروع
tests
، قم بإنشاء ملف باسمzzz_game_details_check_scores.sql
مع عبارة SQL التالية. يتضمن هذا الملف اختبار بيانات لتحديد ما إذا كانت أي نتائج سلبية أو أي ألعاب تم ربطها.-- This sport allows no negative scores or tie games. -- For this test to pass, this query must return no results. select home_score, visitor_score from {{ ref('zzz_game_details') }} where home_score < 0 or visitor_score < 0 or home_score = visitor_score
في دليل المشروع
tests
، قم بإنشاء ملف باسمzzz_win_loss_records_check_records.sql
مع عبارة SQL التالية. يتضمن هذا الملف اختبار بيانات لتحديد ما إذا كان لدى أي فرق سجلات فوز أو خسارة سلبية، أو كان لديها سجلات فوز أو خسارة أكثر من الألعاب التي تم لعبها، أو لعبت ألعابا أكثر مما كان مسموحا به.-- Each team participated in 4 games this season. -- For this test to pass, this query must return no results. select wins, losses from {{ ref('zzz_win_loss_records') }} where wins < 0 or wins > 4 or losses < 0 or losses > 4 or (wins + losses) > 4
مع تنشيط البيئة الظاهرية، قم بتشغيل
dbt test
الأمر .dbt test --models zzz_game_details zzz_win_loss_records
... ... | 1 of 19 START test accepted_values_zzz_game_details_home__Amsterdam__San_Francisco__Seattle [RUN] ... | 1 of 19 PASS accepted_values_zzz_game_details_home__Amsterdam__San_Francisco__Seattle [PASS ...] ... ... | ... | Finished running 19 tests ... Completed successfully Done. PASS=19 WARN=0 ERROR=0 SKIP=0 TOTAL=19
الخطوة 4: التنظيف
يمكنك حذف الجداول وطرق العرض التي قمت بإنشائها لهذا المثال عن طريق تشغيل التعليمات البرمجية SQL التالية.
إذا كنت تتصل بمجموعة، يمكنك تشغيل رمز SQL هذا من دفتر ملاحظات متصل بالمجموعة، مع تحديد SQL كلغة افتراضية لدفتر الملاحظات. إذا كنت تتصل بمستودع SQL، يمكنك تشغيل رمز SQL هذا من استعلام.
DROP TABLE zzz_game_opponents;
DROP TABLE zzz_game_scores;
DROP TABLE zzz_games;
DROP TABLE zzz_teams;
DROP TABLE zzz_game_details;
DROP VIEW zzz_win_loss_records;
DROP TABLE diamonds;
DROP TABLE diamonds_four_cs;
DROP VIEW diamonds_list_colors;
DROP VIEW diamonds_prices;
استكشاف الاخطاء
للحصول على معلومات حول المشكلات الشائعة عند استخدام dbt Core مع Azure Databricks وكيفية حلها، راجع الحصول على تعليمات على موقع dbt Labs على الويب.
الخطوات التالية
قم بتشغيل مشاريع dbt Core كمهام وظيفة Azure Databricks. راجع استخدام تحويلات dbt في مهمة Azure Databricks.
الموارد الإضافية
استكشف الموارد التالية على موقع dbt Labs على الويب: