Snowflakeことはじめ

こんにちは。エキサイトでエンジニアをしております、吉川です。エキサイトホールディングス Advent Calendar2024 8日目の記事になります。

私が担当しているKUROTENでは、SnowflakeというDWH(データウェアハウス)を使用しているので、今日はその使い方を書いていこうと思います。

DWHとは何か?

DWHとはデータ分析のために用いられるデータベースの一種です。複数のシステム、データソースから横断的にデータを集約し、これを使って分析を行い組織の意思決定を実現することを目的とします。

似たような概念としてデータレイクという言葉がありますが、DWHとは扱うデータの対象が異なります。 DWHはCSVやデータベースなど規則性のある構造化されたデータを扱う一方で、データレイクは構造化されていない、メールや画像・動画も対象になります。

Snowflakeで何ができるのか?

Snowflakeクラウド上でDWHが使えるSaaSです。日本語にも対応しており、公式サイトによると7,200以上のブランドで利用されているそうです。 www.snowflake.com

セキュリティーやスケールなどはSnowflake側で管理されるフルマネージドなサービスになっており、ユーザーはデータの中身に意識を割けるようになっています。

Snowflake上のテーブルを作る

Snowflake上にCSVをアップロードすることでテーブルを作成できます。また列の名前と型が一致するなら、CSVの中身を既存のテーブルに追加することもできます。

アップロード画面
テーブル作成結果

Snowflakeテーブルは以下のような階層構造の下に作成されます。

  • データベース

データベースやスキーマを適切な粒度で区切ることで、データをより構造的に扱うことができます。KUROTENではご利用企業様ごとに区切って使用しています。

AWSと連携する

スキーマの下にはテーブルの他にステージを作成できます。これはSnowflake内になんでも保存できるストレージの役割をしますが、Amazon S3と同期することもできます。

S3の特定のバケット、キーを指定すると、それ以下のオブジェクトをSnowflakeでも扱えるようになります。ただしそのキーへのアクセス権限を持ったIAMユーザー情報が必要になります。

前述のCSVも、直接アップロードせずS3とステージを経由して使用することもできます。 ステージはSnowflakeだけで独立して使用することもできますが、S3と連携するとライフサイクルなどのエコシステムの恩恵を受けられるので、KUROTENでは連携して使っています。

SQLを叩く

プロジェクト > ワークシートから、SQLを実行できます。 Snowflakeは全体的にSQLによる操作が可能で、テーブルやステージの作成もSQLから実行できるようになっています。

Snowflake APIを叩く

SnowflakeにはREST APIがあり、上記のSQLを実行する形になります。 テーブルを直接作ったり削除するAPIがサポートされていないのが個人的に意外だったのですが、これはこれで汎用性があるようにも思います。

KUROTENではバックエンドにGoを使っているので、これでREST APIを叩いています。

package sample

import (
    "database/sql"
    "fmt"
    _ "github.com/snowflakedb/gosnowflake"
)

func createSnowflakeTable() error {
    // DB接続
    dataSourceName := fmt.Sprintf("%s:%s@%s-%s", "ユーザー名", "パスワード", "SnowflakeアカウントID", "Snowflakeアカウント名")
    db, err := sql.Open("snowflake", dataSourceName)
    if err != nil {
        return err
    }
    defer db.Close()

    // SQL実行
    _, err = db.Query(`create or replace TABLE DATABASE_SAMPLE.SCHEMA_SAMPLE.TABLE_SAMPLE (
      ID NUMBER(38,0),
      NAME VARCHAR(16777216),
      HEIGHT NUMBER(38,0),
      WEIGHT NUMBER(38,0),
      AGE NUMBER(38,0)
  )`)
    if err != nil {
        return err
    }

    return nil
}

Snowflakeをどのように運用するべきか?

DWHはデータの集約に特化しており、集約したデータをどう分析するかは対象としていません。 KUROTENではTableauのようなBIツールを使って可視化を行い、分析や意思決定に役立つようにしています。

KUROTEN内で可視化する

KUROTENでは予めTableauにSnowflakeテーブルを可視化する設定を行い、ボタンクリック、またはスケジュールのタイミングでSnowflakeテーブルを更新するようにしています。

Snowflakeテーブルが更新されると、自動でTableauで可視化した結果にも反映されるようになっており、これを使ってご利用企業様の意思決定をサポートしています。

最後に

いかがだったでしょうか?今後もKUROTENではデータ周りに強い仕組みを取り入れていきたいと思います。

Advent Calendarはまだまだ続きますので、明日以降もお楽しみいただけると幸いです!