البرنامج التعليمي: إنشاء نماذج 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")
  1. في دليل المشروع 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.

  2. في دليل المشروع models ، أنشئ ملفا ثانيا باسم diamonds_list_colors.sql مع عبارة SQL التالية. تحدد هذه العبارة قيما فريدة من colors العمود في diamonds_four_cs الجدول، مع فرز النتائج بترتيب أبجدي أولا إلى آخر. نظرا لعدم وجود config كتلة، يوجه هذا النموذج dbt لإنشاء طريقة عرض في قاعدة البيانات استنادا إلى هذه العبارة.

    select distinct color
    from {{ ref('diamonds_four_cs') }}
    sort by color asc
    
  3. في دليل المشروع models ، أنشئ ملفا ثالثا باسم diamonds_prices.sql مع عبارة SQL التالية. هذا البيان متوسط أسعار الماس حسب اللون، وفرز النتائج حسب متوسط السعر من الأعلى إلى الأدنى. يرشد هذا النموذج dbt لإنشاء طريقة عرض في قاعدة البيانات استنادا إلى هذه العبارة.

    select color, avg(price) as price
    from diamonds
    group by color
    order by price desc
    
  4. مع تنشيط البيئة الظاهرية 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
    
  5. قم بتشغيل التعليمات البرمجية 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: إنشاء نماذج أكثر تعقيدا وتشغيلها

في هذه الخطوة، يمكنك إنشاء نماذج أكثر تعقيدا لمجموعة من جداول البيانات ذات الصلة. تحتوي جداول البيانات هذه على معلومات حول دوري رياضي خيالي لثلاثة فرق تلعب موسما مكونا من ست مباريات. ينشئ هذا الإجراء جداول البيانات، وينشئ النماذج، ويشغل النماذج.

  1. قم بتشغيل التعليمات البرمجية 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     |
    -- +---------+---------------+
    
  2. في دليل المشروع 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
    
  3. في دليل المشروع 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
    
  4. مع تنشيط البيئة الظاهرية 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
    
  5. قم بتشغيل التعليمات البرمجية 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، عدد السجلات التي لا تجتاز تأكيدا. عندما يكون هذا الرقم صفرا، تمر جميع السجلات، وبالتالي تنجح الاختبارات. اختبارات البيانات هي استعلامات محددة يجب أن ترجع صفر سجلات لتمريرها.

  1. في دليل المشروع 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
    
  2. في دليل المشروع 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'
    
  3. في دليل المشروع 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
    
  4. في دليل المشروع 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
    
  5. مع تنشيط البيئة الظاهرية، قم بتشغيل 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 على الويب: