概要

Powered by Tasty Bytes - ゼロからのSnowflakeクイックスタートへようこそ。今回は変換を中心的に取り上げます。

このクイックスタートでは、Snowflakeのさまざまな機能をご紹介し、Tasty Bytesのビジネス要件を満たすゼロコピークローンやタイムトラベルなどの主要機能について詳しく説明します。

前提条件

学習する内容

構築するもの

概要

このクイックスタートでは、Snowsight SQLワークシートを使ってTasty Bytesをテーマとしたストーリーを追っていきます。このページには、横に置いて活用できるよう、追加の解説、画像、ドキュメントリンクが掲載されています。

本セクションでは、Snowflakeへのログイン、新しいワークシートの作成、ワークシートの名前の変更、GitHubからのSQLのコピー、このクイックスタートで利用するSQLの貼り付けについて説明します。

ステップ1 - URLでSnowflakeにアクセスする

ステップ2 - Snowflakeにログインする

ステップ3 - ワークシートに移動する

ステップ4 - ワークシートを作成する

ステップ5 - ワークシートの名前を変更する

ステップ6 - GitHubでQuickstart SQLにアクセスする

ステップ7 - GitHubからSetup SQLをコピーする

ステップ8 - GitHubからSnowflakeワークシートにSetup SQLを貼り付ける

ステップ9 - 「Next」をクリックする

概要

Tasty Bytesのキッチンカーフリート分析の一環として、私たちの開発者は、計算されたキッチンカーの使用年数列をキッチンカーテーブルに追加するタスクを任されました。

優れた開発者である私たちは、本番テーブルに対して開発を行ってはならないということを認識しています。そのため、まず本番環境を模した開発環境を作成する必要があります。

ステップ1 - 本番のクローンを作成する

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;

ステップ2 - 「Next」をクリックする

概要

ゼロコピークローンが即時に利用できるため、本番環境に影響を与える不安なく、クローンに対して開発を開始できます。ただし、何らかの変更を加える前に、まず簡単なクエリを実行し、Snowflakeの結果セットキャッシュをテストしてみましょう。

ステップ1 - クローンテーブルをクエリする

次に、テーブルをクエリするにあたり、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;

ステップ2 - クエリを再実行する

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;

ステップ3 - 「Next」をクリックする

概要

上記の出力に基づき、まずmake列に表示されたFord_ recordsのタイプミスに対処する必要があります。その後、各キッチンカーの使用年数を算出する計算に取りかかることができます。

ステップ1 - 列内の誤った値を更新する

このセクションを始めるにあたり、次のクエリを実行してタイプミスを修正していきましょう。ここでは、UPDATEを使用して、WHEREでメーカーがFord_と一致するtruck_devの行を変更します。

UPDATE frostbyte_tasty_bytes.raw_pos.truck_dev 
SET make = 'Ford' 
WHERE make = 'Ford_';

ステップ2 - 使用年数計算を構築する

タイプミスを修正したので、フリート内のキッチンカーの使用年数を計算できるようになりました。次のクエリを実行してください。ここでは、YEARCURRENT_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;

ステップ3 - 「Next」をクリックする

概要

キッチンカーの使用年数の計算がすべて終わりましたので、対応する新しい列をクローンテーブルに追加し、仕上げに列を更新して計算された値を反映させましょう。

ステップ1 - 列をテーブルに追加する

まず、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);

ステップ2 - 計算値を列に追加する

列を追加したので、次のクエリを開始できるようになります。ここでは、前のセクションで構築したキッチンカーの使用年数計算を使用して新しい空のtruck_age列をUPDATEします。

UPDATE frostbyte_tasty_bytes.raw_pos.truck_dev t
    SET truck_age = (YEAR(CURRENT_DATE()) / t.year);

ステップ 3 - 新しい列をクエリする

データの更新が成功したら、次にテーブルに対して簡単なクエリを実行し、truck_age列がどのように見えるか確認してみましょう。

SELECT
    t.truck_id,
    t.year,
    t.truck_age
FROM frostbyte_tasty_bytes.raw_pos.truck_dev t;

大変です! 私たちが優れた開発者であり、やみくもに本番環境でこれをしでかさなかったことに感謝しておきましょう。

truck_ageの計算を間違えて、引き算ではなく割り算をしてしまったようです。 次のセクションでは、これを解決する必要があります。

ステップ4 - 「Next」をクリックする

概要

私たちはミスをしましたが、Snowflakeにはトラブル解消に役立つ多くの機能が備わっています。このプロセスでは、クエリ履歴、SQL変数、タイムトラベルを活用して、truck_devテーブルを、誤った更新ステートメントを実行する前の状態に戻します。

ステップ1 - クエリ履歴を活用する

リカバリプロセスを開始するにあたり、まず次のクエリを実行します。ここでは、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;

ステップ2 - SQL変数を設定する

予想通り、タイプミスの修正と間違った計算の更新、およびそれらに関連する一意の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
);

ステップ3 - タイムトラベルを活用してテーブルを戻す

誤った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); 

利用できるその他のタイムトラベルステートメントのオプションについては、以下のリストを参照してください。

ステップ4 - 「Next」をクリックする

概要

truck_devテーブルを誤った更新ステートメントの前の状態に戻すことができたので、次に列を正しく更新することができます。ここから、正しい計算を行ったテーブルを本番に昇格させ、割り当てられたタスクを完了させます。

ステップ1 - 正しく計算された値を列に追加する

前と同じプロセスを使って、次のクエリを実行し、割り算ではなく引き算を使っていることを再確認してください。

UPDATE frostbyte_tasty_bytes.raw_pos.truck_dev t
SET truck_age = (YEAR(CURRENT_DATE()) - t.year);

ステップ2 - 開発テーブルを本番と入れ替える

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;

ステップ3 - 本番を検証する

プロセスが成功したことを確認するために、本番のtruckテーブルを確認し、入れ替えが成功し、truck_ageの結果が有効であることを検証しましょう。

SELECT
    t.truck_id,
    t.year,
    t.truck_age
FROM frostbyte_tasty_bytes.raw_pos.truck t
WHERE t.make = 'Ford';

ステップ4 - 「Next」をクリックする

概要

私たちの開発者は任せられたタスクを完了したと明言することができるでしょう。truck_age列が整備され、正しく計算されるようになったため、sysadminが残りのテーブルをクリーンアップし、その日の作業を終えることができます。

ステップ1 - テーブルをドロップする

データベースからテーブルを削除するために、DROP TABLEを利用する次のクエリを実行してください。

DROP TABLE frostbyte_tasty_bytes.raw_pos.truck;

大変です! この結果セットを見ると、sysadminでさえも間違いを犯すということが分かります。誤って、開発のtruck_devではなく本番のtruckをドロップしてしまいました。ありがたいことに、ここでもSnowflakeのタイムトラベルが活躍します。

ステップ2 - テーブルをドロップ解除する

システムに影響が出る前に次のクエリを急いで実行し、truckテーブルをUNDROPしましょう。

UNDROP TABLE frostbyte_tasty_bytes.raw_pos.truck;

ステップ3 - 正しいテーブルをドロップする

さて、最後に、締めくくりとしてtruck_devを正しくドロップするクエリを実行しましょう。

DROP TABLE frostbyte_tasty_bytes.raw_pos.truck_dev;

ステップ4 - 「Next」をクリックする

まとめ

すばらしい出来です!これで、Tasty Bytes - ゼロからのSnowflake - 変換クイックスタートが無事完了しました。

これにより、次のことができるようになりました。

このクイックスタートを再実行したい場合は、関連するワークシートの下部にあるリセットスクリプトを利用してください。

次のステップ

引き続きSnowflakeデータクラウドについて学習するには、以下のリンクから利用可能なその他すべてのPowered by Taste Bytes - クイックスタートをご覧ください。