PostgreSQLでdbt Coreをマスターする:バラバラなSQLから標準化されたデータパイプラインへ

Database tutorial - IT technology blog
Database tutorial - IT technology blog

「手動SQL」という名の悪夢

50個もの長いSQLファイルの中で「溺れた」ことはありませんか?あるファイルはローカルPCに、あるファイルはサーバー上に散らばっている。売上計算のロジックが変わるたびに、一つ一つのファイルを探し出し、手動でコマンドを実行し、コピー&ペーストを間違えないように祈る…。

PostgreSQLやMongoDBを長年扱ってきた経験から、純粋なスクリプトだけでデータ変換(Transformation)ロジックを管理することは、メンテナンスの観点から大きな間違いだと気づきました。dbt(data build tool)はこの問題を解決するために誕生しました。dbtは、バージョン管理(Git)、テスト、自動ドキュメント生成といったソフトウェアエンジニアリングの思考をデータアナリストの世界に持ち込みます。

Trong mô hình ELT (Extract – Load – Transform)において、dbtは「T」を担います。生データがPostgreSQLに格納された後、dbtはそれらをダッシュボードですぐに使えるクリーンなデータテーブルへと加工します。

dbt CoreのインストールとPostgreSQLへの接続

まず、マシンにPython(3.8以降を推奨)がインストールされている必要があります。dbt Coreは完全に無料で、コマンドライン(CLI)で動作するため非常に軽量です。

1. dbt-postgresライブラリのインストール

汎用的な dbt パッケージではなく、最高のパフォーマンスを得るためにPostgreSQL専用のアダプターをインストールしてください:

pip install dbt-postgres

その後、dbt --version を入力してください。バージョン情報が表示されれば、正しく進んでいます。

2. プロジェクトの初期化

作業ディレクトリでターミナルを開き、以下を実行します:

dbt init my_first_dbt_project

dbtからホスト、ポート、ユーザーなどのパラメータを求められます。不明な場合はそのままEnterを押し、次のステップで詳細を設定しましょう。

profiles.ymlによる安全な接続設定

dbtはデフォルトで接続情報をプロジェクトフォルダ内ではなく、~/.dbt/profiles.yml に保存します。この方法により、情報のセキュリティを最大限に高めることができます。誤ってデータベースのパスワードをGitHubにプッシュしてしまう心配もありません。

以下はローカル環境の標準的な設定例です:

my_first_dbt_project:
  outputs:
    dev:
      type: postgres
      threads: 4 # 並列実行するモデル数
      host: localhost
      port: 5432
      user: postgres_user
      pass: your_password
      dbname: analytics_db
      schema: dbt_transformation
  target: dev

ヒント: raw(生データ)スキーマと analytics(処理済みデータ)スキーマを分けましょう。このように分離することで、アクセス権限の管理が容易になります。データアナリストには analytics スキーマの参照権限だけを与えれば十分です。

初めてのモデル作成:SELECT文をテーブルに変換する

dbtの世界では、各 .sql ファイルが1つのモデル(Model)となります。面倒な CREATE TABLEDROP VIEW を書く必要はありません。SELECT 文を書くだけで、残りの重労働はdbtが引き受けてくれます。

例えば、顧客の総支出額を計算するには、models/marts/customer_orders.sql ファイルを作成します:

with orders as (
    select * from {{ source('raw', 'orders') }}
),

final as (
    select
        customer_id,
        count(order_id) as total_orders,
        sum(amount) as total_spent
    from orders
    group by 1
)

select * from final

関数 {{ source(...) }} が鍵となります。これにより、dbtは依存関係グラフ(Lineage)を構築します。テーブルAがテーブルBのデータを必要とする場合、dbtは介入なしに自動的にテーブルBを先に実行します。

実行するには、たった一つのコマンド dbt run を入力するだけです。

データ品質のチェック(Data Testing)

データの重複やID列のNullが心配ですか?手動でチェック用スクリプトを書く代わりに、schema.yml ファイルで宣言しましょう。dbtがこの検証を自動化してくれます。

version: 2

models:
  - name: customer_orders
    columns:
      - name: customer_id
        tests:
          - unique
          - not_null
      - name: status
        tests:
          - accepted_values:
              values: ['placed', 'shipped', 'completed', 'returned']

dbt test を実行すると、システムがデータベース全体をスキャンします。違反データが見つかった場合、dbtはすぐに警告を発します。これにより、上司に送るレポートの正確性が常に100%保たれます。

ドキュメントの自動化

すべてのアナリストの恐怖は、カラムの説明がない「見知らぬ」データベースを扱うことです。dbtは、プロフェッショナルなドキュメントサイトを自動生成することで、この問題を根本的に解決します。

2つのコマンドを実行するだけです:

dbt docs generate
dbt docs serve

ウェブインターフェースが表示され、テーブル構造全体とLineage Graph(リネージグラフ)が表示されます。これは、データがどこからどこへ流れるかを視覚化した図です。同僚からロジックについて聞かれたら、リンクを送るだけで済みます。

運用と監視

数百ものモデルを抱えシステムが大きくなると、手動でコマンドを打つのは非効率です。dbtをAirflowやGitHub Actionsなどのスケジューリングツールに統合することをお勧めします。

実行のたびに、dbtは target/ フォルダにJSONファイルを出力します。run_results.json を活用してログをGrafanaに送ることも可能です。これにより、実行時間を監視し、ユーザーから報告を受ける前にエラーを早期発見できます。

最後のアドバイス: すべての古いSQLを1日でdbtに移行しようと急がないでください。まずは最も重要なテーブルから始め、いくつかの基本的なテストを設定しましょう。導入から1〜2週間後には、データ管理の効率が劇的に変わるのを実感できるはずです。

Share: