初めに
以前執筆したブログで、dltを用いてOpenWeatherMap APIからDuckDBにデータを格納する方法を紹介しました。今回は、その続編としてSnowflakeにデータを格納する方法を紹介します。dltや当該APIの説明は前回のブログをご覧ください。Snowflakeとは
Snowflakeとは、クラウド型のデータプラットフォームの一つです。データの格納、加工、連携など幅広い機能を持ち、それでいてクラウド型のためサーバーの導入・運用コストがかからない点が特長です。 データ活用に関わる主なシステムには、データレイク、データウェアハウス、データマートの3つがあります。それぞれの概要や特長は以下の通りです。システム名 | 概要 | 特長 |
---|---|---|
データレイク | システムから収集したデータを元データと同じ形式で格納するデータベース | データの構造や種類を問わずに一元管理が可能 |
データウェアハウス | システム間でデータの構造やフォーマット等を統一した上で格納するデータベース | 様々なシステム上のデータを集約するため、横断的なデータ分析が可能 |
データマート | データの用途、利用目的に応じて必要なもののみを抽出・加工した上で格納するデータベース | 個別の分析に特化した構造のため、素早い分析が可能。 |

Snowflakeを用いることで、これらのシステムを物理的に異なるデータベースで分けるのではなく、単一のプラットフォームの中でスキーマやテーブルの設計によって論理的に分割することが可能になり、管理がシンプルで楽になります。
前準備
データベースの作成
Snowflakeのアカウント(トライアル可)を作成し、SQL Worksheetから以下のSQLを実行します。
CREATE DATABASE dlt_weather; CREATE ROLE DLT_LOADER_ROLE; GRANT ROLE DLT_LOADER_ROLE TO USER <username>; GRANT USAGE ON DATABASE dlt_weather TO DLT_LOADER_ROLE; GRANT CREATE SCHEMA ON DATABASE dlt_weather TO ROLE DLT_LOADER_ROLE; GRANT USAGE ON WAREHOUSE COMPUTE_WH TO DLT_LOADER_ROLE; GRANT ALL PRIVILEGES ON FUTURE SCHEMAS IN DATABASE dlt_weather TO DLT_LOADER_ROLE; GRANT ALL PRIVILEGES ON FUTURE TABLES IN DATABASE dlt_weather TO DLT_LOADER_ROLE;成功すると、DLT_WEATHERというデータベースが作成されます。

パイプラインの構築
初めに、以下のパッケージをインストールします。pip install "dlt[snowflake]"次に、任意の場所にディレクトリを作成し、その直下で以下のコマンドを実行します。
dlt init <pipeline_name> snowflake実行後はディレクトリ内に2つのファイルが作られます。
<pipeline_name>/ │── <pipeline_name>_pipeline.py │── requirements.txtここで、<pipeline_name>_pipeline.pyはdltを使って様々なデータソースからSnowflakeにデータをロードするサンプルスクリプト、requirements.txtはPythonのパッケージ管理を指定するファイルです。 同ディレクトリ直下で以下のコマンドを実行することで、必要なパッケージがインストールされます。
pip install -r requirements.txt最後に、
.dlt/secrets.toml
の中身を先ほど実行したSQLに沿って編集します(dltは隠しフォルダのため、Macの場合は「command 」+「ShIft」+「.」で表示する)
[destination.snowflake.credentials] database = "DLT_WEATHER" # please set me up! password = "password" # please set me up! username = "username" # please set me up! host = "Account Identifier" # please set me up! warehouse = "COMPUTE_WH" # please set me up! role = "DLT_LOADER_ROLE" # please set me up!passwordとusernameは最初にアカウントを作成したときに設定したものを、hostはAccount Details内のAccount Identifierを入力します。


前準備はこれで以上です。
データの取得と格納
以下のコードを実行します。前半ではAPIを実行し指定した都市の天気データを取得しています。後半では格納するパイプラインを設定し実行しています。前回から少しコードを変更し、都道府県名をまとめたExcelファイルを読み込むことで1回の実行で同時に複数の天気情報を取得しています。import dlt import pandas as pd from dlt.sources.helpers import requests df = pd.read_excel("prefecture.xlsx") # A列にidがある city_list = df["City_id"].tolist() # "City_id"列をリスト化 API_key = "hoge" weather_data = [] # 各都道府県についてAPIを実行 for city in city_list: url = f"https://api.openweathermap.org/data/2.5/weather?id={city}&appid={API_key}" response = requests.get(url) if response.status_code == 200: weather_data.append(response.json()) # JSONデータをリストに追加 else: print(f"Error fetching data for {city}: {response.status_code}") weather_df = pd.DataFrame(weather_data) pipeline = dlt.pipeline( pipeline_name="weather_snowflake", destination="snowflake", dataset_name="DLT_WEATHER", ) #実際のコードでは@を_に変えてください load_info = pipeline.run(weather_data, table@name="weather")
実行結果
前準備で作成したデータベース:DLT_WEATHERの中にテーブル:WEATHERが追加されており、47都道府県のデータが格納されています。

Tableauとの連携
以下の接続情報を入力します。サーバーはAccount Details内記載のURLを、役割・ウェアハウスは前準備のSQLで設定したものを、ユーザー名・パスワードはアカウント作成時に設定したものを入力します。
都道府県ごとの気温を色付きマップで表しました。

最後に
今回はOpenWeahterMapのAPIから取得したデータをdltを用いてSnowflakeに格納し、Tableauと連携して可視化しました。前回紹介したローカルのDuckDBに格納する方法と比較して、Snowflakeへの接続情報を追加する以外はほとんど同じ手順で実行可能です。また、Google BigQuery等の他のデータベースへ格納する際も今回と同様の手順で実行可能であり、非常に使いやすいライブラリだと感じました。