SnowflakeTech Blog 

氷大賢者の現代転生〜転生してエンジニアになった俺はSnowflakeで無双している〜第2話

実践!Snowflakeチュートリアル!ステップ1 SnowSQLにログインする


セツコ「詰みました〜〜〜〜〜〜〜〜〜!!!」

マスダ「どうしたセツコよ、始まったばかりではないか!」

セツコは画面を震える指で画面を指差す。

セツコ「ここにSnowflakeのアカウントネームとユーザー名を入力しないといけないんです。でも私、マスダ先輩のアカウントを知らないんです…」

マスダ「ぬ?これか?…なら心配に及ばん…!」

$ snowsql -a <account_name> -u <user_name>

(※実際はアカウント名とユーザー名を記しています)

Password:

(※実際はパスワードを入力しています)

マスダ「どうだ」

エンターキーを押下する…そして画面が切り替わる。

セツコ「入れちゃいましたね…なんで…」
マスダ「異世界転生の折、すこし勇者マスダと話す機会があってな、役に立つはずだからと、情報交換しておいたのだ。」

セツコの目が輝く。
ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー
セツコは思春期を異世界転生小説を読み漁るために費やし、この手の話に目がないのであった!!!!!!!!!!!!!!!!
ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー

マスダ「問題ないか?」
セツコ「バッチリです!!」
画面には

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

という文字が踊っていた。

ステップ2 Snowflakeオブジェクトを作成する

セツコ「ではデータベース、テーブル、そしてウェアハウスを作っていきます!個々の詳しい説明は置いておいて、こんかいはチュートリアルをすすめる事を優先しますね!今は、データを格納するための倉庫を作る!みたいなイメージで捉えてくださいね!」

マスダ「あいわかった。」

データベースの作成

>create or replace database sf_tuts;
+----------------------------------------+
| status                                 |
|----------------------------------------|
| Database SF_TUTS successfully created. |
+----------------------------------------+
1 Row(s) produced. Time Elapsed: 0.821s

テーブルの作成

>create or replace table emp_basic (
                                     first_name string ,
                                     last_name string ,
                                     email string ,
                                     streetaddress string ,
                                     city string ,
                                     start_date date
                                     );
+---------------------------------------+
| status                                |
|---------------------------------------|
| Table EMP_BASIC successfully created. |
+---------------------------------------+
1 Row(s) produced. Time Elapsed: 0.392s

仮想ウェアハウスの作成

>create or replace warehouse sf_tuts_wh with
  warehouse_size='X-SMALL'
  auto_suspend = 180
  auto_resume = true
  initially_suspended=true;
+--------------------------------------------+
| status                                     |
|--------------------------------------------|
| Warehouse SF_TUTS_WH successfully created. |
+--------------------------------------------+
1 Row(s) produced. Time Elapsed: 0.257s

ステップ3 データファイルをステージングする

セツコ「ついにここまできました!これから実際に先程ダウンロードしたローカルのサンプルデータをクラウドにあげちゃいますよ!」

マスダ「クラウド、雲とな…!雲上にあるのかSnowflakeは…まさに雪の結晶」

セツコ「そういうわけでは無いのですが…んーまあいいか、進みますね!」

ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー
セツコは面倒な説明はしない主義であった!!!!!!!!!!!!!!!!
ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー・ー

セツコ「put を使ってデータを移動させますが、今回はチュートリアルの記載通りの/tmpではなく~/tmpにサンプルデータを用意していますのでこのように書き換えます。

繰り返しになりますがこのコードはローカルにあるサンプルデータを、先ほど作成したsf_tutsデータベースのemp_basicテーブルの中に展開するという処理です!」

>put file://~/tmp/employees0*.csv @sf_tuts.public.%emp_basic;
employees01.csv_c.gz(0.00MB): [##########] 100.00% Done (0.811s, 0.00MB/s).
employees04.csv_c.gz(0.00MB): [##########] 100.00% Done (0.870s, 0.00MB/s).
employees03.csv_c.gz(0.00MB): [##########] 100.00% Done (1.048s, 0.00MB/s).
employees02.csv_c.gz(0.00MB): [##########] 100.00% Done (0.607s, 0.00MB/s).
employees05.csv_c.gz(0.00MB): [##########] 100.00% Done (0.581s, 0.00MB/s).
+-----------------+--------------------+-------------+-------------+--------------------+--------------------+----------+---------+
| source          | target             | source_size | target_size | source_compression | target_compression | status   | message |
|-----------------+--------------------+-------------+-------------+--------------------+--------------------+----------+---------|
| employees01.csv | employees01.csv.gz |         370 |         288 | NONE               | GZIP               | UPLOADED |         |
| employees02.csv | employees02.csv.gz |         364 |         276 | NONE               | GZIP               | UPLOADED |         |
| employees03.csv | employees03.csv.gz |         407 |         298 | NONE               | GZIP               | UPLOADED |         |
| employees04.csv | employees04.csv.gz |         375 |         290 | NONE               | GZIP               | UPLOADED |         |
| employees05.csv | employees05.csv.gz |         404 |         303 | NONE               | GZIP               | UPLOADED |         |
+-----------------+--------------------+-------------+-------------+--------------------+--------------------+----------+---------+

セツコ「無事、アップロードされましたね!!!」

マスダ「すばらしい、これで雲の上にかような情報が転送されたというのか…!これで自由に情報を検索して有利に…」

セツコ「実は違います!いまおこなった作業はステージングと呼び、実際に使えるようにするためには次に行うテーブルへのコピーが必要です!正常にステージングされたかどうかは以下のコードで見ることができます!」

>list @sf_tuts.public.%emp_basic;
+--------------------+------+----------------------------------+-------------------------------+
| name               | size | md5                              | last_modified                 |
|--------------------+------+----------------------------------+-------------------------------|
| employees01.csv.gz |  304 | 308e296582e8a761151fd649118e49d6 | Tue, 27 Oct 2020 17:22:21 GMT |
| employees02.csv.gz |  288 | 2a934ce98f1954057f3521cf1fb03cdf | Tue, 27 Oct 2020 17:22:21 GMT |
| employees03.csv.gz |  304 | b36178b823e47338670d233e565783bf | Tue, 27 Oct 2020 17:22:21 GMT |
| employees04.csv.gz |  304 | 6cb8e69c78a24caa3d3e3da5097a0831 | Tue, 27 Oct 2020 17:22:21 GMT |
| employees05.csv.gz |  304 | 7ff17f7784cfee17740f33675983f05d | Tue, 27 Oct
2020 17:22:22 GMT |
+--------------------+------+----------------------------------+-------------------------------+

ステップ4 データをターゲットテーブルにコピーする

セツコ「この項目ではステージングされて待機中のデータを実際にemp_basicテーブルへのコピーします!この段階で、テーブル内でどう記載されるのかや、データのエラーチェックができるようになってます。詳しい設定はまたの機会に譲るとして、チュートリアルのコードを動かしてテーブルに書き込みましょう!」

マスダ「了解した!これだな…」

>copy into emp_basic
                  from @%emp_basic
                  file_format = (type = csvfield_optionally_enclosed_by='"')
                  pattern = '.*employees0[1-5].csv.gz'
                  on_error = 'skip_file';
+--------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
| file               | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name |
|--------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------|
| employees01.csv.gz | LOADED |           5 |           5 |           1 |           0 | NULL        |             NULL |                  NULL | NULL                    |
| employees02.csv.gz | LOADED |           5 |           5 |           1 |           0 | NULL        |             NULL |                  NULL | NULL                    |
| employees03.csv.gz | LOADED |           5 |           5 |           1 |           0 | NULL        |             NULL |                  NULL | NULL                    |
| employees05.csv.gz | LOADED |           5 |           5 |           1 |           0 | NULL        |             NULL |                  NULL | NULL                    |
| employees04.csv.gz | LOADED |           5 |           5 |           1 |           0 | NULL        |             NULL |                  NULL | NULL                    |
+--------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+

マスダ「よし!!!」

ステップ5 ロードされたデータのクエリ


セツコ「ついに、ついにですよマスダ先輩!自由にデータを扱えるじょうたいになりました!!」

マスダ「魔術の行使の準備が完了したということだな…どれ!」


・すべてのデータのクエリ

ドカーン(心の効果音)

>select * from emp_basic;
+------------+--------------+---------------------------+-----------------------------+--------------------+------------+
| FIRST_NAME | LAST_NAME    | EMAIL                     | STREETADDRESS               | CITY               | START_DATE |
|------------+--------------+---------------------------+-----------------------------+--------------------+------------|
| Lem        | Boissier     | lboissier@sf_tuts.com     | 3002 Ruskin Trail           | Shikārpur          | 2017-08-25 |
| Iain       | Hanks        | ihanks1@sf_tuts.com       | 2 Pankratz Hill             | Monte-Carlo        | 2017-12-10 |
| Avo        | Laudham      | alaudham2@sf_tuts.com     | 6948 Debs Park              | Prażmów            | 2017-10-18 |
| Emili      | Cornner      | ecornner3@sf_tuts.com     | 177 Magdeline Avenue        | Norrköping         | 2017-08-13 |
| Harrietta  | Goolding     | hgoolding4@sf_tuts.com    | 450 Heath Trail             | Osielsko           | 2017-11-27 |
| Nyssa      | Dorgan       | ndorgan5@sf_tuts.com      | 7 Tomscot Way               | Pampas Chico       | 2017-04-13 |

セツコ「中に入っているデータがすべて表示されています!」

マスダ「いいぞ!」

・追加のデータ行の挿入

スコンッ(心の効果音)

>insert into emp_basic values
  ('Clementine','Adamou','cadamou@sf_tuts.com','10510 Sachs Road','Klenak','2017-9-22') ,
  ('Marlowe','De Anesy','madamouc@sf_tuts.co.uk','36768 Northfield
Plaza','Fangshan','2017-1-26');

セツコ「ほら、今入力したデータが追加されて表示されてますよ」

マスダ「本当であるな!!!(ドカーン)」

>select * from emp_basic;
+------------+--------------+---------------------------+-----------------------------+--------------------+------------+
| FIRST_NAME | LAST_NAME    | EMAIL                     | STREETADDRESS               | CITY               | START_DATE |
|------------+----
(省略)
| Dana       | Avory        | davoryi@sf_tuts.com       | 2 Holy Cross Pass           | Wenlin             | 2017-05-11 |
| Ronny      | Talmadge     | rtalmadgej@sf_tuts.co.uk  | 588 Chinook Street          | Yawata             | 2017-06-02 |
| Clementine | Adamou       | cadamou@sf_tuts.com       | 10510 Sachs Road            | Klenak             | 2017-09-22 |
| Marlowe    | De Anesy     | madamouc@sf_tuts.co.uk    | 36768 Northfield Plaza      | Fangshan           | 2017-01-26 |
+------------+--------------+---------------------------+-----------------------------+--------------------+------------+

・電子メールアドレスに基づいた行のクエリ

バババッ(心の効果音)

>select email from emp_basic where email like '%.uk';
+--------------------------+
| EMAIL                    |
|--------------------------|
| gbassfordo@sf_tuts.co.uk |
| rtalmadgej@sf_tuts.co.uk |
| madamouc@sf_tuts.co.uk   |
+--------------------------+

セツコ「これはイギリスのE-mailドメインだけに絞った検索ですね…!」

マスダ「イギリス。まだ見ぬ異邦の地か、行ってみたいであるな!!」

・開始日に基づくクエリ

ババババ(心の効果音)

select first_name, last_name, dateadd('day',90,start_date) from emp_basic where start_date <= '2017-01-01';
+------------+-----------+------------------------------+
| FIRST_NAME | LAST_NAME | DATEADD('DAY',90,START_DATE) |
|------------+-----------+------------------------------|
| Catherin   | Devereu   | 2017-03-17                   |
| Cesar      | Hovie     | 2017-03-21                   |
| Granger    | Bassford  | 2017-03-30                   |
| Wallis     | Sizey     | 2017-03-30                   |
+------------+-----------+------------------------------+

セツコ「これはDATE項目に90日を追加し、名前と一緒に表示する、というコードですね!簡単な計算と組み合わせて表示する便利な機能ですね!」
マスダ「拡張性が高いな!他の魔術との組み合わせが得意な我が魔法体系に親しい物があるな」

セツコ「そうなんですねーっ!今度教えて下さい!!!」

マスダ「よかろう、アイスソードやアイスシールドならセツコでもすぐに……そうか、此の世界は魔法が無いんだったな…」

セツコ「はい…」

マスダ「いや、此の世界に魔法が無くとも、Snowflakeがある。我はこれを研究し賢者となることを決めたぞ!!!」

セツコ「是非!!!!!」

ステップ6 まとめとクリーンアップ

セツコ「最後に重要だったポイントをまとめますね。Snowflakeにデータをロードするためには2ステップ必要でした。何か覚えてますか?」

マスダ「む、ステージングとコピーであるな…」

セツコ「大正解です!!ではもう一問、用意したデータの中にカラム名は含まれてなかったのは覚えてますか?どこで用意したでしょう!」

マスダ「見逃してないであるぞ。テーブルの作成時に作っていたであるな。」

セツコ「そうです!アップロードデータのCSVは必ずテーブルのデータ型、文字列や数字、日付型などを揃えないといけません。実はSnowflakeはそのへんをサポートしているみたいですが、イレギュラーな事なのでやらないに越したことはなさそうです。」

マスダ「心得た!」

セツコ「最後に、今回作成したデータベースとウェアハウスを削除して終わりましょう」

drop database if exists sf_tuts;
drop warehouse if exists sf_tuts_wh;
+-------------------------------+
| status                        |
|-------------------------------|
| SF_TUTS successfully dropped. |
+-------------------------------+
1 Row(s) produced. Time Elapsed: 4.696s
+----------------------------------+
| status                           |
|----------------------------------|
| SF_TUTS_WH successfully dropped. |
+----------------------------------+
1 Row(s) produced. Time Elapsed: 0.650s
USER_NAME#(no warehouse)@(no database).(no schema)>

データベースとウェアハウスは溶けゆく雪のように消えていった。

エピローグ

マスダ「なるほど…」

あまりの感動にしばらく固まっていた。
この世界ではこのような高度な魔法が、すべての魔道士(エンジニア)、いや、村人に出さえ扱える様になっているのか。

セツコ「チュートリアルはここまでですね、次は実践編ですけど、ここまでの内容は大丈夫ですか?」

マスダ「ははは!!我をだれだと心得る!!!!彼の世界では…!!!」

声が大きすぎたのか、セツコがあわてている

セツコ「(我ってこの世界では仰々しくてあまり使われないんです!あまりみんなの前では使わないように心がけていただけるとよろしいかとっ!)」

マスダ「(フム、では我は自分のことをどう呼称するのが適当だろうか…)」

セツコ「そうですねぇ…」

セツコはくるりと踵を返して考え込む。
「うーん、うーん」と考え込む姿に、彼の世界の雪の精霊を重ね、郷愁を覚える。
セツコは瓜二つなのだ。その雪の精霊に。
彼の世界では我の魔法が拙い頃から共にあったその存在は、この世界ではかすかにも感じることができない。異世界転生する前に、ひと目挨拶しておくべきだったか…

そんな薄ら寂しい心情を打ち砕いてくれるような笑顔で、彼女は問いへの答えを返した。


「俺、なんてどうでしょう!!!!!」

氷大賢者<アイスマスター>の現代転生
〜転生してエンジニアになった俺はSnowflakeで無双している〜
第2話・完

 

Snowflake・Tableauを活用したCDPの構築・運用の支援はこちら
https://datumstudio.jp/bigdataplatform/

このページをシェアする:



DATUM STUDIOは、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。