# Google Driveインポート連携

Google DriveからTreasure Dataにデータファイルをインポートできます。このデータコネクタは、CSVおよびTSVファイル、またはCSVおよびTSVファイルのgzipのみをサポートしています。

## 前提条件

- [TD Toolbelt](https://toolbelt.treasuredata.com/)を含むTreasure Dataの基本知識
- Googleアカウント


## Treasure コンソールを使用して接続を作成する

### 新しい接続を作成する

Integrations Hub > Catalogに移動し、Google Driveを検索して選択します。

![](/assets/image-20191015-140041.55e4e61badff4516641d1772e5151daff874fa5ea424f79d3fe2098efaa8c3f7.7a2fdaca.png)

**Create**を選択します。認証された接続を作成しています。

次のダイアログが開きます。

![](/assets/image-20191015-140051.adbe6f214e4339c29f1a9d9abbd41ac03cb017fb7d8cbba3a2315dd887944a38.7a2fdaca.png)

Google Driveへのアクセスには、OAuth2認証が必要です。

**Click here**を選択して、Googleアカウントに接続します。

ポップアップウィンドウでGoogleアカウントにログインし、Treasure Dataアプリへのアクセスを許可します。

![](/assets/image-20191015-140119.6afe6692f82df2f21e05953eaf4c969773d8d50b79259e94ee6ec81666ea41fc.7a2fdaca.png)

Treasure コンソールにリダイレクトされます。「新しい接続を作成する」手順を繰り返し、新しいOAuth接続を選択します。**Continue**を選択します。

![](/assets/image-20191015-140127.ea8d47d5a36ae3e169dc5c06e7066dddf974763c7d7a2bb5a4d8ce028fc66ba5.7a2fdaca.png)

![](/assets/image2022-6-28_13-11-37.a70583d15051a4fb27cb40f858b9065f737b4269c20695bf067aa67ad3b65adc.7a2fdaca.png)

![](/assets/image-20191015-140135.f1c6bb9446cf951ba0a10fd97a63196a8d377c7cc3ea0a0ffcc40dc6624bdcae.7a2fdaca.png)

新しいGoogle Drive接続に名前を付けます。**Done**を選択します。

## Treasure Dataにデータを転送する

認証された接続を作成すると、自動的にAuthenticationsタブに移動します。作成した接続を探して、**New Source**を選択します。

### ファイルからインポート

CSVまたはTSVファイルをインポートするか、CSVまたはTSVファイルのgzipをインポートできます。

**File types**では、Fileを選択します。

![](/assets/image-20191015-140146.6e670d3d1c80a2ec112b9a3d227cf7938cbfb9e0aad8c758dda948ebd767c97b.7a2fdaca.png)

パラメータ:

- **ID**: Google DriveのファイルID。CSVおよびTSVファイル、またはCSVおよびTSVファイルのgzipのみをサポートします。
- **Modified After**: 指定したタイムスタンプ以降に変更されたファイルのみをインポートする場合に使用します。
- **Incremental Loading**: スケジュールに基づいてデータをインポートする場合に使用します。前回のインポート以降の新しい変更されたファイルのみをインポートする場合に使用します。


### フォルダからインポート

CSVまたはTSVファイル、またはCSVまたはTSVファイルのgzipのリストをインポートします。フォルダからインポートする場合、フォルダには同じタイプのファイルが含まれている必要があります。例:CSVファイルのみを含むフォルダ。

**File types**では、Folderを選択します。

![](/assets/image-20191015-140159.3eeba24a34c2b070205b77472529ccb299eee5d75be38be2f58da88a09a47205.7a2fdaca.png)

パラメータ:

- **ID**: Google DriveのファイルID。CSVおよびTSVファイル、またはCSVおよびTSVファイルのgzipのみをサポートします。
- **Modified After**: 指定したタイムスタンプ以降に変更されたファイルのみをインポートする場合に使用します。
- **Filename pattern**: 正規表現を使用してファイル名と一致させます。ファイル名がこのパターンと一致しない場合、ファイルはスキップされます。(例えば、ファイル名パターンが*.csv$*の場合、ファイル名がこのパターンと一致しない場合、そのファイルはスキップされます)
- **Incremental Loading**: スケジュールに基づいてデータをインポートする場合に使用します。前回のインポート以降のフォルダ内の新しい変更されたファイルのみをインポートする場合に使用します。


### プレビュー

データの[プレビュー](https://docs.treasuredata.com/smart/project-product-documentation/about-data-preview)が表示されます。変更する場合は**Advanced Settings**を選択し、それ以外の場合は**Next**を選択します。

![](/assets/image-20191015-140209.9acb167c3082078c8cb3b843d94aa75b41e6c4334bad4c067952b904c8c671ee.7a2fdaca.png)

### 詳細設定

![](/assets/image-20191015-140223.e038f81c890e85b582ce66d6dbd79ac398b6352195c331b0e571ca3eac031816.7a2fdaca.png)

次のパラメータを指定できます:

- Decoders: ファイルのエンコードに基づいてファイルデコーダーを変更できます。

```
Gzip
Bzip2
Zip
OpenPGP Decryption
```
- Parser: 必要に応じて、CSV/TSV Parserの設定を更新します。

```
charset: UTF-8
newline: LF
type: csv
delimiter: ','
quote: '"'
escape: '"'
trim_if_not_quoted: false
skip_header_lines: 1
allow_extra_columns: false
allow_optional_columns: false
columns:
```
- Maximum retry interval milliseconds. 再試行間の最大時間を指定します。

```
  Type: number
  Default: 120000
```
- Maximum retry times. 各API呼び出しの最大再試行回数を指定します。

```
  Type: number
  Default: 7
```
- Initial retry interval millisecond. 最初の再試行の待機時間を指定します。

```
  Type: number
  Default: 1000
```
- Maximum retry interval milliseconds. 再試行間の最大時間を指定します。

```
  Type: number
  Default: 120000
```


### ターゲットデータベースとテーブルを選択する

既存のソースを選択するか、新しいデータベースとテーブルを作成します。

![](/assets/image-20191209-223011.d49b378b87d9308f0d634574a82fbabe1edb6149d1eb2a8f3a3b02f0c7fdca7d.7a2fdaca.png)

新しいデータベースを作成し、データベースに名前を付けます。**Create new table**でも同様の手順を完了します。

既存のテーブルにレコードを**追加**するか、既存のテーブルを**置換**するかを選択します。

デフォルトのキーではなく、異なる**partition key seed**を設定したい場合は、ポップアップメニューを使用して指定できます。

### スケジューリング

**When**タブでは、1回限りの転送、または自動的な定期転送をスケジュールできます。

パラメータ

- **Once now**: 1回限りのジョブを設定します。
- **Repeat…**
  - **Schedule**: *@hourly*、*@daily*、*@monthly*の3つのオプション、およびカスタム*cron*を受け付けます。
  - **Delay Transfer**: 実行時間の遅延を追加します。
- **TimeZone**: 'Asia/Tokyo'のような拡張タイムゾーン形式をサポートします。
![](/assets/image-20191015-140248.9daa74ba0dc9dfeb5cecdec5ca398bfd08969e7656780fe3e64e2233078e7730.7a2fdaca.png)


### 詳細

Transferに名前を付け、**Done**を選択して開始します。

![](/assets/image-20191015-140257.6ab8e45a9e44ecd67b9d01b7d9b0b869fbb2c09d855c506f041c9d86e26f0b7e.7a2fdaca.png)

転送が実行されると、**Databases**タブで転送の結果を確認できます。

## コマンドラインを使用してGoogle Drive接続を作成する

Treasure コンソールを使用して接続を設定できます。

### Treasure Data Toolbeltのインストール

最新の[TD Toolbelt](https://toolbelt.treasuredata.com/)をインストールします。

### 設定ファイルの作成(seed.yml)

設定ファイルには、Google Driveからコネクタに取り込むものを指定するin:セクションと、コネクタがTreasure Data内のdatabaseに出力するものを指定するout:セクションが含まれます。利用可能なoutモードの詳細については、**Appendix**を参照してください。

次の例は、Google Driveからファイルをインポートする方法を示しています。


```yaml
in:
  type: google_drive
  client_id: xxxxxxxxxxx
  client_secret: xxxxxxxxxxx
  refresh_token: xxxxxxxxxxx
  target: file
  id: xxxxxxxxxxx(drive file id)
  last_modified_time: "YYYY-MM-DD HH:MM:SS"
  incremental: false
out: mode: append
```

次の例は、Google Driveのフォルダー内のファイルをインポートする方法を示しています。


```yaml
in:
 type: google_drive
 client_id: xxxxxxxxxxx
 client_secret: xxxxxxxxxxx
 refresh_token: xxxxxxxxxxx
 target: folder
 id: xxxxxxxxxxx(drive folder id)
 last_modified_time: "YYYY-MM-DD HH:MM:SS"
 filename_pattern: xxxxxxxxxxx (Ex: abc.csv$)
 incremental: false
out:
 mode: append
```

### Guessコマンドを実行して実行設定ファイル(load.yml)を生成する


```bash
td connector:guess seed.yml -o load.yml
```

### インポートされるデータのプレビュー(オプション)

td connector: previewコマンドを使用して、インポートされるデータをプレビューできます。


```bash
td connector:preview load.yml
```

### ロードジョブの実行

td connector:issueを使用してジョブを実行します。

ロードジョブを実行する前に、データを保存するdatabaseとtableを指定する必要があります。例:td_sample_db、td_sample_table


```bash
td connector:issue load.yml \
--database td_sample_db \
--table td_sample_table \
--time-column date_time_column
```

Treasure Dataのストレージは時間でパーティション分割されているため、--time-columnオプションを指定することをお勧めします。このオプションが指定されていない場合、データコネクタは最初のlong型またはtimestamp型のカラムをパーティション分割時間として選択します。--time-columnで指定するカラムの型は、long型またはtimestamp型である必要があります(プレビュー結果を使用して、利用可能なカラム名と型を確認してください。一般的に、ほとんどのデータ型にはlast_modified_dateカラムがあります)。

データに時間カラムがない場合は、add_timeフィルターオプションを使用してカラムを追加できます。詳細については、[add_time filter](https://docs.treasuredata.com/smart/project-product-documentation/add_time-filter-function)プラグインを参照してください。

td connector:issueは、database(sample_db)とtable(sample_table)が既に作成されていることを前提としています。TD内にdatabaseまたはtableが存在しない場合、td connector:issueは失敗します。したがって、databaseとtableを手動で作成するか、td connector:issueで--auto-create-tableを使用して自動的にdatabaseとtableを作成する必要があります。


```bash
$ td connector:issue load.yml \
      --database td_sample_db \
      --table td_sample_table \
      --time-column date_time_column \
      --auto-create-table
```

コマンドラインからロードジョブを送信します。データサイズによっては、処理に数時間かかる場合があります。

### スケジュール実行

定期的なファイルまたはフォルダーのインポートのために、定期的なデータコネクタの実行をスケジュールできます。高可用性を確保するために、スケジューラーを慎重に設定しています。この機能を使用することで、ローカルのデータセンターでcronデーモンを使用する必要がなくなります。

スケジュール実行は、Google Driveからデータを取得する定期的な試行中のデータコネクタの動作を制御する設定パラメーターをサポートしています:

- `incremental` この設定は、ロードモードを制御するために使用され、ファイルまたはフォルダー内のファイルの最終更新時刻に基づいてデータコネクタがGoogle Driveからデータを取得する方法を管理します。
- last_modified_time この設定は、前回のロードジョブからのファイルの最終更新時刻を制御するために使用されます。


詳細と例については、以下のAppendixの「Incremental Loadingの仕組み」を参照してください。

### スケジュールの作成

td connector:createコマンドを使用して新しいスケジュールを作成できます。スケジュールの名前、cron形式のスケジュール、データを保存するdatabaseとtable、およびデータコネクタ設定ファイルが必要です。

`cron`パラメーターは、`@hourly`、`@daily`、`@monthly`のオプションを受け入れます。

デフォルトでは、スケジュールはUTCタイムゾーンで設定されます。-tまたは--timezoneオプションを使用して、タイムゾーンでスケジュールを設定できます。`--timezone`オプションは、'Asia/Tokyo'、'America/Los_Angeles'などの拡張タイムゾーン形式のみをサポートします。PST、CSTなどのタイムゾーン略語は*サポートされておらず*、予期しないスケジュールにつながる可能性があります。


```
$ td connector:create \
    daily_import \
    "10 0 * * *" \
    td_sample_db \
    td_sample_table \
    load.yml
```

Treasure Dataのストレージは時間でパーティション分割されているため、*--time-column*オプションを指定することをお勧めします。


```
$ td connector:create \
    daily_import \
    "10 0 * * *" \
    td_sample_db \
    td_sample_table \
    load.yml \
    --time-column created_at
```

### スケジュールのリスト表示

td connector:listコマンドを入力すると、スケジュールされたエントリのリストを表示できます。


```
$ td connector:list+--------------+------------+----------+-------+--------------+-----------------+--------------------------------------------+| Name         | Cron       | Timezone | Delay | Database     | Table           | Config                                     |+--------------+------------+----------+-------+--------------+-----------------+--------------------------------------------+| daily_import | 10 0 * * * | UTC      | 0     | td_sample_db | td_sample_table | {"in"=>{"type"=>"google_drive",  |+--------------+------------+----------+-------+--------------+-----------------+--------------------------------------------+
```

## Appendix

### Outプラグインのモード

load.ymlファイルのoutセクションでファイルインポートモードを指定できます。

out:セクションは、データをTreasure Data tableにインポートする方法を制御します。
たとえば、Treasure Dataの既存のtableにデータを追加したり、データを置き換えたりすることができます。

出力モードは、データがTreasure Dataに配置されるときにデータを変更する方法です。

- **Append**(デフォルト): レコードはターゲットtableに追加されます。
- **Replace**(td 0.11.10以降で利用可能): ターゲットtableのデータを置き換えます。ターゲットtableに加えられた手動のスキーマ変更はそのまま残ります。


例:


```
in:
  ...
out:
  mode: append
in:
  ...
out:
  mode: replace
```

### インクリメンタルローディングの仕組み

インクリメンタルローディングは、最終更新時刻を使用して、最終更新時刻以降に変更されたファイルのみを読み込みます。

**インクリメンタルを使用したファイルからのインポート:**

初回実行時、このコネクタはこのファイルを読み込みます。**incremental** **が true** の場合、最新の更新時刻がファイル更新時刻として保存されます。

例:

- ファイル File0001.csv をインポート:

```
+--------------+--------------------------+
|   Filename   |   modified time          |
+--------------+--------------------------+
| File0001.csv | 2019-05-04T10:00:00.123Z |
```


ジョブが完了すると、last_modified_time は 2019-05-04T10:00:00.123Z に設定されます。

次回実行時には、ファイルの更新時刻が '**2019-05-08T10:00:00.123Z'** より大きい場合にのみ、ファイル File0001.csv がインポートされます。これは、初回実行後にファイルが更新されたことを意味します。

**インクリメンタルを使用したフォルダからのインポート:**

初回実行時、このコネクタはファイルタイプが CSV/TSV または CSV/TSV の gzip であるすべてのファイルを読み込みます。**incremental が true** の場合、フォルダ内のファイルリストを確認し、ファイルから最大更新時刻を取得します。

例:

- インポートフォルダに含まれるファイル:

```
+--------------+--------------------------+
|   Filename   |     Last update          |
+--------------+--------------------------+
| File0001.csv | 2019-05-04T10:00:00.123Z |
| File0011.csv | 2019-05-05T10:00:00.123Z |
| File0012.csv | 2019-05-06T10:00:00.123Z |
| File0013.csv | 2019-05-07T10:00:00.123Z |
| File0014.csv | 2019-05-08T10:00:00.123Z |
```
- **最大更新時刻**: 2019-05-08T10:00:00.123Z


ジョブが完了すると、last_modified_time は最大更新時刻 (2019-05-08T10:00:00.123Z) に設定されます。

次回実行時には、更新時刻が **2019-05-08T10:00:00.123Z** より大きいファイルのみがインポートされます。

例:

- インポートフォルダに新規追加および更新されたファイル:

```
+--------------+--------------------------+
|   Filename   |     Last update          |
+--------------+--------------------------+
| File0001.csv | 2019-05-04T10:00:00.123Z |
| File0011.csv | 2019-05-05T10:00:00.123Z |
| File0012.csv | 2019-05-06T10:00:00.123Z |
| File0013.csv | 2019-05-09T10:00:00.123Z |
| File0014.csv | 2019-05-08T10:00:00.123Z |
| File0015.csv | 2019-05-09T13:00:00.123Z |
```
- **最大更新時刻**: 2019-05-09T13:00:00.123Z


この場合、**File0013.csv** と **File0015.csv** のファイルのみがインポートされます。ジョブが完了すると、last_modified_time は最大更新時刻 (2019-05-09T13:00:00.123Z) に設定されます。

### client_id、client_secret、refresh_token の取得

CLI からジョブを発行するには、**client_id**、**client_secret**、**refresh_token** が必要です。

[https://console.cloud.google.com/projectcreate](https://console.cloud.google.com/projectcreate) にアクセスしてプロジェクトを登録します。

![](/assets/image-20191015-140319.a2cd8ccea7a02ee36fdd4f1125f59ac6e6052eac04c083108059c8952cba84a1.7a2fdaca.png)

プロジェクトに名前を付け、**Create** を選択します。

[https://console.cloud.google.com/apis/dashboard?](https://console.cloud.google.com/apis/dashboard) にアクセスして、プロジェクトの Drive Service を有効にします。

![](/assets/image-20191015-140332.08cd8e0d8a2feeea780d1561c37ce50feb396a5eaa711cbb5fcd2c8073397b71.7a2fdaca.png)

![](/assets/image-20191015-140342.0c4d171dd4f6f107e7ed5d62070baf5d9ca038e681cc1d0e31a605648fd8fcdf.7a2fdaca.png)

Google Drive API を選択し、**Enable** を選択します。

![](/assets/image-20191015-140403.e538b3edf99594f269d6b8c6d488bcb6363e1757282d3852e987f77cd6a4fa06.7a2fdaca.png)

[https://console.cloud.google.com/apis/credentials](https://console.cloud.google.com/apis/credentials) にアクセスし、プロジェクトを選択して新しい認証情報を作成します。

![](/assets/image-20191015-140437.ac1658e38b75d32ee99868f9a62c4ff971d77eae9b57570628824929fe73c421.7a2fdaca.png)

**OAuth consent screen** タブに移動し、アプリケーション名を入力してから、**Add scope** を選択して /auth/drive スコープを追加し、**Save** を選択します。

**Credentials** タブに移動し、**Create credentials** をクリックしてから OAuth client ID を選択します。

![](/assets/image-20191015-140450.19b272bf31d9fc78b0bdcc013f08bd7003b9a058c76dd9d5507a8cfb55a8fde7.7a2fdaca.png)

認証情報に名前を付け、リダイレクト URL として [https://developers.google.com/oauthplayground/](https://developers.google.com/oauthplayground/) を追加します。

![](/assets/image-20191015-140509.5288c1ad0c500ab41f699bd95d4642741bd5ec85199e16dd82ac09f05bbb8c38.7a2fdaca.png)

認証情報を選択して、client_id と client_secret を取得します。

![](/assets/image-20191015-140924.40f14099cbb47d819667a06a87d88f9e61bb6ca223fea39722179f209bd01c13.7a2fdaca.png)

![](/assets/image-20191015-140939.8a84dd05858f1c97bfd5e4ba3d4ab36c73070fce0baff6abe8bc8e17993ce7ee.7a2fdaca.png)

[https://developers.google.com/oauthplayground](https://developers.google.com/oauthplayground) にアクセスして **refresh_token** を取得します。

まず、Drive API v3 とスコープ **auth/drive** を選択し、Settings を選択して認証情報から取得できる **client id、client secret** を入力してから、**Authorize APIs** を選択します。

![](/assets/image-20191015-140951.1fc16c5c2e4bcbc45a86290c3d13f253415df987ae3f275dbe65a873e19f0f95.7a2fdaca.png)

Google アカウントでログインし、**Allow** を選択します。

![](/assets/image-20191015-141008.3724665d859d8f8f8ea05db9e0f34cfa22508ea3ecaa86676e3fdfcb110bdf55.7a2fdaca.png)

**Exchange authorization code for tokens** を選択します。

![](/assets/image-20191015-141019.36bcc3a6337d266184e827bb391627ba2fc3e948d241d5600b5a7af3ec18d68c.7a2fdaca.png)

![](/assets/image-20191015-141036.ef22333fbdcfb8c29e49b47185356030067e9e90a658f0c46a466fb0582ac201.7a2fdaca.png)

refresh token をコピーして、後で使用するために保存します。

### トークンの有効期限に関する注意事項

refresh token は、次のいずれかの理由で機能しなくなる可能性があります:

- ユーザーがアプリへのアクセスを取り消した。
- refresh token が 6 か月間使用されていない。
- ユーザーがパスワードを変更し、refresh token に Gmail スコープが含まれている。
- ユーザーアカウントが付与された (有効な) refresh token の最大数を超えた。


現在、クライアントごとのユーザーアカウントあたりの refresh token の制限は 50 です。制限に達すると、新しい refresh token を作成すると、警告なしに最も古い refresh token が自動的に無効になります。

参照: [https://developers.google.com/identity/protocols/OAuth2](https://developers.google.com/identity/protocols/OAuth2)

## Google Drive から File ID または Folder ID を取得する

[https://drive.google.com](https://drive.google.com/) にアクセスし、Google アカウントでログインします。

**Folder ID の取得:**

Folder ID を取得したいフォルダを選択し、URL から ID をコピーします。

![](/assets/image-20191015-141047.e178d70f0c385526a7268f0fa06e35d0e754917e3996e60949f175fd5df6267c.7a2fdaca.png)

**File ID の取得:**

ドライブからファイルを選択し、右クリックして「**Get shareable link**」を選択します。

![](/assets/image-20191015-141058.45cefa2678a35432ae686d7083a2cd047c48b794be415ee4b2dc03934c7fe65f.7a2fdaca.png)

**Link sharing** をオンにして、リンクから File ID をコピーします。

![](/assets/image-20191015-141118.e66e152c01509dff6c5aae223271d7b6ffd7c35cdddc11f9c6cf22965b4d4ea2.7a2fdaca.png)