TalendのSnowflake用コンポーネントを試してみた – Snowflake Advent Calendar 2019 #SnowflakeDB

2019.12.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!DA事業本部の大高です。

当エントリは『Snowflake Advent Calendar 2019』の20日目のエントリです。

Snowflake Advent Calendar 2019 - Qiita
Snowflake Advent Calendar 2019 | シリーズ | Developers.IO

はじめに

「Talend Open Studio for Big Data」では以下のSnowflake用のコンポーネントが用意されています。本日はこちらのコンポーネントを一通り試してみたいと思います。なお、商用版については更にバルク処理用のコンポーネントなどもありますが、今回は扱いません。

tSnowflakeConnection
tSnowflakeInput
tSnowflakeOutput
tSnowflakeRow
tSnowflakeClose

前提条件

Snowflakeには、既にアカウントやウェアハウス、データベースを作成済みの状態を前提とします。また、今回はアドベントカレンダーで利用した下記の環境をそのまま利用したいと思います。

https://dev.classmethod.jp/business/business-analytics/snowflake-advent-calendar-2019-05-hands-on-lab-guide/

Talendのバージョンは「Talend Open Studio for Big Data」の「Version 7.2.1」で検証しています。

また、Talendについての細かい話は今回はしません。ご興味があれば、こちらの特集シリーズもご参照ください。

Talend | 特集カテゴリー | Developers.IO

それでは、張り切っていきましょう!

Talendジョブについて

まずは今回作成したジョブの処理の流れをざっくり説明します。ジョブはこちらです。

Snowflakeに対して接続を行い、テーブルTRIPSのデータを取得して、別テーブルを作成してInsertします。 その後、作成した別テーブルから更にクローンテーブルを作成して、接続を切っています。

では、コンポーネント毎に細かくみていきましょう。

tSnowflakeConnection

まずは基本となるtSnowflakeConnectionです。

アカウントには、Snowflakeアカウント名を指定します。例えば、ログイン時のURLが abc99999.snowflakecomputing.comとなっている場合には、abc99999を指定します。 Snowflakeリージョンはトライアルを申し込んだ場合には、その申し込んだ際のリージョンを指定します。ユーザーIDパスワードも同様です。あとは、今回利用するハンズオンの「Module 5」で利用したウェアハウススキーマデータベースを指定しています。

なお、Snowflakeリージョンは2019年12月現在では、以下が指定可能でした。

詳細設定としては、以下が設定可能です。カスタムSnowflakeリージョンでは文字列で指定が可能なので、リージョンが増えてもここで指定が出来ますね。

tSnowflakeInput

次に、tSnowflakeInputです。SELECT文の発行ができます。

なお、この例では条件を利用してWHERE句を指定していますが、もちろん手動クエリをONにして、自由にクエリを記載することもできます。例では

1=1 LIMIT 100000

として、ちょっと無理やり件数指定をしています。実際には、ここが

WHERE 1=1 LIMIT 100000

というクエリとして展開されます。動かしたところ、秒間約5,000件処理されたので、ある程度のデータであれば十分許容範囲内だと思います。

詳細設定オプションは見たままですね。もしCREATE TABLE時にカラム名を大文字小文字を混ぜて作成しているような場合には、ここのチェックを外して、明示的にカラム名をシングルクォーテーションで括るようにします。

tSnowflakeOutput

tSnowflakeOutputではデータを投入します。

例ではTRIPS_100000として、10万件のレコードを持つテーブルを作成しています。

テーブルへのアクションは他のDB用コンポーネントと同じように、一通りの操作が可能です。今回はテーブルが存在したらドロップして、テーブルを作成し直すようにしました。

出力のアクションは、何をするかを指定します。今回はINSERTをしました。なお、経験上UPSERTは処理が遅くなるので、利用の際にはパフォーマンスを含めてよく利用の是非を検討すべきかと思います。

詳細設定では、tSnowflakeInputと同様に大文字化についてのオプションがあるのと、空の文字列の扱いのオプション、カスタムDBタイプのオプションがあります。

カスタムDBタイプは、カラムDBタイプを指定することで、CREATE TABLE時のカラムの型設定を明示的に設定することができます。

tSnowflakeRow

tSnowflakeRowは自由にクエリを記載できるコンポーネントです。

ここでは以下の通り、先程のTRIPS_100000をクローンして、TRIPS_100000_CLONEを作成いています。

CREATE TABLE IF NOT EXISTS TRIPS_100000_CLONE CLONE TRIPS_100000;

なお、複数のクエリを実行することはできないので、ご注意ください。また、このコンポーネントではOUTPUTを要求するので、ここではダミーでtLogRowを設定しています。

詳細設定では、PreparedStatementパラメーターの設定ができます。クエリでPreparedStatementを利用した場合(クエリに?が含まれている場合)には、パラメーターのインデックスにインデックス値である数値(例えば1など)を指定して、パラメータータイプに型を、パラメーター値に設定したい値を指定します。一般的なジョブでは、この値は他のコンポーネントの処理結果を動的に設定するようになるかと思います。

tSnowflakeClose

このコンポーネントでは、利用したtSnowflakeConnectionをクローズするだけです。特に変わった設定はありませんね。

おまけ

実際に実行すると、特に問題なく動くのですが、2019年12月現在では、稀にCLONEの処理で参照元テーブルがまだ存在しない旨のエラーが発生するケースがありました。この挙動から、ある程度の非同期な状態になっていることが推察されるので、実際のジョブを作成する場合には、事前の存在チェックを行うなどの処理の追加検討も必要になるかもしれません。

まとめ

以上、Talendを利用したSnowflakeの操作のご紹介でした。使い慣れているツールでSnowflakeが触れるのは楽しいですね。

明日の21日目はスズによる「Alteryx入出力」の予定です。お楽しみに!