Powered by Tasty Bytes - ゼロからのSnowflakeクイックスタートへようこそ。今回は変換を中心的に取り上げます。
このクイックスタートでは、Snowflakeのさまざまな機能をご紹介し、Tasty Bytesのビジネス要件を満たすゼロコピークローンやタイムトラベルなどの主要機能について詳しく説明します。
このクイックスタートでは、Snowsight SQLワークシートを使ってTasty Bytesをテーマとしたストーリーを追っていきます。このページには、横に置いて活用できるよう、追加の解説、画像、ドキュメントリンクが掲載されています。
本セクションでは、Snowflakeへのログイン、新しいワークシートの作成、ワークシートの名前の変更、GitHubからのSQLのコピー、このクイックスタートで利用するSQLの貼り付けについて説明します。
Tasty Bytesのキッチンカーフリート分析の一環として、私たちの開発者は、計算されたキッチンカーの使用年数列をキッチンカーテーブルに追加するタスクを任されました。
優れた開発者である私たちは、本番テーブルに対して開発を行ってはならないということを認識しています。そのため、まず本番環境を模した開発環境を作成する必要があります。
Snowflakeの独自のアーキテクチャのおかげで、CLONE機能を使用して本番raw_pos.truck
のスナップショットを即時に作成し、それをraw_pos.truck_dev
と名づけることができます。
では、次の一連のクエリを実行し、tasty_dev
ロールコンテキストを設定しテーブルクローンを作成しましょう。ここでは、クローン作成にウェアハウスコンテキストは必要ないため、ウェアハウスコンテキストの設定は必要ありません。
USE ROLE tasty_dev;
CREATE OR REPLACE TABLE frostbyte_tasty_bytes.raw_pos.truck_dev
CLONE frostbyte_tasty_bytes.raw_pos.truck;
ゼロコピークローンが即時に利用できるため、本番環境に影響を与える不安なく、クローンに対して開発を開始できます。ただし、何らかの変更を加える前に、まず簡単なクエリを実行し、Snowflakeの結果セットキャッシュをテストしてみましょう。
次に、テーブルをクエリするにあたり、tasty_dev_wh
ウェアハウスを使用する必要があります。
次の2つのクエリを開始しましょう。2番目のステートメントでは、キッチンカー、その使用年数、メーカー、モデルを含む結果セットを生成し、truck_id
列でORDER BYを実行します。
USE WAREHOUSE tasty_dev_wh;
SELECT
t.truck_id,
t.year,
t.make,
t.model
FROM frostbyte_tasty_bytes.raw_pos.truck_dev t
ORDER BY t.truck_id;
Snowflakeの結果セットキャッシュをテストするために実行するクエリは、先ほど実行したものと同じです。しかし、ここではさらに一歩進んで、このクエリが結果セットキャッシュから結果が届くとすぐに結果を返したことを示すクエリプロファイルにアクセスします。
以下のクエリを実行した後、スクリーンショットの手順に従ってクエリプロファイルにアクセスします。クエリプロファイルを調べると、QUERY RESULT REUSE
と書かれている単一のノードがあるのが分かります。
SELECT
t.truck_id,
t.year,
t.make,
t.model
FROM frostbyte_tasty_bytes.raw_pos.truck_dev t
ORDER BY t.truck_id;
上記の出力に基づき、まずmake
列に表示されたFord_ recordsのタイプミスに対処する必要があります。その後、各キッチンカーの使用年数を算出する計算に取りかかることができます。
このセクションを始めるにあたり、次のクエリを実行してタイプミスを修正していきましょう。ここでは、UPDATEを使用して、WHEREでメーカーがFord_と一致するtruck_dev
の行を変更します。
UPDATE frostbyte_tasty_bytes.raw_pos.truck_dev
SET make = 'Ford'
WHERE make = 'Ford_';
タイプミスを修正したので、フリート内のキッチンカーの使用年数を計算できるようになりました。次のクエリを実行してください。ここでは、YEARとCURRENT_DATEをこの計算に利用していきます。
SELECT
t.truck_id,
t.year,
t.make,
t.model,
(YEAR(CURRENT_DATE()) - t.year) AS truck_age_year
FROM frostbyte_tasty_bytes.raw_pos.truck_dev t;
キッチンカーの使用年数の計算がすべて終わりましたので、対応する新しい列をクローンテーブルに追加し、仕上げに列を更新して計算された値を反映させましょう。
まず、ALTER TABLE...を使用する次のクエリを実行してください。ADD COLUMNで、データ型がNUMBERの空のtruck_age
列をtruck_dev
テーブルに作成します。
このクエリで、Statement executed successfully
の結果が得られます。
ALTER TABLE frostbyte_tasty_bytes.raw_pos.truck_dev
ADD COLUMN truck_age NUMBER(4);
列を追加したので、次のクエリを開始できるようになります。ここでは、前のセクションで構築したキッチンカーの使用年数計算を使用して新しい空のtruck_age
列をUPDATEします。
UPDATE frostbyte_tasty_bytes.raw_pos.truck_dev t
SET truck_age = (YEAR(CURRENT_DATE()) / t.year);
データの更新が成功したら、次にテーブルに対して簡単なクエリを実行し、truck_age
列がどのように見えるか確認してみましょう。
SELECT
t.truck_id,
t.year,
t.truck_age
FROM frostbyte_tasty_bytes.raw_pos.truck_dev t;
大変です! 私たちが優れた開発者であり、やみくもに本番環境でこれをしでかさなかったことに感謝しておきましょう。
truck_age
の計算を間違えて、引き算ではなく割り算をしてしまったようです。 次のセクションでは、これを解決する必要があります。
私たちはミスをしましたが、Snowflakeにはトラブル解消に役立つ多くの機能が備わっています。このプロセスでは、クエリ履歴、SQL変数、タイムトラベルを活用して、truck_dev
テーブルを、誤った更新ステートメントを実行する前の状態に戻します。
リカバリプロセスを開始するにあたり、まず次のクエリを実行します。ここでは、Snowflake QUERY_HISTORY関数を使用し、truck_dev
テーブルで実行したすべての更新ステートメントのリストを取得します。
SELECT
query_id,
query_text,
user_name,
query_type,
start_time
FROM TABLE(frostbyte_tasty_bytes.information_schema.query_history())
WHERE 1=1
AND query_type = 'UPDATE'
AND query_text LIKE '%frostbyte_tasty_bytes.raw_pos.truck_dev%'
ORDER BY start_time DESC;
予想通り、タイプミスの修正と間違った計算の更新、およびそれらに関連する一意のquery_idが表示されます。次のクエリを実行してください。ここでは、query_id
SQL変数を作成します。次のステップではその変数を使ってタイムトラベルで変更を元に戻します。
実行するとStatement executed successfully
の結果が得られます。
SET query_id =
(
SELECT TOP 1 query_id
FROM TABLE(frostbyte_tasty_bytes.information_schema.query_history())
WHERE 1=1
AND query_type = 'UPDATE'
AND query_text LIKE '%SET truck_age = (YEAR(CURRENT_DATE()) / t.year);'
ORDER BY start_time DESC
);
誤ったquery_idが変数として保存されているため、次のクエリを実行し、タイムトラベルを使用してtruck_dev
テーブルを誤ったquery_id文のBEFOREの状態に置き換えることができます。
CREATE OR REPLACE TABLE frostbyte_tasty_bytes.raw_pos.truck_dev
AS
SELECT * FROM frostbyte_tasty_bytes.raw_pos.truck_dev
BEFORE(STATEMENT => $query_id);
利用できるその他のタイムトラベルステートメントのオプションについては、以下のリストを参照してください。
truck_dev
テーブルを誤った更新ステートメントの前の状態に戻すことができたので、次に列を正しく更新することができます。ここから、正しい計算を行ったテーブルを本番に昇格させ、割り当てられたタスクを完了させます。
前と同じプロセスを使って、次のクエリを実行し、割り算ではなく引き算を使っていることを再確認してください。
UPDATE frostbyte_tasty_bytes.raw_pos.truck_dev t
SET truck_age = (YEAR(CURRENT_DATE()) - t.year);
truck_dev
のすべてが完了したところで、次の2つのクエリを開始してください。ここではまず、より権限のあるsysadmin
ロールを引き受けます。sysadmin
として、2つ目のクエリはALTER TABLE... SWAP WITHを使用して、truck_dev
テーブルをtruck
に昇格させ、その逆も実行します。
完了するとStatement executed successfully.
の結果が得られます。
USE ROLE sysadmin;
ALTER TABLE frostbyte_tasty_bytes.raw_pos.truck_dev
SWAP WITH frostbyte_tasty_bytes.raw_pos.truck;
プロセスが成功したことを確認するために、本番のtruck
テーブルを確認し、入れ替えが成功し、truck_age
の結果が有効であることを検証しましょう。
SELECT
t.truck_id,
t.year,
t.truck_age
FROM frostbyte_tasty_bytes.raw_pos.truck t
WHERE t.make = 'Ford';
私たちの開発者は任せられたタスクを完了したと明言することができるでしょう。truck_age
列が整備され、正しく計算されるようになったため、sysadmin
が残りのテーブルをクリーンアップし、その日の作業を終えることができます。
データベースからテーブルを削除するために、DROP TABLEを利用する次のクエリを実行してください。
DROP TABLE frostbyte_tasty_bytes.raw_pos.truck;
大変です! この結果セットを見ると、sysadmin
でさえも間違いを犯すということが分かります。誤って、開発のtruck_dev
ではなく本番のtruck
をドロップしてしまいました。ありがたいことに、ここでもSnowflakeのタイムトラベルが活躍します。
システムに影響が出る前に次のクエリを急いで実行し、truck
テーブルをUNDROPしましょう。
UNDROP TABLE frostbyte_tasty_bytes.raw_pos.truck;
さて、最後に、締めくくりとしてtruck_dev
を正しくドロップするクエリを実行しましょう。
DROP TABLE frostbyte_tasty_bytes.raw_pos.truck_dev;
すばらしい出来です!これで、Tasty Bytes - ゼロからのSnowflake - 変換クイックスタートが無事完了しました。
これにより、次のことができるようになりました。
このクイックスタートを再実行したい場合は、関連するワークシートの下部にあるリセットスクリプトを利用してください。
引き続きSnowflakeデータクラウドについて学習するには、以下のリンクから利用可能なその他すべてのPowered by Taste Bytes - クイックスタートをご覧ください。