XplentyでSalesforceのデータをSnowflakeにロードしてみた
こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。
「Xplenty」というデータ統合プラットフォームがあり、既に Developers.IO にもいくつか記事が上がっています。
今回は「XplentyでSalesforceのデータをSnowflakeに投入できるか」というのが気になったので試してみました。
Connection の作成
まずはSalesforce、Snowflakeに接続するために「Connection」を作成します。
Salesforce
「Conneciton」メニューを開き、新規にSalesforce接続を作成します。
今回Salesforceは「Developer Edition」を利用するので「Production」を指定して認証します。
Salesforceで認証して、
Xplentyにアクセス許可を与えます。
Xplentyに戻るので、適宜接続名を付けて完了です。
Snowflake
Salesforceと同様にSnowflake接続も作成します。接続設定を入力したら一度テストしてみます。なお「Region」指定があるので「Account name」の箇所は、リージョン以降は不要です。(例:foobar.ap-northeast-1.aws
であれば foobar
で良い
以下のように表示され、接続に問題なければ完了です。
Package の作成
次に「Package」を作成します。これはいわゆるジョブにあたるものになります。「Packages」メニューを開き、新規作成していきます。
「Type」はDataFlow
で作成します。
作成するとDataFlowの編集画面になるので、早速「Add component」からコンポーネントを追加していきます。
Sources
コンポーネントとしては、「Sources」、「Transformations」、「Destinations」と別れており、何を選べば良いか分かり易いですね。まずはデータ取得元として「Salesforce」を選びます。
配置されたSalesforceコンポーネントを開いて、
先程作成しておいたSalesforceのコネクションを選びます。
今回はSalesforceのSOQLクエリは書かずに、単純にオブジェクトを対象とし、対象オブジェクトは「Account(取引先)」にします。
取得対象のカラムは、全て選択するか、検索して個別に指定することができますが、今回はいくつか選択して指定します。検索ウィンドウから検索して追加していきます。
今回対象とするカラムはこちらです。
最後にプレビューしてみて、問題なさそうなので保存します。
Destinations
今回は特に変換しないので「Transformations」は飛ばして、送信先である「Destinations」の「Snowflake」コンポーネントを追加します。
こちらもデータ取得元のSalesforceと同様に、先程作成しておいたSnowflakeのコネクションを選びます。
次に、データの送信先の細かい設定をするのですが、ここでは2020/06/05現在、2つ注意が必要です。
1つ目は、対象スキーマとテーブルの大文字と小文字です。ここを小文字にすると、内部処理でダブルクォーテーションで括られるようでエラーの原因となります。
2つ目は、Snowflake接続ユーザの「デフォルトロール」です。Snowflakeユーザの方はお気づきかもしれませんが、ここまで接続に利用する「ロール」の指定をしていません。このため、ここで利用される「ロール」は接続ユーザの「デフォルトロール」となります。
「デフォルトロール」で参照できない「データベース(これは接続設定で指定した)」、「スキーマ」、「テーブル」は利用できないことに注意が必要です。
以上をふまえて、大文字でデフォルトロールで参照可能な対象スキーマとテーブルを指定します。この際、データロード対象のテーブルはオプション指定をすることで自動作成してくれるので、事前に作成しておく必要はありません。ありがたいですね!
最後にスキーママッピングで「取得元のカラム」と「送信先のカラム」の割り当てを決めます。「Auto-fill」ボタンをクリックすると自動設定してくれるので、これも便利です。
指定したら「Save」をクリックして終わりです!
Packageの保存
コンポーネント同士が接続されていない場合は、コンポーネントの端っこをドラッグアンドドロップすることで、コンポーネント間の接続ができるので接続しておきます。編集が終わったら「Save」ボタンで保存しておきましょう。
いざ、実行
いよいよ実行です。編集画面からそのまま実行できるので「Run job」をクリックして実行してみます。実行にはクラスタが必要なので作成します。
お試しなのでSandboxクラスタにします。
Packageはいま作成したものです。
Package変数はとくに利用しないので、そのままで実行します。
ジョブが起動し始めました!
しばらくして、ジョブが成功するとジョブ一覧から詳細が確認できます。12件のレコードが登録されたのが分かりますね。
エラーが起きた場合
エラーが起きた場合には、かなり細かくログが出ます。
前述した「大文字・小文字が起因のエラー」ではこんな感じにエラーログが出ていました。スキーマ名の指定に問題があるのがログから分かりますね。
Caused by: net.snowflake.client.jdbc.SnowflakeSQLException: SQL compilation error: Schema 'OOTAKA_SANDBOX_DB."public"' does not exist or not authorized. at net.snowflake.client.jdbc.SnowflakeUtil.checkErrorAndThrowExceptionSub(SnowflakeUtil.java:151) at net.snowflake.client.jdbc.SnowflakeUtil.checkErrorAndThrowException(SnowflakeUtil.java:76) at net.snowflake.client.core.StmtUtil.pollForOutput(StmtUtil.java:503) at net.snowflake.client.core.StmtUtil.execute(StmtUtil.java:380) at net.snowflake.client.core.SFStatement.executeHelper(SFStatement.java:582) at net.snowflake.client.core.SFStatement.executeQueryInternal(SFStatement.java:266) at net.snowflake.client.core.SFStatement.executeQuery(SFStatement.java:202) at net.snowflake.client.core.SFStatement.execute(SFStatement.java:882) at net.snowflake.client.jdbc.SnowflakeStatementV1.executeInternal(SnowflakeStatementV1.java:331) at net.snowflake.client.jdbc.SnowflakeStatementV1.execute(SnowflakeStatementV1.java:395) at com.xplenty.pig.piggybank.storage.jdbc.JdbcDBConnection.executeNonQuery(JdbcDBConnection.java:94) at com.xplenty.pig.piggybank.storage.jdbc.JdbcDBConnection.executeNonQuery(JdbcDBConnection.java:75) ... 29 more
まとめ
以上、XplentyでSalesforceからSnowflakeへのデータ投入を試してみた結果でした。GUIベースでサクッとでデータ連携が作れるのは非常に良いですね。
どなたかのお役に立てば幸いです。それでは!