Snowflake はクラウド上に構築されたデータプラットフォームです。基本的な使い方を記載します。
参考資料: UNDERSTANDING SNOWFLAKE PRICING
AWS Tokyo リージョン
AWS Northern Virginia リージョン
確認コマンドの例
SELECT system$behavior_change_bundle_status('2021_08');
参考資料:
SnowSQL は "Snowflake Connector for Python" によって実装された、Snowflake CLI Client です。
インストール方法: Download and Install SnowSQL
vagrant@debian11:~$ ls .snowsql/
1.2.17 1.2.18 autoupgrade config downloadlck history mylog
.snowsql/config
→ 設定ファイルです。major.minor.patch
バージョンのうち、patch については、実行時に新しいバージョンが見つかると自動更新されます。
--noup
オプションを付与すると自動更新を無効化して起動できます。組織に所属するアカウントの場合は <organization_name>-<account_name>
を -a
に指定できます。
フリートライアルで取得したアカウント等の場合は、以下のように指定します。Snowflake アカウントのリソースは AWS/GCP/Azure のいずれかのクラウド上に構築されます。以下は、AWS Tokyo リージョンを指定して作成した場合のアカウントにおけるユーザの例です。
snowsql -a xxxx.ap-northeast-1.aws -u myuser
MFA が有効なユーザの場合は -M
を指定します。
snowsql -a xxxx.ap-northeast-1.aws -u myuser -M
参考資料:
ユーザ名とパスワードによる認証の他に、公開鍵・秘密鍵による認証も可能です。公開鍵と秘密鍵のペアを生成します。一般に秘密鍵はパスワード (共通鍵) で暗号化することが可能です。SnowSQL の場合は、暗号化された秘密鍵にのみ対応しています。そのため -nocrypt
オプションは付与しません。
openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out snowflake.p8
openssl rsa -in snowflake.p8 -pubout -out snowflake.pub
公開鍵は securityadmin 以上のロールで設定します。
USE ROLE securityadmin;
ALTER USER myuser set rsa_public_key='MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCg...';
DESC USER myuser;
秘密鍵を用いた認証が可能となります。
snowsql -a xxxx.ap-northeast-1.aws -u myuser --private-key-path snowflake.p8
鍵の更新 (ローテーション) を行なうためには rsa_public_key_2
を利用します。
ALTER USER myuser set rsa_public_key_2='xxx';
ALTER USER myuser unset rsa_public_key;
関連資料:
Python3 のバージョンと snowflake-connector-python
で利用可能なバージョンを確認します。
python3 --version
python3 -m pip install snowflake-connector-python==dummy
Python 3.9 で snowflake-connector-python
2.6.1 を利用する場合の例です。pip に依存関係の解決を任せることも可能ですが、テスト済みの依存ライブラリのバージョンを指定する方法が推奨されています。
python3 -m pip install -r https://raw.githubusercontent.com/snowflakedb/snowflake-connector-python/v2.6.1/tested_requirements/requirements_39.reqs
python3 -m pip install snowflake-connector-python==2.6.1
パスワード認証
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import snowflake.connector
ctx = snowflake.connector.connect(
user='myuser',
password='PASSWORD',
account='xxxx.ap-northeast-1.aws'
)
cs = ctx.cursor()
try:
cs.execute('SELECT current_version()')
one_row = cs.fetchone()
print(one_row[0])
finally:
cs.close()
ctx.close()
鍵認証
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import snowflake.connector
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
with open('/home/vagrant/snowflake.p8', 'rb') as key:
p_key= serialization.load_pem_private_key(
key.read(),
password='XXXX'.encode(),
backend=default_backend()
)
pkb = p_key.private_bytes(
encoding=serialization.Encoding.DER,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption())
ctx = snowflake.connector.connect(
user='myuser',
account='xxxx.ap-northeast-1.aws',
private_key=pkb
)
cs = ctx.cursor()
try:
cs.execute('SELECT current_version()')
one_row = cs.fetchone()
print(one_row[0])
finally:
cs.close()
ctx.close()
参考資料:
参考資料: Snowflake in 20 Minutes
Snowflake において、ストレージ database と計算資源 warehouse は分離されています。以下の例では、何も処理していない状態が 60 秒間続くと自動で停止するように設定しています。
CREATE OR REPLACE WAREHOUSE mywh WITH
WAREHOUSE_SIZE = XSMALL
AUTO_SUSPEND = 60
AUTO_RESUME = true
INITIALLY_SUSPENDED = true;
SELECT CURRENT_WAREHOUSE();
一覧の確認
SHOW DATABASES;
作成 (存在する場合は drop してから create)
CREATE OR REPLACE DATABASE mydb;
DB を作成すると、明示的に use することなく、現在のセッションで use された状態となります。
SELECT CURRENT_DATABASE();
DB には public という名称の schema が既定で存在しており、use された状態となります。
SELECT CURRENT_SCHEMA();
CREATE OR REPLACE TABLE mytbl (
c1 STRING,
c2 DATE
);
SHOW TABLES;
DESC TABLE mytbl;
SELECT COUNT(*) FROM mytbl;
DROP DATABASE IF EXISTS mydb;
DROP WAREHOUSE IF EXISTS mywh;
!exit;
data.csv
aaa,8/25/2017
bbb,12/10/2017
ccc,10/18/2017
ddd,8/13/2017
eee,11/27/2017
Snowflake アカウントには stage と呼ばれる領域が割り当てられます。stage にデータをアップロードするコマンドは以下のようになります。public
はスキーマ名です。PUT
に指定するファイルにはワイルドカードを指定できます。
PUT file://c:\Users\username\Desktop\data.csv @mydb.public.%mytbl;
LIST @mydb.public.%mytbl;
REMOVE @mydb.public.%mytbl/data.csv.gz
Stage から table へのデータロードのコマンドは以下のようになります。既定では、同じファイルからの読み込みは重複して行えないようになっています。FORCE = TRUE
を指定するとこれを無視できます。
USE mydb;
USE WAREHOUSE mywh;
COPY INTO mytbl
FROM @%mytbl
FILE_FORMAT = (TYPE = CSV FIELD_OPTIONALLY_ENCLOSED_BY='"')
FILES = ('data.csv.gz')
ON_ERROR = SKIP_FILE;
サポートケースの作成は、別の管理サイトから行います。community.snowflake.com
ドメインのサイトで新規にアカウントを作成した後に、Snowflake アカウントとの紐付けを申請します。
紐付けが承認されると、以下のような画面から case を作成できます。アカウント作成時のメールアドレス以外にも通知したい場合は Collaborator's Email を指定します。複数の Snowflake アカウントを紐付けている場合は、適切な Account Name を選択します。