2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Snowflakeハンズオン|EC分析基盤構築の最小構成を作ってみた

Posted at

はじめに

※ 本記事は ハンズオン用のサンプル構成です。
実際の 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)を試します

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?