Snowflakeでのアプリケーションの開発

Snowflakeでアプリケーションの開発を開始するには、最初にSnowflakeの基本に精通する必要があります。このトピックでは、Snowflakeでアプリケーションを開発するために必要な基本的なタスクについて説明します。次の方法を学習します:

  • SnowSQL CLI クライアントをインストールして構成します。

  • 仮想ウェアハウス、データベース、およびテーブルを作成します。

  • テーブルにデータをロードし、テーブルにクエリを実行します。

  • Pythonを使用して、Snowflakeに接続し、クエリを実行し、返されたデータを操作します。

次に、この知識を使用して、Snowflakeで利用できるより高度な機能を調べることができます。

このトピックの内容:

SnowSQL CLI クライアントをダウンロードしてインストールします

最初のステップは、Snowflake Client Repositoryから SnowSQL CLI クライアントをダウンロードすることです。SnowSQL をダウンロードしてインストールする手順は、 OS 固有です。

Linux

curl を使用して、Snowflake Client RepositoryからLinuxバージョンのクライアントをダウンロードできます。

curl -O https://sfc-repo.snowflakecomputing.com/snowsql/bootstrap/1.2/linux_x86_64/snowsql-<version>-linux_x86_64.bash

ダウンロード後、ターミナルウィンドウの bash からクライアントをインストールします。

bash snowsql-<version>-linux_x86_64.bash

または、クライアントの RPM バージョン(snowflake-snowsql-<バージョン>-1.x86_64.rpm)をダウンロードしてインストールすることもできます。

rpm -i snowflake-snowsql-<version>-1.x86_64.rpm
macOS

curl を使用して、Snowflake Client Repositoryからクライアントの macOS バージョンをダウンロードできます。

curl -O https://sfc-repo.snowflakecomputing.com/snowsql/bootstrap/1.2/darwin_x86_64/snowsql-<version>-darwin_x86_64.pkg

ダウンロード後、 snowsql-<バージョン>-darwin_x86_64.pkg ファイルをダブルクリックしてクライアントをインストールします。

または、Homebrewを使用している場合は、Homebrew Caskを使用してクライアントをインストールできます。

brew cask install snowflake-snowsql
Windows

curl を使用して、Snowflake Client RepositoryからクライアントのWindowsバージョンをダウンロードします。

curl -O https://sfc-repo.snowflakecomputing.com/snowsql/bootstrap/1.2/windows_x86_64/snowsql-<version>-windows_x86_64.msi

次に、MSI ファイルを実行してインストールします。

インストール後、ターミナルウィンドウで snowsql コマンドを実行して、クライアントが正常にインストールされたことを確認します。

snowsql

出力には、クライアントで使用できるすべての使用可能なパラメーターが表示されます。

SnowSQL を使用して仮想ウェアハウス、サンプルデータベース、およびテーブルを作成する

Snowflakeにログインする

SnowSQL がインストールされると、Snowflakeにログインできます。そのためには、次の情報が必要です。

  • <アカウント名>: Snowflakeによってアカウントに割り当てられた名前。これは、Snowflakeから受け取った URL の .snowflakecomputing.com の前にある文字列です。

  • <ユーザー名> (および付随するパスワード): これは、アカウントで作成されたSnowflakeユーザーです。

ログインするには、ターミナルウィンドウを開き、次のコマンドを入力します。

snowsql -a <account_name> -u <username>

パスワードの入力を求められます。ログイン試行が成功すると、ユーザーに対してSnowflakeセッションが開始され、SnowSQL ログインとプロンプトが表示されます。たとえば、SnowSQL 1.2.9をインストールし、Snowflakeのユーザー名が user1 の場合、ログインとプロンプトは次のようになります。

* SnowSQL * v1.2.9
Type SQL statements or !help
user1#(no warehouse)@(no database).(no schema)>

SnowSQL プロンプトは、セッションで現在使用されている仮想ウェアハウス、データベース、またはスキーマがないことを示していることに注意してください。

次のセクションでは、これらの必要なSnowflakeオブジェクトを作成し、セッションで使用する方法について説明します。

仮想ウェアハウスの作成

仮想ウェアハウス は、Snowflakeのテーブルでクエリと DML 操作(データの読み込みなど)を実行するために必要なコンピューティングリソースを提供します。仮想ウェアハウスにはさまざまなサイズがあり、クエリとデータの読み込みのワークロードに合わせて各ウェアハウスを適合させることができます。

この例では、 CREATE WAREHOUSE コマンドを使用して、 sf_tuts_wh という名前のX-Smallウェアハウスを作成します。

CREATE OR REPLACE WAREHOUSE sf_tuts_wh WITH
  WAREHOUSE_SIZE='X-SMALL'
  AUTO_SUSPEND = 180
  AUTO_RESUME = TRUE
  INITIALLY_SUSPENDED=TRUE;

必要なパラメーターは、ウェアハウスの名前だけです。ただし、この例では、いくつかの追加のオプションのパラメーターを設定します。

  • AUTO_SUSPEND: ウェアハウスが自動的に中断されるまでの非アクティブの秒数を指定します。

  • AUTO_RESUME: TRUE に設定すると、一時停止中のウェアハウスは、クエリが送信されると自動的に再開されます。

  • INITIALLY_SUSPENDED: TRUE に設定すると、ウェアハウスは一時停止状態で作成されます。

これらの追加パラメーターにより、ウェアハウスは一時停止状態で作成され、実行されない限りクレジットを使用しないため、超過クレジットを使用しません。また、ワークフローが中断されないように、クエリが送信されるとすぐにウェアハウスを再開できるようにします。

ちなみに

Snowflakeのオブジェクト名は、 識別子 とも呼ばれ、特に明記されていない限り、大文字と小文字は区別されません(すべて大文字で表示されます)。詳細については、 オブジェクト識別子 をご参照ください。

作成されると、更新された SnowSQL プロンプトに示されているように、仮想ウェアハウス(sf_tuts_wh)がセッションで自動的に使用されます。

user1#SF_TUTS_WH@(no database).(no schema)>

セッションで使用されているウェアハウスを表示するには、 CURRENT_WAREHOUSE 関数を使用することもできます。

SELECT CURRENT_WAREHOUSE();

セッションで使用するウェアハウスを明示的に指定するには、 USE WAREHOUSE コマンドを使用します。

USE WAREHOUSE sf_tuts_wh;

これで、仮想ウェアハウスが正常に作成されました。データベースとテーブルに移りましょう。

データベースを作成

CREATE DATABASE コマンドを使用してデータベースを作成します。この例では、 sf_tuts という名前のデータベースを作成します。

CREATE OR REPLACE DATABASE sf_tuts;

Snowflakeでデータベースを作成すると、 public という名前のデフォルトスキーマがデータベースに自動的に作成されます。更新された SnowSQL プロンプトに示されているように、データベースとスキーマの両方がセッションで自動的に使用されます。

user1#SF_TUTS_WH@SF_TUTS.PUBLIC>

参照:

テーブルを作成

データベースに保存されているデータの操作を開始するには、最初にデータのテーブルを作成する必要があります。これは、 CREATE TABLE コマンドを使用して実行できます。

テーブルの列名とデータ型は、ロードするデータと一致している必要があります。このトピックの目的上、ロードされるデータは、ダウンロード用に ここ にあるサンプル CSV ファイルで提供される従業員情報です。

ZIP ファイルをダウンロードしてから、CSV ファイルを環境内の任意の場所に抽出します。このトピックの後続の例では、場所は tmp という名前のディレクトリであると想定されています。

次の CREATE TABLE の例は、ロードされるデータと一致する列名とデータ型を示しています。テーブルの列名は、サンプルの CSV ファイルの列と一致します。

CREATE OR REPLACE TABLE emp_basic (
  first_name STRING ,
  last_name STRING ,
  email STRING ,
  streetaddress STRING ,
  city STRING ,
  start_date DATE
  );

SnowSQL を使用してデータをロードしクエリする

このセクションでは、SQL コマンドと SnowSQL を使用してデータを一括ロードする方法について説明します。ただし、Snowflakeは、データをロードするための他の多くのオプションをサポートしています。

データの読み込みに関連する他のトピックへのリンクについては、サイドバー(右側)を参照してください。

データファイルをアップロードする

次に、1つ以上のファイルからのデータをテーブルにロードします。まず、 PUT コマンドを使用してファイルを内部ステージにアップロードします。ステージは、ロードする前にファイルが保存される場所です。ワイルドカード(例: *)を使用して、複数のファイルをアップロードできます。

例えば、例の CSV ファイルを sf_tuts.public スキーマで以前に作成した emp_basic テーブルの内部ステージにアップロードするには、次のようにします。

Linuxまたは macOS
PUT file:///tmp/employees0*.csv @sf_tuts.public.%emp_basic;
Windows
PUT file://C:\temp\employees0*.csv @sf_tuts.public.%emp_basic;

ちなみに

データベースとスキーマ名(@sf_tuts.public)の前の @ 記号は、ファイルが外部ステージではなく内部ステージにアップロードされていることを示します。テーブル名(%emp_basic)の前の % 記号は、使用されている内部ステージがテーブルのためのステージであることを示します。クエリステージの詳細については、 ローカルファイルシステムからのデータファイルのステージング をご参照ください。

ファイルからデータをロードする

ファイルがステージングされたら、 COPY INTO <テーブル> コマンドを使用して、ファイルから作成したテーブルにデータをロードできます。

COPY INTO emp_basic
  FROM @sf_tuts.public.%emp_basic
  FILE_FORMAT = (type = csv field_optionally_enclosed_by='"')
  PATTERN = '.*employees0[1-5].csv.gz'
  ON_ERROR = 'skip_file';

FILE_FORMAT はファイルタイプ(例: csv)、およびフィールドの囲み方を指定します。この例では、フィールドは二重引用符で囲まれています。

ちなみに

複数のファイルをロードする場合は、次のオプションのパラメータが役立つ場合があります。

  • PATTERN: パターンを適用して、正規表現に一致するファイルを指定します。

  • ON_ERROR: ファイルのロード中にエラーが発生した場合の動作を指定します。

テーブルをクエリする

データがテーブルに読み込まれると、SQL SELECT ステートメントを使用してクエリを実行できるようになります。

まず、テーブル内のすべての列と行を返すには、次のようにします。

SELECT * FROM emp_basic;

SELECT ステートメントには、特定の条件を満たすデータを取得するための LIKE などの関数を含めることができます。この例では、コマンドは英国のドメイン名(.uk)を持つ電子メールアドレスを返します。

SELECT email FROM emp_basic WHERE email LIKE '%.uk';

テーブルを更新する

DML コマンドを使用して、テーブルを直接操作することもできます。この例では、 INSERT コマンドを使用して、テーブルに1つの行を挿入します。

INSERT INTO emp_basic VALUES
  ('Clementine','Adamou','cadamou@sf_tuts.com','10510 Sachs Road','Klenak','2017-9-22');

Snowflakeは、データを操作するために使用できる他の多くのコマンドをサポートしています。ただし、ここでは、PythonアプリケーションをSnowflakeに接続して、Snowflakeでサポートされているプログラミング言語の機能を活用する方法を見ていきましょう。

SnowflakeでPythonを使用する

このセクションでは、Pythonの使用を開始するためのいくつかの基本的な例を示します。ただし、Snowflakeは、最も一般的なプログラミング言語の多くにインターフェイスを提供しています。

Snowflakeでサポートされているプログラムインターフェイスに関連する他のトピックへのリンクについては、サイドバー(右側)を参照してください。

Python用Snowflakeコネクタをインストールする

Pythonを使用してSnowflakeに接続するには、Python 3.6(またはそれ以降)とPython用Snowflakeコネクタをインストールする必要があります。

まず、ターミナルウィンドウで次のコマンドを実行して、環境にインストールされているPythonのバージョンを確認します。

python --version

バージョンがPython 3.6以降の場合は、続行する準備ができています。バージョンが低いか、Pythonがインストールされていない場合は、更新またはインストールする必要があります。

Linuxまたは macOS

ご使用の環境ディストリビューションでは、パッケージマネージャーを介してPython 3.5以降をインストールできる可能性があります。Pythonパッケージのインストールに使用されるパッケージ管理システムである pip をインストールする必要がある場合もあります。また、ほとんどのディストリビューションのパッケージマネージャーからダウンロードすることもできます。

Windows

Pythonは、Python Software FoundationのWebサイトからダウンロードできます。

Pythonと pip がインストールされている状態で、 pip を使用してコマンドラインからPythonコネクタのパッケージをインストールします。

pip install snowflake-connector-python

Pythonを使用してSnowflakeに接続し、データのクエリやその他の操作を実行できるようになりました。

ちなみに

始める前に、SnowSQL 認証情報を環境変数として追加して、スクリプトで公開されないようにすることを検討する必要があります。詳細については、 SnowSQLを介した接続 をご参照ください。

コネクタをインポートする

Pythonアプリケーションで、最初にコネクタパッケージ(snowflake.connector)をインポートします。環境変数を使用している場合は、 os パッケージもインポートする必要があります。

import snowflake.connector
import os

Snowflakeに接続する

次に、認証情報を使用してSnowflakeに接続します。認証情報を環境変数として設定した場合は、ここでそれらを参照してください。これは、Snowflakeセッションで使用する仮想ウェアハウス、データベース、およびスキーマを指定する場所でもあります。

USER = os.getenv('SNOWSQL_USER')
PASSWORD = os.getenv('SNOWSQL_PWD')
ACCOUNT = os.getenv('SNOWSQL_ACCOUNT')

ctx = snowflake.connector.connect(
  user=USER,
  password=PASSWORD,
  account=ACCOUNT,
  warehouse='SF_TUTS_WH',
  database='SF_TUTS',
  schema='PUBLIC'
  )

クエリを定義する

コマンドを使用して、アプリケーションに必要なデータを指定できます。この例では、複数の文字列を1つのクエリに連結します。

command = "SELECT start_date FROM emp_basic "
command += "WHERE start_date >= '2016-12-31' "
command += "ORDER by start_date;"

クエリを実行して結果を返す

SQL コマンドは、カーソルオブジェクトイテレータメソッドを介して実行されます。その後、日付はPythonの空のリストに追加されます。

dates = []
cs = ctx.cursor()
try:
    cs.execute(command)
    for start_date in cs:
        dates.append(start_date)
finally:
    cs.close()

データをPythonプログラムに直接読み込むと、Pythonパッケージを使用してデータを処理できます。たとえば、 seaborn および matplotlib.pyplot 視覚化パッケージを使用してデータを視覚化できます。

import matplotlib.pyplot
import seaborn as sns

months = []

for i in dates:
    months.append(i.strftime('%m'))

sns.distplot(
    months,
    hist = True,
    axlabel = "Month",
    label = "Employee Growth in 2017",
    bins = 12,
    kde=False)

matplotlib.pyplot.show()

結果のグラフは次のようになります。

Example of visualization package showing employee growth

PythonとSnowflakeでできることの詳細については、 Pythonのドキュメント を参照してください。

次のステップ

このトピックのタスクを完了すると、SnowSQL とPython用Snowflakeコネクタの使用の基本に慣れることができます。

サンプルデータベースと仮想ウェアハウスをドロップする(オプション)

このトピックで作成したサンプルデータベースとウェアハウスを使用する予定がない場合は、それらをドロップすることを検討する必要があります。

DROP DATABASE IF EXISTS sf_tuts;

DROP WAREHOUSE IF EXISTS sf_tuts_wh;

高度なアプリケーション機能

Snowflakeの機能をさらに詳しく調べるときは、高度なアプリケーションの開発に使用できる次の機能を検討してください。

機能エリア

特徴

半構造化データ(JSON、Avro、Parquetなど)

半構造化データ

データレイク

外部テーブルの使用

Time Travel

Time Travelの理解と使用

連続データパイプライン

テーブルストリームを使用した変更追跡 . タスクを使用したスケジュールでの SQL ステートメントの実行

変数

SQL 変数

複数ステートメントトランザクション

トランザクション

関数とプロシージャ

UDFs (ユーザー定義関数) . 外部関数 . ストアドプロシージャ