DataSpider（Dr.Sum Connect）でSalesforceのデータをDr.Sumに取り込んでみる

# 最初に
### Dr.Sum とは

https://www.wingarc.com/product/dr_sum/

https://www.wingarc.com/product/dr_sum/ds20th-anniversary/index.html

<details><summary>【詳細はこちら】**Dr.Sum**は10億件のデータを1秒台で集計できる超高速データベースツールです。</summary><div>
高速のディスク集計と、ハイブリッドで使える超高速のメモリ集計をつかいながら、最適な運用コストでのパフォーマンスを実現します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/e8924330-f537-38f2-e276-ecdd0d96341d.png)

また、Dr.Sumは集計速度だけでなく、データベース構築経験の少ない方でもGUI操作でDBをつくったり、データを取り込んだりできます。
データベース周りにそこまで強くないぼくのような人間でも、気軽にデータハンドリングができるところが素敵です。

さて、Dr.Sumという製品は単純にデータベースがあるだけではなく、様々なオプション製品を加えることで、多様な使い方が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/12be6f13-7354-f58a-773c-b43934d30666.png)

詳しくは公式ホームページをご参照いただきたいのですが、
✅ データを抜いて
✅ データを加工して
✅ データを貯めて
✅ データを高速集計する
ことが可能となります。

[製品の一覧はこちら](https://www.wingarc.com/product/dr_sum/lineup/index.html)

</div></details>


### Dr.Sum Connect とは

https://www.wingarc.com/product/dr_sum/lineup/connect.html

<details><summary>【詳細はこちら】 Dr.Sum Connectはデータを抽出・加工・取り込みをするETLツールです。</summary><div>


下図のように様々な環境からデータを取得して、加工して、Dr.Sumに投げ込むことのできるツールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/f7ac2d53-4b95-063c-27af-2fe4a07da4de.png)

エラーになったらログを吐いたり、メールを飛ばしたり、だいたいGUIで操作できるので、プログラムを書かずとも連携の仕組みを作ることができます。

基本的なスクリプトのつくり方についてはこちらの解説記事をお読みください。
[Dr.Sum ConnectをつかったETLのスクリプトのつくり方](https://qiita.com/Ryo---san/items/5c952ed15a6adb576547)

</div></details>

Dr.Sum ConnectはDataSpiderのOEM製品です。
以降の記事ではConnectと書きます。


Dr.Sum ConnectはSalesforce接続用のドライバーをオプションで販売しています。
Salesforceに入っているデータをリアルタイム分析するのであれば[MotionBoard Cloud for Salesforce](https://www.wingarc.com/product/motionboard/cloud/salesforce/index.html)がございますが、データの加工やSalesforce以外のデータと合わせて分析するときなどはDr.Sumが必要になります。

そのためにConnectなどのETLツールでSalesforceデータを分析環境に取り込むニーズはこれから出てくるかと思います。
余談ですが、この世の中に容易に加工・分析のできる仮想統合基盤ができるまでは、DWHは残るんじゃないかな、と思っています。

# データ取得までの流れを確認しよう
１つのオブジェクトのデータをDr.Sumに入れるまで、手厚い処理をするのであれば、下図の構成がオススメです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/4dd7f0bf-2d44-2887-23e1-acf20bf55758.png)

最小構成は赤枠のコンポーネント４つです。

①truncate_table
Dr.Sumの該当テーブルのデータを全件削除します

②get_data
Salesforceからデータを抽出します

③mapping
抽出したデータを加工します

④bulk_insert_table
加工したデータを高速でDr.SumにInsertします


ひとつずつ見ていきましょう。

# ①truncate_table
まず、Dr.Sumの該当テーブルのデータを全件削除します。
UPDATE処理とかを入れたいところですが、Dr.Sumは更新系の処理があまり強くなく、更新にはかなりの処理時間がかかってしまうため、ぼくはよくBulkInsertをつかいます。
BulkInsertをつかうためには事前にTrancate（テーブル内のデータ削除）をしなければならないので、そのための処理になります。

コンポーネント群の中から[アプリケーション]→[Dr.Sum]→[Truncate]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/3df4fc2a-cb64-d812-7bcd-97b5b16208a2.png)

[Truncate]コンポーネントから、該当テーブルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/4c529cc0-bc85-90fc-594f-2cfad037ae18.png)

これでOKです。


# get_data
Salesforceからデータを取得します。

コンポーネント群から[クラウド]→[Salesforce]→[データ読み取り（クエリー）]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/3a877a19-7a8f-eae9-e715-8310d29b5c88.png)


ここから、下図のように設定をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/29620ac9-71d5-fbb8-0ce6-8e3312fedf15.png)


赤枠：グローバルリソースで設定した接続先を選択します。
緑枠：テーブル名を選択します。
青枠：[スキーマの作成]をクリックすると緑枠で選んだテーブルの選択画面が出てきます。

Dr.Sumに取り込みたい項目を選んで[↓選択]をクリックし、指定をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/3bb22d17-e4ef-0f8a-704d-0f81a6f66d4f.png)

選択が終わりましたら[了解]をクリックします。

続いては抽出条件の設定です。
SalesforceのAPIは大量データを取得する際、タイムアウトエラーが起こりがちなので、なるべくデータの件数をしぼると良いでしょう。
[SOQLの作成]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/32f31b81-2b9c-c4f9-c614-cc36c7fdd1a5.png)


画面に従って、赤枠箇所のように抽出条件をセットすると、緑枠のようなSOQLが自動で記述されます。
問題なければ[了解]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/ac92ee56-22ff-e18a-b02d-0c5c27ffad70.png)

これでSalesforceからのデータ抽出の設定はOKです。

# mapping
さて、今度は加工です。
ただし、対Salesforceの場合、あまりマッピングはしないでしょう。
ここで複雑な加工をするよりもDr.Sumに入れてしまってから処理をした方が、スピードアップが図れます。
今回も単純な移行となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/5608c8c8-af18-83ac-0170-ad797227e697.png)



# bulk_insert_table
今回はこちらのBulkInsertを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/09855c5c-6e02-fc7a-6bfc-59a52e3eb608.png)

高速処理のBulkInsertですが、設定は単純ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/060afe7f-3d31-3d84-3b71-11c9f9aea1fa.png)



設定は以上となります。

# ワークテーブルをつかおう
さて、最小で４コンポーネントSalesforceからのデータの取り込みはできました。
しかしBulkInsertをつかうとちょっと不安な点があります。

この構成だと、get_data実行時にエラーになると、事前に仕掛けたTruncateのために**Dr.Sumテーブルのデータが消えた状態になる**という点です。
Salesforceなどのクラウド製品とAPI接続をする場合、気を付けないとならないのがタイムアウト。
データ抽出量やそのときのクラウド製品の負荷状況次第ではタイムアウトエラーが起きます。
エラーが起きたら、Dr.Sumのテーブルは空になる、これは最悪です。

そのため、今の処理は全てワークテーブルで行うようにしましょう。
そして登場するのはこの緑枠の後続処理たちです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/275eab37-a427-177d-0ed2-b83210960c52.png)

上の４コンポーネントはDr.Sumのワークテーブルに入れます。
ワークテーブルは本番テーブルとまったく同じ形の別テーブルです。
上記4コンポーネントの処理が成功したら、下の3コンポーネントで、ワークテーブルのデータを本番テーブルに入れ替えます。

⑤truncate_table_data
[Truncate]コンポーネントで本番テーブルのデータを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/5647706e-12a5-cb00-d287-56ac6300619c.png)

⑥get_table_data
ワークテーブルのデータを読み込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/a25daddc-bf11-dca8-2ec0-66193556364c.png)

⑦bulk_insert_table_data
本番テーブルにBulkInsertします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/a0db381d-3f38-d18a-d750-2bab26ca131b.png)


この３コンポーネントでエラーになることは・・・考える限り、ないです。
テーブルがない、とかそれくらいですかね。

上の4コンポーネントでエラーになっても本番テーブルは傷つきません。
これでエラーが発生しても安心な設計となります。


# さいごに
いかがだったでしょうか。
try-catchやエラーログの処理などがあるので、コンポーネントの数はまだありますが、主要なものは7つです。

今回はSalesforceのデータの取り方をお伝えしましたが、SalesforceのAPIのタイムアウトに負けない運用もございます。
こちらはまた別記事で解説します。