Simple Data Integrator (SDI) 応用編：データ連携 (MySQLからBigQueryへの連携例)

:::note info
Simple Data Integrator (SDI) バージョン2.0.2024.5から、ODBC経由でBigQueryへのデータ同期パフォーマンスが改善されました。以前のバージョンをご利用の方には、バージョンアップをおすすめします。
:::

# はじめに
Simple Data Integratorを使用して、MySQLデータベースからBigQueryへデータを連携する設定手順をご紹介します。
このツールを使えば、異なるデータベース間でのデータ移行が簡単に行え、BigQueryでのデータ分析や管理がスムーズになります。
ここでは、MySQLとBigQueryを例にしていますが、対応しているデータベースであれば、ソースやターゲットを任意のDBに設定した場合でも、設定手順はほぼ同様です。


# 事前準備
設定を開始する前に、以下の準備が整っていることを確認してください：
1. MySQLデータベース：ソースデータはMySQLデータベースに格納されており、アクセスできること。
2. BigQueryプロジェクト：Google CloudのプロジェクトでBigQueryが有効になっている必要があります。
3. ODBCドライバー: BigQueryへの接続に使用するODBCドライバーがインストールされていること。
4. Simple Data Integrator: Simple Data Integratorがインストールされていること。


# 構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/e770d971-6b15-9b84-738e-02b2380084d7.png)


※一般的なカラムタイプを使用したBigQueryテーブルを作成し、動作確認を行います。

### Source  (MySQL)
スキーマ名：sditest
テーブル名：sample_table_b
<table>
<tr>
<td>
テーブル構造
</td>
</tr>
<tr>
<td>

|PK|カラム名|型|
|-|-|-|
|![key_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/292a6047-9fbb-db98-6f7c-52db406207d9.png)|id|BIGINT|
||string_column|VARCHAR(255)|
||int64_column|BIGINT|
||float64_column|DOUBLE|
||bool_column|BOOLEAN|
||bytes_column|BLOB|
||date_column|DATE|
||datetime_column|DATETIME|
||time_column|TIME|
||timestamp_column|TIMESTAMP|
</td>
</tr>
<tr>
<td>
DDL
</td>
</tr>
<tr>
<td>

```

CREATE TABLE sample_table_b (
  id BIGINT NOT NULL AUTO_INCREMENT,
  string_column VARCHAR(255),
  int64_column BIGINT,
  float64_column DOUBLE,
  bool_column BOOLEAN,
  bytes_column BLOB,
  date_column DATE,
  datetime_column DATETIME,
  time_column TIME,
  timestamp_column TIMESTAMP,
  PRIMARY KEY (id)
);


 ``` 
</td>
</tr>

<tr>
<td>
Test Data
</td>
</tr>
<tr>
<td>

```
INSERT INTO sample_table_b (
  string_column, int64_column, float64_column, bool_column, bytes_column, date_column, datetime_column, time_column, timestamp_column
) 
VALUES
(
  'First String', 123456789, 12345.6789, TRUE, X'48656C6C6F', '2024-01-01', '2024-01-01 12:34:56', '12:34:56', '2024-01-01 12:34:56'
),
(
  'Second String', 987654321, 98765.4321, FALSE, X'776F726C64', '2024-12-31', '2024-12-31 23:59:59', '23:59:59', '2024-12-31 23:59:59'
);

 ``` 
</td>
</tr>
</table>

### Target　(BigQuery)
スキーマ名：TEST2
テーブル名：sample_table
<table>
<tr>
<td>
テーブル構造
</td>
</tr>
<tr>
<td>

|PK|カラム名|型|
|-|-|-|
|![key_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/292a6047-9fbb-db98-6f7c-52db406207d9.png)|id|INT64|
||string_column|STRING|
||int64_column|INT64|
||float64_column|FLOAT64|
||bool_column|BOOL|
||bytes_column|BYTES|
||date_column|DATE|
||datetime_column|DATETIME|
||time_column|TIME|
||timestamp_column|TIMESTAMP|

</td>
</tr>
<tr>
<td>
DDL
</td>
</tr>
<tr>
<td>

```
CREATE OR REPLACE TABLE TEST2.sample_table (
  id INT64 NOT NULL,
  string_column STRING,
  int64_column INT64,
  float64_column FLOAT64,
  bool_column BOOL,
  bytes_column BYTES,
  date_column DATE,
  datetime_column DATETIME,
  time_column TIME,
  timestamp_column TIMESTAMP
);

ALTER TABLE TEST2.sample_table ADD PRIMARY KEY(id) NOT ENFORCED;

 ``` 

</td>
</tr>
</table>

### 処理フロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/7de64d56-cd22-1682-8b2c-519471a792f0.png)

# 設定
### １．BigQueryへのODBC設定
公式資料を参照して設定してください。
下記の1、2の設定をデフォルトではなく、説明通りに修正してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/7b10a442-424f-b77c-c21c-b104f2fe1f5b.png)
Advanced Options:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/256a9d2c-ebb2-7331-9de1-0f63a5478177.png)


|No|項目|説明|
|----|----|----|
|1|Encrypt Sensitive Data|「`For All Users`」 と指定します。|
|2|Advanced Options設定：Enable Session| チェックを入れる|


Data Source名：`BigQueryTest`
参考資料：
https://qiita.com/spssfun2017/items/8dab283d6aa5731e6082

### ２．コネクション設定
Source DB、Target　DB への接続を設定。
|ソースコネクション名|ターゲットコネクション名|
|-|-|
|MySql<br />![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/dece53be-9102-6d02-abf4-3a2fdfd3f4e1.png)|BigQuery-Test<br />![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/6cc5bf38-59c9-9ae1-a524-a63085b63d93.png)|
|公式資料：<br />https://ja.sdi.ricct.com/userguide/connectionmysql/|データタイプは「ODBC」を選択し、DSN名にはODBC設定時のData Source名を入力してください。<br />User Id , Password 空白にします。<br /> **「Transaction Supported」のチェックを外してください。** </span><br />公式資料：<br />https://ja.sdi.ricct.com/userguide/connectionodbc/|

設定方法は下記の記事を参照：
https://qiita.com/RiCCT/items/787a41bb54277a3b26c2

### 3. マッピング設定
#### 3.1 .「新規マッピング」ボタンをクリックしてマッピング設定画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/a55e5ced-619b-975f-37db-4a50437b4993.png)

#### 3.2 . ソースコネクション、テーブル、ターゲットコネクション、テーブルを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/5df4a8bf-3191-0661-2256-b8a7937150be.png)


|No|項目|説明|
|----|----|----|
|1|マッピング名 |マッピング名を入力、任意の名前設定できます。システムは名前の重複チェックしていないですが、管理上、ユニークの名前の設定をお勧めします。 |
|2|ソースコネクション| MySqlを選択|
|3|ソーステーブル | sditest.sample_table_bを選択|
|4|コネクションコネクション| BigQuery-Testを選択|
|5|コネクションテーブル | TEST2.sample_table|
|6|カラム一覧取得 |`カラム一覧取得`ボタンをクリックしてテーブル定義明細取得|

#### 3.3 . カラムのマッピングルールを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/0de6eaa0-09c2-fdac-4cd8-fc5117c1d9c9.png)


|No|項目|説明|
|----|----|----|
|7|ソースカラム|ターゲットカラムに対して、ソースデータの対応するカラムを選択します。同じカラムが存在する場合はデフォルトで自動マッピングされます。今回はデフォルト設定のままにします。<br /> ソースカラム名とターゲットカラム名が異なる場合は、対応するソースカラムを選択してください。|
|8|マッピング対象|データ連携を行うかどうかを選択します。今回は全カラムのデータを連携します。|
|9|更新方式 |`Merge`を選択。 <br />更新方式についての詳細説明は下記の資料を参照：<br />https://ja.sdi.ricct.com/userguide/mappingtarget/|

#### 3.4 . テスト実行
`マッピング実行` ボタンをクリックして、動作確認します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/402e62a6-e3ac-d3ab-d234-2a6dda6b61af.png" width="400">

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/7b5665fb-8183-c239-88b2-183c44620360.png)



|No|項目|説明|
|----|----|----|
|10|ステータス |実行成功の場合、マッピングを保存して、設定完了。<br />エラーが発生した場合、詳細画面でエラー内容を確認した上対応します。 |
|11|詳細アイコン| 詳細アイコンをクリックしてLOGの詳細参照できます。|


:::note info
お勧め
マッピング実行前に、ソースとターゲットの`テータ参照`ボタンをクリックして、データを確認した上実行します。マッピング成功の場合、もう一度ターゲットのデータを確認して、結果は期待通りかどうかを判断します。
:::

マッピング実行前：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/a97d2e5b-f152-528e-f1e7-48f8f2b78766.png)

マッピング実行後：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/865706e5-db0b-4c83-3097-357e3fc190d8.png)


データが同期されていることを確認できました。

#### 3.5 . 保存
`保存` ボタンをクリックして、マッピング設定を保存します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/d2b2b877-ed05-7a27-608f-728ba61e275d.png" width="400">


:::note info
定期的にデータ連携したい場合、スケジューラーを作成してマッピングを登録します。
スケジューラー設定につきまして、下記のページを参照してください。
https://ja.sdi.ricct.com/userguide/schedule/
:::




以上です。

[Simple Data Integrator (SDI) 実践入門](https://qiita.com/RiCCT/items/3dc109ff82546459a8b0 "Simple Data Integrator (SDI) 実践入門")

# 参考資料
[SDI日本語公式サイト](https://ja.sdi.ricct.com/ "SDI日本語公式サイト")
[SDI English Official Website](https://sdi.ricct.com/ "SDI English Official Website")
[SDIマップイング設定](https://ja.sdi.ricct.com/userguide/mapping/ "SDIマップイング設定")