はじめに
※ 本記事は ハンズオン用のサンプル構成です。
実際の EC 業務では、データ量・粒度・業務ルールはより複雑になりますが、
Snowflake の基本的な設計イメージを掴むための参考例として記載しています。
Snowflake の hands-on として、
最小構成で「分析 → 自動化」までを一通り動かすことを目的に環境を作ってみました。
本記事では以下を扱います。
- Warehouse の作成
- テストデータ作成
- 単純集計
- Stored Procedure
- Task による日次実行(※実行は停止状態)
全体構成
Warehouse
→ Database / Schema
→ テストデータ作成
→ 集計SQL
→ Stored Procedure
→ Task(CRON)
1. Warehouse を作成する
CREATE OR REPLACE WAREHOUSE WH_HANDSON_LIU
WAREHOUSE_SIZE = XSMALL
AUTO_SUSPEND = 60
AUTO_RESUME = TRUE;
hands-on のため XSMALL
無駄な課金を避けるため AUTO_SUSPEND = 60
2. Database / Schema 作成
CREATE OR REPLACE DATABASE EC_DEMO;
USE DATABASE EC_DEMO;
CREATE OR REPLACE SCHEMA ANALYTICS;
USE SCHEMA ANALYTICS;
分析用途なので、明示的に schema を切っています。
3. ベーステーブル作成(Customers / Orders)
Customers
CREATE OR REPLACE TABLE customers (
customer_id STRING,
country STRING
);
テストデータを GENERATOR で作成します。
INSERT INTO customers
SELECT
'C' || LPAD(SEQ4()::STRING, 3, '0') AS customer_id,
CASE
WHEN MOD(SEQ4(), 3) = 0 THEN 'JP'
WHEN MOD(SEQ4(), 3) = 1 THEN 'US'
ELSE 'CN'
END AS country
FROM TABLE(GENERATOR(ROWCOUNT => 100));
Orders
CREATE OR REPLACE TABLE orders (
order_id STRING,
customer_id STRING,
order_date DATE,
order_amount NUMBER(10,2)
);
INSERT INTO orders
SELECT
'O' || LPAD(SEQ4()::STRING, 4, '0') AS order_id,
'C' || LPAD(UNIFORM(0, 99, RANDOM())::STRING, 3, '0') AS customer_id,
DATEADD(
DAY,
-UNIFORM(0, 30, RANDOM()),
CURRENT_DATE
) AS order_date,
ROUND(UNIFORM(1000, 50000, RANDOM()), 2) AS order_amount
FROM TABLE(GENERATOR(ROWCOUNT => 100));
👉 外部ファイルを使わずに完結するため、hands-on では非常に便利です。
4. 単純集計でデータ確認
SELECT
order_date,
SUM(order_amount) AS gmv
FROM orders
GROUP BY order_date;
まずは データの分布が自然かを確認します。
5. Stored Procedure で集計処理を定義
CREATE OR REPLACE PROCEDURE sp_refresh_daily_sales(target_date DATE)
RETURNS STRING
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
BEGIN
INSERT INTO daily_sales_summary
SELECT
o.order_date,
c.country,
SUM(o.order_amount),
CURRENT_TIMESTAMP
FROM orders o
JOIN customers c
ON o.customer_id = c.customer_id
WHERE o.order_date = :target_date
GROUP BY o.order_date, c.country;
RETURN 'OK ' || :target_date;
END;
$$;
なぜ Stored Procedure か
集計定義を 1 箇所に集約できる
Task / 再計算の両方で使える
ロジックの変更管理がしやすい
6. 手動実行
CALL sp_refresh_daily_sales(CURRENT_DATE);
7. Task 作成(※実行は停止)
CREATE OR REPLACE TASK task_daily_sales
WAREHOUSE = WH_HANDSON_LIU
SCHEDULE = 'USING CRON 0 2 * * * Asia/Tokyo'
AS
CALL sp_refresh_daily_sales(CURRENT_DATE - 1);
-- hands-on のため、すぐに停止します。
ALTER TASK task_daily_sales SUSPEND;
まとめ
Snowflake では Stored Procedure + Task でバッチ処理を簡潔に構築できる
hands-on では「性能」より 一連の流れを理解することが重要
次は外部データ連携(S3)を試します