Aracılığıyla paylaş


Öğretici: Dbt modellerini yerel olarak oluşturma, çalıştırma ve test edin

Bu öğreticide dbt modellerini yerel olarak oluşturma, çalıştırma ve test etme adımları anlatılır. Dbt projelerini Azure Databricks iş görevleri olarak da çalıştırabilirsiniz. Daha fazla bilgi için bkz. Lakeflow İşlerinde dbt dönüşümlerini kullanma.

Başlamadan önce

Bu öğreticiyi izlemek için önce Azure Databricks çalışma alanınızı dbt Core'a bağlamanız gerekir. Daha fazla bilgi için bkz . dbt Core'a bağlanma.

1. Adım: Model oluşturma ve çalıştırma

Bu adımda,modelleri oluşturmak için sık kullandığınız metin düzenleyiciyi kullanırsınız. Bu, aynı veritabanındaki mevcut verileri temel alarak veritabanında yeni bir görünüm (varsayılan) veya yeni tablo oluşturan deyimleridir. Bu yordam,Örnek veri kümelerinden örnek tablosunu temel alan bir model oluşturur.

Bu tabloyu oluşturmak için aşağıdaki kodu kullanın.

DROP TABLE IF EXISTS diamonds;

CREATE TABLE diamonds USING CSV OPTIONS (path "/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv", header "true")
  1. Projenin models dizininde aşağıdaki SQL deyimiyle adlı diamonds_four_cs.sql bir dosya oluşturun. Bu ifade, diamonds tablosundaki her pırlanta için yalnızca karat, kesim, renk ve berraklık ayrıntılarını seçer. config bloğu, dbt'ye veritabanında bu deyimi temel alan bir tablo oluşturmasını emreder.

    {{ config(
      materialized='table',
      file_format='delta'
    ) }}
    
    select carat, cut, color, clarity
    from diamonds
    

    İpucu

    Delta dosya biçimini ve artımlı stratejiyi configkullanma gibi ek merge seçenekler için dbt belgelerindeki Databricks yapılandırmaları bölümüne bakın.

  2. Projenin models dizininde, aşağıdaki SQL deyimiyle adlı diamonds_list_colors.sql ikinci bir dosya oluşturun. Bu deyim, colors tablosundaki diamonds_four_cs sütunundan benzersiz değerler seçer ve sonuçları alfabetik olarak ilk harften son harfe olacak şekilde sıralar. Blok olmadığından config , bu model dbt'ye bu deyimi temel alarak veritabanında bir görünüm oluşturmasını emreder.

    select distinct color
    from {{ ref('diamonds_four_cs') }}
    sort by color asc
    
  3. Projenin models dizininde, aşağıdaki SQL deyimiyle adlı diamonds_prices.sql üçüncü bir dosya oluşturun. Bu ifade, ortalama baklava fiyatlarını renge göre sıralar ve sonuçları en yüksekten en düşüke kadar ortalama fiyata göre sıralar. Bu model, dbt'ye bu deyimi temel alarak veritabanında bir görünüm oluşturmasını emredmektedir.

    select color, avg(price) as price
    from diamonds
    group by color
    order by price desc
    
  4. Sanal ortam etkinleştirildiğinde, yukarıdaki üç dosyaya giden yollarla komutunu çalıştırın dbt run . default veritabanında (profiles.yml dosyasında belirtildiği gibi), dbt diamonds_four_cs adlı bir tablo ve diamonds_list_colors ve diamonds_pricesadlı iki görünüm oluşturur. dbt bu görünüm ve tablo adlarını ilgili .sql dosya adlarından alır.

    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. Yeni görünümlerle ilgili bilgileri listelemek ve tablo ile görünümlerden tüm satırları seçmek için aşağıdaki SQL kodunu çalıştırın.

    Bir kümeye bağlanıyorsanız, bu SQL kodunu kümeye bağlı bir not defterinden çalıştırabilir ve not defteri için varsayılan dil olarak SQL belirtebilirsiniz. SQL ambarlarına bağlanıyorsanız, bu SQL kodunu bir sorgudan çalıştırabilirsiniz.

    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. Adım: Daha karmaşık modeller oluşturma ve çalıştırma

Bu adımda, bir dizi ilgili veri tablosu için daha karmaşık modeller oluşturursunuz. Bu veri tablolarında altı maçlık bir sezonda oynayan üç takımın kurgusal bir spor ligi hakkında bilgiler yer alır. Bu yordam veri tablolarını oluşturur, modelleri oluşturur ve modelleri çalıştırır.

  1. Gerekli veri tablolarını oluşturmak için aşağıdaki SQL kodunu çalıştırın.

    Bir kümeye bağlanıyorsanız, bu SQL kodunu kümeye bağlı bir not defterinden çalıştırabilir ve not defteri için varsayılan dil olarak SQL belirtebilirsiniz. SQL ambarlarına bağlanıyorsanız, bu SQL kodunu bir sorgudan çalıştırabilirsiniz.

    Bu adımdaki tablolar ve görünümler, bu örneğin bir parçası olarak tanımlanmasına yardımcı olmak için zzz_ ile başlar. Kendi tablolarınız ve görünümleriniz için bu deseni izlemeniz gerekmez.

    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. Projenin models dizininde aşağıdaki SQL deyimiyle adlı zzz_game_details.sql bir dosya oluşturun. Bu deyim, takım adları ve puanlar gibi her oyunun ayrıntılarını sağlayan bir tablo oluşturur. config bloğu, dbt'ye veritabanında bu deyimi temel alan bir tablo oluşturmasını emreder.

    -- 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. Projenin models dizininde aşağıdaki SQL deyimiyle adlı zzz_win_loss_records.sql bir dosya oluşturun. Bu deyim, sezonun takım galibiyet kayıtlarını listeleyen bir görünüm oluşturur.

    -- 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. Sanal ortam etkinleştirildiğinde, yukarıdaki iki dosyaya giden yollarla komutunu çalıştırın dbt run . default veritabanında (profiles.yml dosyasında belirtildiği gibi), dbt zzz_game_details adlı bir tablo ve zzz_win_loss_recordsadlı bir görünüm oluşturur. dbt bu görünüm ve tablo adlarını ilgili .sql dosya adlarından alır.

    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. Yeni görünüm hakkındaki bilgileri listelemek ve tablo ile görünümdeki tüm satırları seçmek için aşağıdaki SQL kodunu çalıştırın.

    Bir kümeye bağlanıyorsanız, bu SQL kodunu kümeye bağlı bir not defterinden çalıştırabilir ve not defteri için varsayılan dil olarak SQL belirtebilirsiniz. SQL ambarlarına bağlanıyorsanız, bu SQL kodunu bir sorgudan çalıştırabilirsiniz.

    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. Adım: Test oluşturma ve çalıştırma

Bu adımda, modelleriniz hakkında yaptığınız onaylar olan testler oluşturursunuz. Bu testleri çalıştırdığınızda dbt, projenizdeki her testin başarılı olup olmadığını veya başarısız olup olmadığını bildirir.

İki tür test vardır. YAML'de uygulananşema testleri onay geçmeyen kayıtların sayısını döndürür. Bu sayı sıfır olduğunda, tüm kayıtlar geçer, bu nedenle testler geçer. Veri testleri , geçmesi için sıfır kayıt döndürmesi gereken belirli sorgulardır.

  1. Projenin models dizininde aşağıdaki içeriğe sahip adlı schema.yml bir dosya oluşturun. Bu dosya, belirtilen sütunların benzersiz değerlere sahip olup olmadığını, null olmadığını, yalnızca belirtilen değerlere veya bir bileşimine sahip olup olmadığını belirleyen şema testlerini içerir.

    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. Projenin tests dizininde aşağıdaki SQL deyimiyle adlı zzz_game_details_check_dates.sql bir dosya oluşturun. Bu dosya, normal sezonun dışında herhangi bir oyun olup olmadığını belirlemek için bir veri testi içerir.

    -- 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. Projenin tests dizininde aşağıdaki SQL deyimiyle adlı zzz_game_details_check_scores.sql bir dosya oluşturun. Bu dosya, herhangi bir puanın negatif olup olmadığını veya herhangi bir oyunun bağlı olup olmadığını belirlemek için bir veri testi içerir.

    -- 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. Projenin tests dizininde aşağıdaki SQL deyimiyle adlı zzz_win_loss_records_check_records.sql bir dosya oluşturun. Bu dosya, herhangi bir takımın olumsuz galibiyet veya kayıp kayıtlarına sahip olup olmadığını, oynanan oyunlardan daha fazla galibiyet veya kayıp kaydı olup olmadığını ya da izin verilenden daha fazla oyun oynayıp oynamadığını belirlemek için bir veri testi içerir.

    -- 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. Sanal ortam etkinleştirildiğinde komutunu çalıştırın 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. Adım: Temizleme

Aşağıdaki SQL kodunu çalıştırarak bu örnek için oluşturduğunuz tabloları ve görünümleri silebilirsiniz.

Bir kümeye bağlanıyorsanız, bu SQL kodunu kümeye bağlı bir not defterinden çalıştırabilir ve not defteri için varsayılan dil olarak SQL belirtebilirsiniz. SQL ambarlarına bağlanıyorsanız, bu SQL kodunu bir sorgudan çalıştırabilirsiniz.

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;

Sorun giderme

Dbt Core'u Azure Databricks ile kullanırken karşılaşılan yaygın sorunlar ve bunların nasıl çözüleceğini öğrenmek için bkz . dbt Labs web sitesinde yardım alma.

Sonraki adımlar

dbt Core projelerini Azure Databricks iş görevleri olarak çalıştırın. Bkz. Lakeflow İşlerinde dbt dönüşümlerini kullanma.

Ek kaynaklar

dbt Labs web sitesinde aşağıdaki kaynakları keşfedin: