XplentyでSalesforceのデータをSnowflakeにロードしてみた

2020.06.05

こんにちは!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ベースでサクッとでデータ連携が作れるのは非常に良いですね。

どなたかのお役に立てば幸いです。それでは!