data-engineering について
データパイプライン、変換、ストリーム処理、ウェアハウスのスキーマ、データ品質チェックを設計するデータエンジニアリングスキルです。Airflow、Dagster、dbt、Kafka、Great Expectations などのツールに関するパターンと例を紹介します。
主な機能
- 01ETL と ELT のアーキテクチャパターン
- 02Airflow と Dagster によるオーケストレーション
- 03dbt の変換例
- 04Kafka のストリーム処理
- 05ウェアハウス設計と品質管理
- 06増分処理と冪等なパイプライン
活用シーン
- 01ETL と ELT の方式選択
- 02オーケストレーションされたデータパイプラインの構成
- 03ウェアハウステーブルと品質チェックの設計
- 04増分処理とバックフィルの計画
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ travisjneuman/ .claude --skill data-engineeringインストール後、Claude Code で/data-engineeringを入力して読み込まれたか確認します。
詳細
データエンジニアリング
パイプラインアーキテクチャ
ETL と ELT
| パターン | 使用する場面 | ツール |
|---|---|---|
| ETL | 読み込み前に変換する場合、データ品質が重要な場合 | Airflow + custom、Spark |
| ELT | 生データ → データウェアハウス → インプレース変換 | Fivetran + dbt、Airbyte + dbt |
オーケストレーション
Apache Airflow:
from airflow.decorators import dag, task
from datetime import datetime
@dag(schedule="@daily", start_date=datetime(2024, 1, 1), catchup=False)
def my_pipeline():
@task()
def extract() -> dict:
return {"data": "extracted"}
@task()
def transform(data: dict) -> dict:
return {"transformed": True}
@task()
def load(data: dict):
# Load to warehouse
pass
raw = extract()
transformed = transform(raw)
load(transformed)
my_pipeline()
Dagster(新規プロジェクトにおすすめ):
from dagster import asset, Definitions
@asset
def raw_users():
return extract_from_source()
@asset
def cleaned_users(raw_users):
return clean_and_validate(raw_users)
dbt による変換
-- models/marts/dim_customers.sql
{{ config(materialized='table', schema='marts') }}
WITH source AS (
SELECT * FROM {{ ref('stg_customers') }}
),
orders AS (
SELECT customer_id, COUNT(*) as order_count, SUM(amount) as total_spent
FROM {{ ref('stg_orders') }}
GROUP BY customer_id
)
SELECT
s.customer_id,
s.name,
s.email,
COALESCE(o.order_count, 0) as lifetime_orders,
COALESCE(o.total_spent, 0) as lifetime_value
FROM source s
LEFT JOIN orders o ON s.customer_id = o.customer_id
ストリーム処理
Apache Kafka:
from confluent_kafka import Producer, Consumer
# Producer
producer = Producer({'bootstrap.servers': 'localhost:9092'})
producer.produce('events', key='user_123', value=json.dumps(event))
producer.flush()
# Consumer
consumer = Consumer({
'bootstrap.servers': 'localhost:9092',
'group.id': 'my-group',
'auto.offset.reset': 'earliest'
})
consumer.subscribe(['events'])
データウェアハウスのスキーマ設計
スタースキーマ
- ファクトテーブル: 測定可能なイベント(注文、クリック、取引)
- ディメンションテーブル: 説明的なコンテキスト(顧客、商品、日付)
- 緩やかに変化するディメンション: タイプ 1(上書き)、タイプ 2(バージョン管理された行)、タイプ 3(以前の列)
データ品質
- Great Expectations: スキーマ検証、統計テスト、カスタムの期待値
- dbt テスト:
not_null、unique、accepted_values、relationships、カスタム SQL テスト - データコントラクト: スキーマ進化のポリシー、後方互換性の要件
主なパターン
- 冪等性のあるパイプライン: 同じ入力からは常に同じ出力が生成され、安全に再実行できます
- インクリメンタルモデル: 新規または変更されたデータのみを処理し、
updated_atのウォーターマークを使用します - デッドレターキュー: パイプラインをブロックせずに、失敗したレコードを調査用に振り分けます
- バックフィル戦略: 時間でパーティション分割されたテーブルにより、対象を絞った過去データの再処理が可能になります
コメント
Markdown 対応