TalendのSnowflake用コンポーネントを試してみた – Snowflake Advent Calendar 2019 #SnowflakeDB
こんにちは!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入出力」の予定です。お楽しみに!