Snowflakeを使ってみる話①

仕事

来月の案件でSnowflakeを使うことになったので、基本的なところから学習し、まとめてみました。


🟢 概要:

Snowflakeとは?

Snowflakeはクラウドベースのデータウェアハウスサービスで、AWS、Azure、GCPなどの複数のクラウドプラットフォーム上で動作します。従来のオンプレミス型データウェアハウスと比べて、スケーラビリティやパフォーマンス、コスト効率に優れ、特に次のような特徴があります。

Snowflakeのすごいところ:

  1. 完全な分離アーキテクチャ
     コンピュート(計算)、ストレージ、サービスレイヤーが完全に分離されており、それぞれを独立してスケール可能です。

  2. ゼロコピークローン
     データを複製することなく、スナップショットを作成できるため、開発やテスト環境の構築が容易です。

  3. セキュリティとガバナンス
     カラムレベルのマスキング、行レベルのアクセス制御など、きめ細かなデータ管理が可能です。

  4. 自動最適化
     インデックス管理やパーティション分割が不要で、Snowflakeが自動的にクエリパフォーマンスを最適化します。

AWSとの違い:

項目 Snowflake AWS (Redshift)
管理負荷 フルマネージド(チューニング不要) 一部手動でのチューニングが必要
パフォーマンス ワークロードに応じた自動スケーリング クラスターサイズに依存
データ共有 アカウント間で安全かつリアルタイムに共有可能 データコピーが必要
コスト体系 ストレージとコンピュートが完全に分離して課金される クラスター単位の課金

🟡 用語:

用語 説明
データベース データを論理的にまとめるコンテナ。複数のスキーマを持つことが可能です。
スキーマ データベース内でテーブルやビューを管理するための論理的なグループです。
テーブル データを格納する基本的な構造。リレーショナル形式で管理されます。
ステージ 外部データを一時的に保管する場所。CSVやJSONファイルをロードする際に使用します。
ウェアハウス クエリを実行するためのコンピュートリソース。スケールアップ/ダウンが可能です。
マーケットプレイス サードパーティのデータセットやアプリケーションを簡単に取得できる場所です。
ロール ユーザーの権限を定義する役割。データベースやウェアハウスへのアクセスを制御します。

🔵 トライアルについて:

Snowflakeは30日間の無料トライアルが提供されており、400ドル分のクレジットが付与されます。初期設定は非常に簡単で、ウェブコンソールからアカウントを作成し、ワークシート上でSQLを実行するだけで操作を始められました。


🟣 トライアルでやってみたこと:

① データベース、スキーマ、テーブルの作成とデータロード

まず、データベースとスキーマを作成し、ステージにCSVとJSONデータをアップロード。Snowflakeのワークシートを使い、SQLとPythonでデータをロードしました。

参考コード:

sql
— データベース、スキーマ、テーブル作成
CREATE DATABASE demo_db;
CREATE SCHEMA demo_schema;
CREATE TABLE demo_table (
id INT,
name STRING,
age INT
);– ステージ作成
CREATE OR REPLACE STAGE my_stage;

— ファイルをステージにアップロード(ローカルからCLI使用)
— snowflake CLIから
PUT file:///path/to/data.csv @my_stage;

— ステージからデータをテーブルにロード
COPY INTO demo_table
FROM @my_stage/data.csv
FILE_FORMAT = (TYPE = CSV, SKIP_HEADER = 1);

② PDFファイルの読み取りとデータベースへの格納

次に、ステージに配置したPDFファイルからテキストを抽出し、ページごとにデータベースに格納しました。

参考コード(Python Snowflake Connector使用):

python
import snowflake.connector
import fitz # PyMuPDF# 接続設定
conn = snowflake.connector.connect(
user=’YOUR_USERNAME’,
password=’YOUR_PASSWORD’,
account=’YOUR_ACCOUNT’
)

cursor = conn.cursor()

# PDFファイル読み込み
stage_name = “my_stage”
file_name = “sample.pdf”
local_dir = “/tmp”

# ステージからファイル取得
cursor.execute(f”GET @my_stage/{file_name} {local_dir}”)

# PDF解析
pdf_path = f”{local_dir}/{file_name}”
doc = fitz.open(pdf_path)

for page_num in range(len(doc)):
page = doc.load_page(page_num)
text = page.get_text()

# データベースに格納
insert_query = f”””
INSERT INTO pdf_table (page_number, content)
VALUES ({page_num + 1}, ‘{text.replace(“‘”, “””)}’)
“””
cursor.execute(insert_query)

doc.close()
cursor.close()
conn.close()

🟠 苦労したこと:

1. ステージからのファイル読み込みエラー
ステージからファイルを読み込もうとするとFile not foundエラーが頻発。調べた結果、session.file.get(f"@{stage_name}/{file_name}", load_dir)のように明示的にファイルを取得することで解決しました。

2. 権限設定
トライアル環境では、デフォルトでACCOUNTADMINロールを使用できますが、実運用ではロール設定を適切に行わないとアクセス制御でつまずくことがあります。


🟢 これから試すこと:

今後は、以下の先進的な機能にもチャレンジ予定です。

  1. Snowflake Cortex(AI/ML機能)
     SQLだけで要約やテキスト分析が可能なCortexを使い、実践的なタスクを試してみます。

  2. 自然言語による質問と分析
     SQLを使ってプロンプト形式でデータに質問できる機能があり、業務効率化に役立ちそうなので試行中です。


🌟 まとめ:

Snowflakeは初学者でも扱いやすく、データウェアハウスの構築が驚くほどスムーズでした。特に、ステージ環境やCortexなどの機能を使いこなせば、データ分析の生産性を大きく向上できそうです。引き続き、AIやMLの実験を進めて知見を共有していきたいと思います。


Snowflakeの導入を検討している方の参考になれば幸いです!

コメント

タイトルとURLをコピーしました