PythonCDPコネクタを使ってSalesforce Data CloudのデータをDatabricksから参照する

株式会社NTTデータ Databricksビジネス推進室の nttd-inoutk です。


2023年9月頃より、DatabricksとSalesforceの両社は、戦略的協業や連携機能に関する多数のアナウンスを実施してきました。

https://www.salesforce.com/news/stories/salesforce-databricks-data-ai-news/

https://www.databricks.com/blog/introducing-salesforce-byom-databricks

CRMソリューションであり、営業・マーケティング・カスタマーサービスなどの様々なデータが格納されるSalesforceと、データの加工や分析、AI活用の優れたプラットフォームであるDatabricksと、その両者を組み合わせて活用することで、インサイトの獲得、業務や顧客に提供するサービスの改善によってより優れた顧客体験に繋がり、企業価値の大幅な向上に貢献できます。
  
今回、本記事を含む3記事にわたってその概要をご紹介します。

[#1  Lakeflow Connectを使ってSalesforce Sales CloudのデータをDatabricksに取り込む](https://qiita.com/nttd-inoutk/items/cf4a7a3f338238879929)
#2  PythonCDPコネクタを使ってSalesforce Data CloudのデータをDatabricksから参照する(本記事)
[#3  Model Bulderを使ってSalesforce Data CloudからDatabricksで構築したモデルを呼び出す](https://qiita.com/nttd-inoutk/items/7f90f1637d615d2fe078)


## はじめに

DatabricksからSalesforce Data Cloudのデータを参照する方法は大きく2通りあります。
ひとつは、Databricksから提供されている[**Lakehouse Federation**](https://www.databricks.com/jp/blog/announcing-general-availability-lakehouse-federation)を利用した仮想化によるデータ参照を可能にする方法です。

https://docs.databricks.com/aws/ja/query-federation/salesforce-data-cloud

Lakehouse Federationを利用することでDatabricks上のかタログにData Cloudのデータが仮想化され登録されるため、細かなアクセス制御を接続に利用するSalesforceのユーザーではなくDatabricksのレイヤーで実行できることが大きなメリットでもあります。

もうひとつは、Salesforce Data CloudのPythonCDPコネクタを利用する方法です。

https://developer.salesforce.com/docs/atlas.en-us.c360a_api.meta/c360a_api/c360a_api_python_connector.htm

Pythonをベースとしたクライアントから利用できる共通的なコネクタであるため、他のソリューションから接続する際も同様の手順を利用できることが大きなメリットです。

基本的には前者のLakehouse Federationを利用することが推奨されますが、検証当時の2024年6月時点では該当の機能がリリースされていなかったため、本記事では後者のPythonCDPコネクタによるDatabricksからSalesforce Sales Cloudへのクエリ実行を実践します。

## PythonCDPコネクタによるデータ抽出の実践

以下のコードをDatabricksのノートブックで実行します。

### コネクタのインストール
PyPIのリポジトリからこちらのライブラリをクラスタにインストールします。

https://github.com/forcedotcom/salesforce-cdp-connector

```py
pip install salesforce-cdp-connector
```
```py
dbutils.library.restartPython()
```

### ライブラリのインポート
```py
import pandas as pd
import requests
```

### 認証情報の取得
以下手順では OAuth endpoint を利用した認証情報の定義を実施します。各種URLやクライアントID＆シークレットの定義が必要ですが、特にIDやシークレットはハードコードをしてしまうとセキュリティにおいて課題が発生するため、[Secrets](https://docs.databricks.com/aws/ja/security/secrets/)の活用を推奨します。
```py
# Define the login URL for Salesforce
login_url = "<SalesforceのログインURL>"

# Define the redirect URL for the Databricks notebook
redirect_url = "<Databricks WorkspaceのURL>"

# Define the client ID for authentication
client_id = "<client ID>"

# Define the client secret for authentication
client_secret = "<client_secret>"
```

OAuthにおいてCode Challengeなどの設定を実施している場合は、後続のトークンの取得においてCode Verifierなどのパラメータが必要になるため、以下ページを参考に値を設定します。

https://help.salesforce.com/s/articleView?id=xcloud.remoteaccess_oauth_web_server_flow.htm&type=5

```py
# Define the code verifier for authentication
code_verifier = "<code_verifier>"

# Define the authorization code for authentication
CODE = "<CODE>"
```
### アクセストークンの取得
準備工程としてはこちらで最後です。CDPコネクターの実行時にはアクセストークンおよびリフレッシュトークンを渡す必要があるため、こちらで取得し、変数に渡しておきます。
```py
# Define the URL for obtaining the access token
url = f"{login_url}/services/oauth2/token?grant_type=authorization_code&client_id={client_id}&client_secret={client_secret}&redirect_uri={redirect_url}&code_verifier={code_verifier}&code={CODE}"

# Send a POST request to obtain the access token
tokens = requests.post(url)

# Print the response and the JSON content of the response
print(tokens)

# Extract the access token from the JSON response
access_token = tokens.json()["access_token"]
print(f"access_token: {access_token}")

# Extract the refresh token from the JSON response
refresh_token = tokens.json()["refresh_token"]
print(f"refresh_token: {refresh_token}")
```

### クエリの実行

CDPコネクターを利用してクエリを実行します。
実行するクエリについては適切に設定してください。

```py
# Define the query to retrieve the specified columns from the table
query = "SELECT <columns> FROM <table name>"
```

```py
# Import the SalesforceCDPConnection class
from salesforcecdpconnector.connection import SalesforceCDPConnection

# Create a SalesforceCDPConnection object with the specified parameters
conn = SalesforceCDPConnection(
    f"{login_url}",
    client_id = f"{client_id}",
    client_secret = f"{client_secret}",
    core_token = f"{access_token}",
    refresh_token = f"{refresh_token}",
)

# Create a cursor object and execute the query
cur = conn.cursor()
cur.execute(f"{query}")

# Get the query result as a pandas DataFrame
df = conn.get_pandas_dataframe(f"{query}")

# Display the DataFrame
display(df)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194680/f0d1b266-3f8a-4a8d-b99c-25b146561536.png)

Salesforce Data Cloudのデータを取得、Displayできました！このデータフレームを利用したデータの可視化や機械学習モデル開発のインプットに活用可能です。

## おわりに

このように、本記事で紹介したPythonCDPコネクタやLakehouse Federationを活用することで、ETL処理を組みデータをDatabricks内にロードすることなくとも分析や機械学習に活用することができるようになっています。
**レイテンシの要求水準が高い処理に用いるデータはLakeflow Connectによるデータロード、要求性能は並、稀にしか参照しないデータなどには本機能を活用することでコピーなしで活用できるようになるなどメリットが大きいです**。是非、使い分けをしたうえで費用対効果を最大化してください。

## 仲間募集

NTTデータ テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。

<details><summary>1. クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア)</summary>

クラウド／プラットフォーム技術の知見に基づき、DWH、BI、ETL領域におけるソリューション開発を推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/cloud_engineer

</details>

<details><summary>2. データサイエンス領域（データサイエンティスト／データアナリスト）</summary>

データ活用／情報処理／AI／BI／統計学などの情報科学を活用し、よりデータサイエンスの観点から、データ分析プロジェクトのリーダーとしてお客様のDX／デジタルサクセスを推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/datascientist

</details>

<details><summary>3.お客様のAI活用の成功を推進するAIサクセスマネージャー</summary>

DataRobotをはじめとしたAIソリューションやサービスを使って、
お客様のAIプロジェクトを成功させ、ビジネス価値を創出するための活動を実施し、
お客様内でのAI活用を拡大、NTTデータが提供するAIソリューションの利用継続を推進していただく人材を募集しています。
https://nttdata.jposting.net/u/job.phtml?job_code=804

</details>

<details><summary>4.DX／デジタルサクセスを推進するデータサイエンティスト《管理職/管理職候補》</summary>
データ分析プロジェクトのリーダとして、正確な課題の把握、適切な評価指標の設定、分析計画策定や適切な分析手法や技術の評価・選定といったデータ活用の具現化、高度化を行い分析結果の見える化・お客様の納得感醸成を行うことで、ビジネス成果・価値を出すアクションへとつなげることができるデータサイエンティスト人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=898

</details>


## ソリューション紹介

<details><summary> Trusted Data Foundationについて</summary><div>

～データ資産を分析活用するための環境をオールインワンで提供するソリューション～
https://www.nttdata.com/jp/ja/lineup/tdf/
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ（Datalake+DWH+AI/BI）を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。

</div></details>

<details><summary> TDFⓇ-AM（Trusted Data Foundation - Analytics Managed Service）について</summary><div>

～データ活用基盤の段階的な拡張支援（Quick Start) と保守運用のマネジメント（Analytics Managed）をご提供することでお客様のDXを成功に導く、データ活用プラットフォームサービス～
https://www.nttdata.com/jp/ja/lineup/tdf_am/
TDFⓇ-AMは、データ活用をQuickに始めることができ、データ活用の成熟度に応じて段階的に環境を拡張します。プラットフォームの保守運用はNTTデータが一括で実施し、お客様は成果創出に専念することが可能です。また、日々最新のテクノロジーをキャッチアップし、常に活用しやすい環境を提供します。なお、ご要望に応じて上流のコンサルティングフェーズからAI/BIなどのデータ活用支援に至るまで、End to Endで課題解決に向けて伴走することも可能です。

</div></details>


<details><summary> NTTデータとDatabricksについて </summary>
NTTデータは、お客様企業のデジタル変革・DXの成功に向けて、「databricks」のソリューションの提供に加え、情報活用戦略の立案から、AI技術の活用も含めたアナリティクス、分析基盤構築・運用、分析業務のアウトソースまで、ワンストップの支援を提供いたします。

https://www.nttdata.com/jp/ja/lineup/databricks/

</details>


<details><summary>NTTデータとTableauについて </summary><div>

ビジュアル分析プラットフォームのTableauと2014年にパートナー契約を締結し、自社の経営ダッシュボード基盤への採用や独自のコンピテンシーセンターの設置などの取り組みを進めてきました。さらに2019年度にはSalesforceとワンストップでのサービスを提供開始するなど、積極的にビジネスを展開しています。

これまでPartner of the Year, Japanを4年連続で受賞しており、2021年にはアジア太平洋地域で最もビジネスに貢献したパートナーとして表彰されました。
また、2020年度からは、Tableauを活用したデータ活用促進のコンサルティングや導入サービスの他、AI活用やデータマネジメント整備など、お客さまの企業全体のデータ活用民主化を成功させるためのノウハウ・方法論を体系化した「デジタルサクセス」プログラムを提供開始しています。
https://www.nttdata.com/jp/ja/lineup/tableau/

</div></details>


<details><summary>NTTデータとAlteryxについて </summary><div>
Alteryxは、業務ユーザーからIT部門まで誰でも使えるセルフサービス分析プラットフォームです。

Alteryx導入の豊富な実績を持つNTTデータは、最高位にあたるAlteryx Premiumパートナーとしてお客さまをご支援します。

導入時のプロフェッショナル支援など独自メニューを整備し、特定の業種によらない多くのお客さまに、Alteryxを活用したサービスの強化・拡充を提供します。

https://www.nttdata.com/jp/ja/lineup/alteryx/

</div></details>

<details><summary>NTTデータとDataRobotについて </summary><div>
DataRobotは、包括的なAIライフサイクルプラットフォームです。

NTTデータはDataRobot社と戦略的資本業務提携を行い、経験豊富なデータサイエンティストがAI・データ活用を起点にお客様のビジネスにおける価値創出をご支援します。

https://www.nttdata.com/jp/ja/lineup/datarobot/

</div></details>

<details><summary> NTTデータとInformaticaについて</summary><div>

データ連携や処理方式を専門領域として10年以上取り組んできたプロ集団であるNTTデータは、データマネジメント領域でグローバルでの高い評価を得ているInformatica社とパートナーシップを結び、サービス強化を推進しています。
https://www.nttdata.com/jp/ja/lineup/informatica/

</div></details>

<details><summary>NTTデータとSnowflakeについて </summary><div>
NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。

NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。
Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。

https://www.nttdata.com/jp/ja/lineup/snowflake/

</div></details>