Informaticaのデータ統合サービスCloud Data IntegrationでDatabricksにELTしてみた

# はじめに
はじめまして。 [NTTデータ ソリューション事業本部 デジタルサクセスソリューション事業部](https://www.nttdata.com/jp/ja/services/data-and-intelligence/) の @nttd-nagano です。

[Informatica（インフォマティカ）](https://www.informatica.com/jp/) （※1）のクラウドデータマネージメントプラットフォームとして、「[Intelligent Data Management Cloud](https://www.informatica.com/jp/platform.html)」（※2。以下IDMCと記載）というものがあります。

**今回は、そのIDMCのデータ統合サービス「Cloud Data Integration」（※3。以下CDIと記載）の機能「SQL ELT最適化」機能（※5、SQL ELT Optimization）にて、統合データ分析プラットフォーム [Databricks](https://www.databricks.com/jp) （※6）にELT（※10）してみた** ので、ご報告します。

以前Qiitaに投稿した記事（「 [Informaticaのデータ統合サービスCloud Data IntegrationでSnowflakeにELTしてみた](https://qiita.com/nttd-nagano/items/9945e398992b818ef831) 」）のDatabricks版です。

![idmc_summary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/593b0c27-fb2b-df5a-567f-a32833535b58.png)

<details><summary>※1. Informatica（インフォマティカ）</summary>

Informaticaは1993年に米国カリフォルニア州で設立され、2004年に日本法人を設立したデータマネジメント市場のパイオニア。Fortune100のうち86社を含む、100ヶ国以上の5000を超える企業がInformaticaのソリューションを採用しており、同社のクラウドは月間86兆件ものトランザクションを処理している。
</details>

<details><summary>※2. Intelligent Data Management Cloud</summary>

略称はIDMC。旧称はIICS。クラウドデータマネジメントプラットフォーム。以下IDMCと記載。
</details>

<details><summary>※3. Cloud Data Integration</summary>

略称はCDI。データ統合サービス。ETL処理（※4）やELT処理（※6）を担う。以下CDIと記載。

</details><details><summary>※4. ETL処理</summary>

データベースなどに蓄積されたデータから必要なものを抽出（Extract）し、目的に応じて変換（Transform）し、データを必要とするシステムに格納（Load）すること。
</details>

<details><summary>※5. 「SQL ELT最適化」機能（「プッシュダウン最適化」機能）</summary>

少し前まで「プッシュダウン最適化」機能（Pushdown Optimization。略称はPDO）と呼ばれていた。データ変換処理を各DBMS固有の命令を含む最適なSQLクエリに変換して、DBMS側で実行する機能。
</details>

<details><summary>※6. Databricks</summary>

Databricksは、エンタープライズグレードのデータ分析とAIソリューションを大規模に構築、デプロイ、共有、保守するための、統合されたオープンなデータ分析プラットフォーム。Databricksは、データウェアハウス（※7）とデータレイク（※8）を統合する、次世代のクラウド型統合データ分析基盤「レイクハウス・プラットフォーム」（※9）を提供している。これにより、全てのデータエキスパートが、あらゆるデータを簡単に統合、迅速に分析し、AIを活⽤したインサイトを獲得することが可能になる。
</details>

<details><summary>※7. データウェアハウス</summary>

Data Warehouse、DWHとも表記される。「Warehouse」とは倉庫を表す単語。複数のデータソースからのデータを、意志決定のため、主題別に編成し（業務主導のデータモデルではなく、データ主導のデータモデルに編成しなおす）、統合し、時系列で格納したデータベースのこと。削除や更新もしない。データは、一定の周期でデータソースからData Warehouseに移される。（1990年にアメリカの計算機科学者William H. Inmonが著作で定義したことにより有名になった概念。）
</details>

<details><summary>※8. データレイク</summary>

Data Lakeとも表記される。「Lake」とは湖を表す単語。複数のデータソースからのデータを元のままの形式でコピーし、格納する広大なデータ領域のこと。一般的に構造化データのほかに、半構造化データや、非構造化データも格納できる。（ビッグデータ時代が到来した2010年頃に提唱された概念。）
</details>

<details><summary>※9. データレイクハウス</summary>

Data Lake Houseとも表記される。「データレイクハウス」は、データウェアハウス（※7）とデータレイク（※8）の課題を解決するデータ管理における新たなオープンアーキテクチャを指す。データレイクハウスでは、従来から活用していた構造化データに加え、AIや機械学習の活用に欠かすことのできない非構造化データを柔軟に組み合わせて分析を行うことができる。データレイクとデータウェアハウスを単一のシステムに統合することで、データ部門が複数のシステムにアクセスする必要がなくなり、データ処理が迅速化する。
</details>

<details><summary>※10. ELT処理</summary>

ETL処理（※4）と対比して使われることが多い言葉。データ統合処理の順序を従来型のE→T→Lの順ではなく、E→L→Tの順でおこなう。近年ではDBMSの性能が爆発的に向上したことから、その性能を有効活用するために使われる手法｡
</details>

データ統合処理は、データの変換を伴うことが多いですが、 この **「SQL ELT最適化」機能では、ELT処理によりDBMSなどの処理能力を最大限に活用し、高いパフォーマンスを実現します。**

具体的には、 **データ変換処理を各DBMS固有の命令を含む最適なSQLクエリに変換して、DBMS側で実行します。**

今回は、 [Databricks](https://www.databricks.com/jp) を対象に、この「SQL ELT最適化」機能の使い方をご紹介します。

※. 余談ですが、弊社はDatabricksも取り扱っており、日本で最多である9名の「Databricks Champion」（※11）が在籍しているほか、多数の受賞歴がございます。

<details><summary>※11. Databricks Champion</summary>

Databricks Championは、Databricksが提供する「データとAIの民主化」を推進するソリューションの特性や概念を理解し、技術的な専門家という側面だけでなく、エバンジェリストとして、その深い知見をマーケットに広く発表していく「 [Legendary Heroes of DATA + AI](https://www.databricks.com/jp/blog/2022/12/06/jimarelegendary-heroes-data-ai.html) 」。
</details>

# SQL ELT実行時にSQL warehouseを使うようにSecure Agentを設定する

[HOW TO: Configure a mapping task in Cloud Data Integration to use the Databricks SQL engine](https://knowledge.informatica.com/s/article/HOW-TO-Configure-a-mapping-task-in-Cloud-Data-Integration-to-use-the-Databricks-SQL-engine?language=en_US&type=external) に従って設定していきます。

1. IDMCにログインする。
1. アプリケーションピッカー（マイサービス）で「管理者」をクリックする。
1. 左ペインで「ランタイム環境」をクリックする。
1. 右ペインにてエージェントグループを開いてSecure Agentをクリックする。
1. 「編集」ボタンをクリックする。
1. 「サービス」欄にて「Data Intgration Server」を選択する。
1. 「タイプ」欄にて「DTM」を選択する。
1. 「JVMOption」系のキーで値が未設定の行の編集アイコンをクリックする。
1. `-DUseDatabricksSqlForPdo=true` と入力する。
    ![informatica_cdi_pushdown_databricks_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/5fd1acb8-f32f-cd1b-b4d9-c98b9253824f.png)
1. 「保存」ボタンをクリックする。
1. 「Data Intgration Server」が再起動するのを待つ。

なお、この「Sql」というのはDatarbricksの「SQL warehouse」を表し、「Pdo」というのは「**P**ush**d**own **O**ptimizaion」（現在の表現で言うと「SQL ELT」）を表すと思われます。

# S3バケットを作って入力側となるファイルを格納する

CDIは [様々なシチュエーションでデータ統合処理をDatabricksにSQL ELTすることができます](https://docs.informatica.com/integration-cloud/data-integration-connectors/current-version/databricks-delta-connector/databricks_delta_sql_elt_optimization/sql_elt_optimization_using_a_databricks_delta_connection.html) が、今回、Databricksにロードするデータは、S3にCSVファイルとして格納しておくことにしました。

なお、 [Databricksは自身が持つデータレイクハウス（※9）にAmazon S3からデータを取り込む機能を持っています](https://www.databricks.com/jp/product/data-ingestion) が、本記事では別のAWSアカウントのS3バケットからデータをロードしてみます。

まず、AWSマネジメントコンソールの「S3」にて、S3バケットを作りました。

次に、入力ファイルとして、次のような3種類のダミーデータを用意し、格納しました。

* order_data.csv （注文情報）
* customer_data.csv （顧客マスタ）
* product_data.csv　（商品マスタ）

![informatica_cdi_pushdown_databricks_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/a53f4a9b-e77f-2a51-29a2-aad41546bde1.png)
![informatica_cdi_pushdown_databricks_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/d3f66ad3-3dc7-d540-957f-c4cd84eddf00.png)
![informatica_cdi_pushdown_databricks_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/10f40615-0e0f-2f3c-b71f-0793e890d68e.png)

# S3の認証情報をDatabricksのSQL WarehouseのSparkパラメータとして設定する

SQL ELTすると、Databricksが直接ソース側のS3バケットにアクセスすることになります。そのため、アクセスするための認証情報を、DatabricksのSQL WarehouseのSparkパラメータとして設定しておく必要があります。

認証情報（アクセスキーID、シークレットアクセスキー）は、あらかじめAWSマネジメントコンソールの「IAM」にて払い出しておいてください。

[Connect to Amazon S3 | Databricks on AWS](https://docs.databricks.com/en/connect/storage/amazon-s3.html) に従って設定していきます。なお、今回は影響範囲を最小限にするため、バケット毎の設定としています。

1. Databricksワークスペースにサインインする。
1. Databricksワークスペースの上部のバーでユーザー名をクリックする。
1. メニューにて「Settings」をクリックする。
    ![informatica_cdi_pushdown_databricks_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/b3a2e042-a73b-fd26-a919-e49585a08465.png)
1. 左ペインの「Workspace admin」の「Compute」をクリックする。
1. 右ペインの「SQL Warehouse」の「Manage」ボタンをクリックする。
1. 「Data Security」パートの「Data Access Configuration」に次のように入力する（エンドポイントは東京リージョンの場合）。
    ![informatica_cdi_pushdown_databricks_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/44ffda67-f115-8527-1097-5460cabd4cdc.png)
    ```
    spark.hadoop.fs.s3a.bucket.【S3のバケット名】.access.key 【当該バケットにアクセスするためのアクセスキーID】
    spark.hadoop.fs.s3a.bucket.【S3のバケット名】.secret.key 【当該バケットにアクセスするためのシークレットアクセスキー】
    spark.hadoop.fs.s3a.bucket.【S3のバケット名】.endpoint s3.ap-northeast-1.amazonaws.com
    ```

# Databricksに出力側となるテーブルを作る

今回、Databricks側にロードする際には、前述の入力を変換しながら結合していくこととします。（詳細は後述）

DatabricksのWebインターフェースにて、次のようなテーブルを作りました。

![informatica_cdi_pushdown_databricks_007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/71af7d29-e520-6e9b-28f8-92b470015cca.png)

# アドオンコネクタとしてS3とDatabricksを有効にする

CDIでは接続先のリソース毎に、「コネクタ」を使用します。標準のコネクタのほかに、 [様々なアドオンコネクタがあります。](https://docs.informatica.com/integration-cloud/data-integration-connectors.html)

[CDIの30日間の無料体験](https://www.informatica.com/jp/trials/informatica-cloud.html) を使用している場合などは、アドオンコネクタを使えるようにする作業が必要です。下記の操作を実施してください。すでに使えるようになっている場合はこの作業は不要です。

1. IDMCにログインする。
1. アプリケーションピッカー（マイサービス）で「管理者」をクリックする。
1. 左ペインで「アドオンコネクタ」をクリックする。
1. 右上の検索欄に「s3」と入力する。
1. 「Amazon S3 Connector」の「無料トライアルを開始する」ボタンをクリックする。
1. ダイアログで「OK」ボタンをクリックする。
1. 右上の検索欄に「Databricks」と入力する。
1. 「Databricks Delta Connector」の「無料トライアルを開始する」ボタンをクリックする。
1. ダイアログで「OK」ボタンをクリックする。

# 接続オブジェクトを作る

CDIでは接続先の設定を「[接続](https://docs.informatica.com/cloud-common-services/administrator/current-version/connections.html)」（あるいは「接続オブジェクト」）という定義体で管理しています。

今回はS3とDatabricksの接続オブジェクトを作ります。

1. 左ペインで「接続」をクリックする。
1. 「新しい接続」ボタンをクリックする。
    ![informatica_cdi_pushdown_databricks_008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/c347acfa-518d-80c9-a45a-138396bd8a74.png)
1. [S3用の接続オブジェクト](https://docs.informatica.com/integration-cloud/data-integration-connectors/current-version/amazon-s3-v2-connector/amazon-s3-v2-connections/amazon-s3-v2-connection-properties.html) を作るために、下記のように入力する。
    |設定項目|設定値|
    |---|---|
    |接続名|【任意。以降では「conn_amazons3」と記載）】|
    |説明||
    |タイプ|Amazon S3 v2|
    |ランタイム環境|【自分のランタイム環境（Secure Agentをインストールしたマシン）】|
    |Access Key||
    |Secret Key||
    |IAM Role ARN||
    |External Id||
    |Use EC2 Role to Assume Role|
    |Folder Path|【先ほど作成したS3バケット名】|
    |Master Symmetric Key||
    |Customer Master Key ID||
    |S3 Account Type|Amazon S3 Storage|
    |Region Name|【S3バケットが存在するリージョン名】|
    |Federated SSO IdP|NONE|
    |Other Authentication Type |NONE|
    |S3 VPC Endpoint Type|NONE|
    |STS VPC Endpoint Type|NONE|
    |KMS VPC Endpoint Type|NONE|
1. 「保存」ボタンをクリックする。
1. 「テスト接続」ボタンをクリックする。
1. 「この接続のテストに成功しました。」と表示されることを確認する。
1. Databricksワークスペースにサインインする。
1. Databricksワークスペースの上部のバーでユーザー名をクリックする。
1. メニューにて「Settings」をクリックする。
    ![informatica_cdi_pushdown_databricks_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/b3a2e042-a73b-fd26-a919-e49585a08465.png)
1. 左ペインの「Users」の「Developer」をクリックする。
1. 「Access tokens」の右側の「Manage」ボタンをクリックする
    ![informatica_cdi_pushdown_databricks_009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/22e4b7bf-0aa4-e49e-77b5-9401f79885fc.png)
1. 「Generate new token」ボタンをクリックする。
    ![informatica_cdi_pushdown_databricks_010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/108af239-c6df-daa0-be13-5d031926978c.png)
1. 「Comment」欄に使用目的を入力する。
1. 「Lifetime」欄に有効日数を入力する。
1. 「Generate」ボタンをクリックする。
1. トークンをメモしておく。
1. 左ペインの「SQL Warehouses」をクリックする。
1. 使用するSQL Warehouseをクリックする。
1. 「Connection details」タブをクリックする。
1. 「JDBC URL」欄の内容をメモしておく。
    ![informatica_cdi_pushdown_databricks_011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/5c4e08bf-2230-fed6-12d0-b86eb52faaf7.png)
1. IDMCの接続管理画面に戻る。
1. 「新しい接続」ボタンをクリックする。
1. [Databricks用の接続オブジェクト](https://docs.informatica.com/integration-cloud/data-integration-connectors/current-version/databricks-delta-connector/connections_for_databricks_delta/connect_to_databricks_delta/connection_details.html) を作るために、下記のように入力する。
    |設定項目|設定値|
    |---|---|
    |接続名|【任意。以降では「conn_databricks」と記載）】|
    |説明||
    |タイプ|Databricks Data Cloud|
    |ランタイム環境|【自分のランタイム環境（Secure Agentをインストールしたマシン）】|
    |Authentication|Standard|
    |SQL Warehouse JDBC URL|【前述の手段で取得したJDBC URL】|
    |Databricks Token|【前述の手順で取得したトークン】|
    |Catalog Name|【カタログ名】|
1. 「保存」ボタンをクリックする。
1. 「テスト接続」ボタンをクリックする。
1. 「この接続のテストに成功しました。」と表示されることを確認する。

# マッピングを作る

CDIでは、データ統合処理を「[マッピング](https://docs.informatica.com/integration-cloud/data-integration/current-version/mappings.html)」という定義体で管理しています。

まず、空のマッピングを作ります。

1. アプリケーションピッカー（マイサービス）で「データ統合」をクリックする。
1. 左ペインにて「新規」をクリックする。
1. ダイアログで、「マッピング」＞「マッピング」をクリックする。
    ![informatica_cdi_pushdown_databricks_012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/ff6f582b-1b4b-2a41-8017-bb770c0d049c.png)
1. 「作成」ボタンをクリックする。

さて、マッピングでのデータ統合処理の内容ですが、今回は、「S3バケット内の複数のCSVファイルのデータを抽出し、一部を変換して、結合し、さらに変換した後に、Databricksのテーブルにロードする」というものにしてみます。

詳細は割愛しますが、おおむね次のような手順で作成しました。

1. [ソースオブジェクト](https://docs.informatica.com/integration-cloud/data-integration/current-version/transformations/source-transformation.html) が3個になるように配置する。
1. 各ソースオブジェクトを選択し、「ソース」パートに以下のように設定する。
    |設定項目|設定値|
    |---|---|
    |接続|【先ほど作成したS3用接続オブジェクト】|
    |ソースタイプ|単一オブジェクト|
    |オブジェクト|【各CSVファイル】|
    |形式|Flat|

    ![informatica_cdi_pushdown_databricks_013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/f04bb083-e94b-8dfd-1a33-c6c2f6745152.png)
    ![informatica_cdi_pushdown_databricks_014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/d0624b01-7582-445b-3778-d1e065ea4b45.png)
    ![informatica_cdi_pushdown_databricks_015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/8862e9f8-45af-227c-9571-a98b3c5b7686.png)
1. [フィルタトランスフォーメーション](https://docs.informatica.com/integration-cloud/data-integration/current-version/transformations/filter-transformation.html) を配置し、customerと接続する。18歳以上を通過させるように設定する。
    ![informatica_cdi_pushdown_databricks_016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/c3bdf41c-b814-1741-d243-0abaef4cf2ab.png)
1. [ジョイナトランスフォーメーション](https://docs.informatica.com/integration-cloud/data-integration/current-version/transformations/joiner-transformation.html) を配置し、orderとcustomerを接続する。
    ![informatica_cdi_pushdown_databricks_017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/eb8d1999-bfc7-0ad2-4faf-9cde3852613b.png)
1. [ジョイナトランスフォーメーション](https://docs.informatica.com/integration-cloud/data-integration/current-version/transformations/joiner-transformation.html) を配置し、前項のジョイナトランスフォーメーションとproductを接続する。
    ![informatica_cdi_pushdown_databricks_018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/464e5b5a-0c55-cff6-34e5-0d904e4a73a8.png)
1. [式トランスフォーメーション](https://docs.informatica.com/integration-cloud/data-integration/current-version/transformations/expression-transformation.html) を配置し、前項のジョイナトランスフォーメーションを接続する。
1. 式トランスフォーメーションにて、「LASTNAME」と「FIRSTNAME」を [文字列結合](https://docs.informatica.com/integration-cloud/data-integration/current-version/function-reference/functions/concat.html) するように設定する。
    ![informatica_cdi_pushdown_databricks_019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/2c918ee4-7f63-038e-fe73-a9ba61b4d07c.png)
1. [ターゲットオブジェクト](https://docs.informatica.com/integration-cloud/data-integration/current-version/transformations/target-transformation.html) を選択し、「ターゲット」パートに以下のように設定する。
    |設定項目|設定値|
    |---|---|
    |接続|【先ほど作成したDatabricks用接続オブジェクト】|
    |ターゲットの種類|単一オブジェクト|
    |オブジェクト|【先ほど作成したテーブル】|
    |操作|Insert|
    |Target Database Name||
    |Target Table Name||
    |Update Override Query||
    |Write Disposition|【デフォルト値のまま】|
    |Update Mode|【デフォルト値のまま】|
    |Update As Update
    |Staging Location||
    |Pre-SQL||
    |Post-SQL||
    |Job Timeout|【デフォルト値のまま】
    |Job Status Poll Interval|【デフォルト値のまま】|
    |DB REST API Timeout|【デフォルト値のまま】|
    |DB REST API Retry Interval|【デフォルト値のまま】|
    |拒否された行の転送|【デフォルト値のまま】|

    ![informatica_cdi_pushdown_databricks_020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/be535b52-fd39-f3db-ab2b-0d6c47b46b83.png)
1. ターゲットオブジェクトに前述の式トランスフォーメーションを接続する。
1. ターゲットオブジェクトの「フィールドマッピング」パートにて、受信フィールドとターゲットフィールドをマッピングする。

# SQL ELT最適化結果をプレビューする

[SQL ELT最適化機能によってマッピングがどのようにSQLクエリに変換されるかをプレビューしてみましょう。](https://docs.informatica.com/integration-cloud/data-integration/current-version/mappings/mappings/sql-elt-query-preview.html)

次のように操作します。

1. 画面右上の「SQL ELT Query」アイコンをクリックする。
1. 「Generate SQL Query」ボタンをクリックする。
    ![informatica_cdi_pushdown_databricks_021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/8162eb23-b25e-c31d-0f99-0d45730194e1.png)
1. 「次へ」ボタンをクリックする。
1. 「SQL ELTプレビュー」ボタンをクリックする。
1. 生成されたSQLクエリが表示されている箇所の右上の「⇔」アイコンをクリックする。
    ![informatica_cdi_pushdown_databricks_022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/56303a64-5b33-4432-c9e6-4b63ba1f3499.png)
1. プレビューを見終わったら、「閉じる」ボタンをクリックする。
    ![informatica_cdi_pushdown_databricks_023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/36109702-212b-7386-bdec-2439dfe936eb.png)

下記がSQL ELT最適化機能によって生成されたSQLクエリです。

<details>
<summary>
生成されたSQLクエリ1
</summary>
<pre>
/** SQLクエリ1 **/
CREATE TABLE denormal_adult_orders_1713323328600_1713323329339(
  `PRODUCT_ID` string , 
  `PRODUCT_NAME` string , 
  `PRICE` string , 
  `MAKER` string) USING DELTA ;
</pre>
</details>

<details>
<summary>
生成されたSQLクエリ2
</summary>
<pre>
/** SQLクエリ2 **/
COPY INTO denormal_adult_orders_1713323328600_1713323329339 FROM 
(SELECT `PRODUCT_ID` :: string , `PRODUCT_NAME` :: string , `PRICE` :: string , `MAKER` :: string FROM 's3a://********/product_data.csv')
 FILEFORMAT = CSV
 FORMAT_OPTIONS ('delimiter'=",", 'quote'='"', 'escape'='\\', 'encoding'="UTF-8", 'header'='true');
</pre>
</details>

<details>
<summary>
生成されたSQLクエリ3
</summary>
<pre>
/** SQLクエリ3 **/
CREATE TABLE denormal_adult_orders_1713323329075_1713323328899(
  `CUSTOMER_ID` string , 
  `LASTNAME` string , 
  `FIRSTNAME` string , 
  `LASTNAME_KANA` string , 
  `FIRSTNAME_KANA` string , 
  `AGE` string , 
  `DATE_OF_BIRTH` string , 
  `GENDER` string , 
  `MAILADDRESS` string , 
  `ZIP_CODE` string) USING DELTA ;
</pre>
</details>

<details>
<summary>
生成されたSQLクエリ4
</summary>
<pre>
/** SQLクエリ4 **/
COPY INTO denormal_adult_orders_1713323329075_1713323328899 FROM 
(SELECT `CUSTOMER_ID` :: string , `LASTNAME` :: string , `FIRSTNAME` :: string , `LASTNAME_KANA` :: string , `FIRSTNAME_KANA` :: string , `AGE` :: string , `DATE_OF_BIRTH` :: string , `GENDER` :: string , `MAILADDRESS` :: string , `ZIP_CODE` :: string FROM 's3a://********/customer_data.csv')
 FILEFORMAT = CSV
 FORMAT_OPTIONS ('delimiter'=",", 'quote'='"', 'escape'='\\', 'encoding'="UTF-8", 'header'='true');
</pre>
</details>

<details>
<summary>
生成されたSQLクエリ5
</summary>
<pre>
/** SQLクエリ5 **/
CREATE TABLE denormal_adult_orders_1713323328555_1713323329427(
  `ORDER_ID` string , 
  `ORDER_DATETIME` string , 
  `CUSTOMER_ID` string , 
  `PRODUCT_ID` string , 
  `QUANTITY` string) USING DELTA ;
</pre>
</details>

<details>
<summary>
生成されたSQLクエリ6
</summary>
<pre>
/** SQLクエリ6 **/
COPY INTO denormal_adult_orders_1713323328555_1713323329427 FROM 
(SELECT `ORDER_ID` :: string , `ORDER_DATETIME` :: string , `CUSTOMER_ID` :: string , `PRODUCT_ID` :: string , `QUANTITY` :: string FROM 's3a://********/order_data.csv')
 FILEFORMAT = CSV
 FORMAT_OPTIONS ('delimiter'=",", 'quote'='"', 'escape'='\\', 'encoding'="UTF-8", 'header'='true');
</pre>
</details>

<details>
<summary>
生成されたSQLクエリ7
</summary>
<pre>
/** SQLクエリ7 **/
INSERT INTO `main`.`test_informatica`.`denormal_adult_orders` (ORDER_ID, ORDER_DATE, QUANTITY, CUSTOMER_ID, FULLNAME, FULLNAME_KANA, AGE, DATE_OF_BIRTH, GENDER, MAILADDRESS, ZIP_CODE, PRODUCT_ID, PRODUCT_NAME, PRICE, MAKER ) 
  SELECT t4c10 AS t6c0, 
    t4c11 AS t6c1, 
    cast(t4c13 as int) AS t6c2, 
    t4c0 AS t6c3, 
    CONCAT(t4c1, t4c2) AS t6c4, 
    CONCAT(t4c3, t4c4) AS t6c5, 
    cast(t4c5 as int) AS t6c6, 
    t4c6 AS t6c7, 
    t4c7 AS t6c8, 
    t4c8 AS t6c9, 
    t4c9 AS t6c10, 
    `t0`.`PRODUCT_ID` AS t6c11, 
    `t0`.`PRODUCT_NAME` AS t6c12, 
    cast(`t0`.`PRICE` as int) AS t6c13, 
    `t0`.`MAKER` AS t6c14
  FROM (`denormal_adult_orders_1713323328600_1713323329339`)
    AS t0 
  INNER JOIN 
  (
    SELECT t1c0 AS t4c0, 
      t1c1 AS t4c1, 
      t1c2 AS t4c2, 
      t1c3 AS t4c3, 
      t1c4 AS t4c4, 
      t1c5 AS t4c5, 
      t1c6 AS t4c6, 
      t1c7 AS t4c7, 
      t1c8 AS t4c8, 
      t1c9 AS t4c9, 
      `t3`.`ORDER_ID` AS t4c10, 
      `t3`.`ORDER_DATETIME` AS t4c11, 
      `t3`.`PRODUCT_ID` AS t4c12, 
      `t3`.`QUANTITY` AS t4c13
    FROM (
      SELECT `t1`.`CUSTOMER_ID` AS t1c0, 
        `t1`.`LASTNAME` AS t1c1, 
        `t1`.`FIRSTNAME` AS t1c2, 
        `t1`.`LASTNAME_KANA` AS t1c3, 
        `t1`.`FIRSTNAME_KANA` AS t1c4, 
        `t1`.`AGE` AS t1c5, 
        `t1`.`DATE_OF_BIRTH` AS t1c6, 
        `t1`.`GENDER` AS t1c7, 
        `t1`.`MAILADDRESS` AS t1c8, 
        `t1`.`ZIP_CODE` AS t1c9
      FROM (`denormal_adult_orders_1713323329075_1713323328899`)
        AS t1
      WHERE '18' <= `t1`.`AGE`)
        AS t2 
    INNER JOIN 
    (`denormal_adult_orders_1713323328555_1713323329427`)
      AS t3
    ON `t3`.`CUSTOMER_ID` = t1c0)
      AS t5
    ON t4c12 = `t0`.`PRODUCT_ID`
</pre>
</details>

<details>
<summary>
生成されたSQLクエリ8
</summary>
<pre>
/** SQLクエリ8 **/
DROP TABLE denormal_adult_orders_1713323328600_1713323329339
</pre>
</details>

<details>
<summary>
生成されたSQLクエリ9
</summary>
<pre>
/** SQLクエリ9 **/
DROP TABLE denormal_adult_orders_1713323329075_1713323328899
</pre>
</details>

<details>
<summary>
生成されたSQLクエリ10
</summary>
<pre>
/** SQLクエリ10 **/
DROP TABLE denormal_adult_orders_1713323328555_1713323329427
</pre>
</details>

# マッピングタスクを作って実行する

さてこれで、どんなSQLクエリが生成されるかは分かったので、実際に実行してみます。

実行するには、まず、「[マッピングタスク](https://docs.informatica.com/integration-cloud/data-integration/current-version/tasks/mapping-tasks.html)」という定義体を作成し、その後、そのマッピングタスクを実行します。

1. 左ペインにて「新規」をクリックする。
1. ダイアログで、「タスク」＞「マッピングタスク」をクリックする。
    ![informatica_cdi_pushdown_databricks_024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/ceeabd09-d4ef-5e9c-e351-17444bf273d6.png)
1. 「作成」ボタンをクリックする。
1. 次のように設定する。
    |設定項目|設定値|
    |---|---|
    |タスク名|【任意】
    |プロジェクト|【デフォルト値のまま】|
    |説明||
    |ランタイム環境|【自分のランタイム環境（Secure Agentをインストールしたマシン）】|
    |マッピング|【先ほど作成したマッピング】|
1. 「次へ」ボタンをクリックする。
1. 「ランタイムオプション」の [「SQL ELTの最適化」パート](https://docs.informatica.com/integration-cloud/data-integration/current-version/tasks/mapping-tasks/mapping-task-configuration/configuring-runtime-options.html) にて、次のように設定する。
    |設定項目|設定値|
    |---|---|
    |SQL ELTの最適化タイプ|【任意。「全体」など。SQL ELT先を片寄せしたい場合は他の値を選ぶ。】|
    |最適化コンテキストタイプ|【デフォルト値のまま】|
    |フォールバックオプション|【デフォルト値のまま】|
    |一時的なビューの作成|有効にする|
    |一時的なシーケンスの作成|有効にする|

    ![informatica_cdi_pushdown_databricks_025.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/914e9693-bc5c-3815-759d-c47262f3137d.png)
1. 「保存」ボタンをクリックする。
1. 「実行」ボタンをクリックする。

# マッピングタスクの実行結果を見る

マッピングタスクを実行できたので、結果を見てみましょう。

次のように操作します。

1. 左ペインにて「[マイジョブ](https://docs.informatica.com/cloud-common-services/monitor/current-version/monitor/monitoring-data-integration-jobs/monitoring-mappings-and-mapping-tasks.html)」をクリックする。
1. 最上部（最新）のジョブインスタンスをクリックする。
1. 「ステータス」に「成功」と表示されていることを確認する。
    ![informatica_cdi_pushdown_databricks_026.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/64f94b8d-4f83-5e6c-ff2f-499c15c87adb.png)
1. 下部の「SQL ELT Optimization」パートにて、SQL ELTされたSQLクエリを確認する。

ここで、本当にSQL ELTされているか、この画面からセッションログをダウンロードして見てみます。

![informatica_cdi_pushdown_databricks_027.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/58e010cc-d884-3cea-9b84-b2773185b2ef.png)
![informatica_cdi_pushdown_databricks_028.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/db4afe06-c2df-a48c-9a96-c1ad37780dcf.png)
![informatica_cdi_pushdown_databricks_029.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/0b313cc6-1046-546e-e8f1-ec95ecf74b33.png)

実際にSQL ELTされており、先ほどプレビューで見たSQLクエリが、Databricksに発行されていることを確認できました。

おまけとして、Databricksの [Query History](https://docs.databricks.com/ja/sql/user/queries/query-history.html) でも見てみましょう。

![informatica_cdi_pushdown_databricks_030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031738/3d15e38a-9cb3-373f-65ab-f130df3aa907.png)

先のSQLクエリが、Databricksに発行されていることを確認できました。

# 結局、SQL ELTでパフォーマンスは上がったの？

さて、ここまで読んできた皆さんが気になるのは、「結局、SQL ELTの有無によって、データ統合処理のパフォーマンスは向上したの？」という点かと思いますが、それは、次に挙げるような様々な条件によって変わるため、ここで提示するのは控えます。
* SQL ELTなしのデータ統合処理（ETL処理）で使用するEC2インスタンスのインスタンスタイプ
* SQL ELTありのデータ統合処理（ELT処理）で使用するDatabricks SQL Warehouseのサイズ
* 入出力するデータ量 etc...

大量のデータを処理する場合はSQL ELT最適化が効果を発揮する場合が多いでしょう。（[SQL ELTできない種類の変換処理もあります](https://docs.informatica.com/integration-cloud/data-integration-connectors/current-version/databricks-delta-connector/databricks-delta-sql-elt-optimization/sql-elt-optimization-using-a-databricks-delta-connection/transformations-with-databricks-delta.html)）

# おわりに

以上、「Informaticaのデータ統合サービスCloud Data IntegrationでDatabricksにELTしてみた」でした。

**[CDIは30日間の無料体験ができる](https://www.informatica.com/jp/trials/informatica-cloud.html)** ので、この機会に試してみてはいかがでしょうか。

DatabricksやDatabricksが提供する「レイクハウス」についてもっと知りたい方は、「2023 Databricks Global Partner Awards」の「APJ Partner Champion of the Year」も受賞している弊社齋藤のインタビュー記事をご覧ください。

* [サイロ化を解消し「データとAIの民主化」を加速 DWHとデータレイクの溝を埋める決定打とは？ | IT Leaders](https://it.impress.co.jp/articles/-/24161)



## 仲間募集

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-career.jposting.net/u/job.phtml?job_code=804

</details>

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

https://nttdata-career.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データとInformaticaについて</summary><div>

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

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

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

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

</div></details>