Skip to content
Last updated

OneDrive Import Integration

OneDrive Export Integrationの詳細はこちら

OneDriveに接続して、個人用、ビジネス用ファイル、またはSharePointドキュメントをTreasure Dataにインポートできます。

前提条件

  • TD Toolbeltを含むTreasure Dataの基礎知識
  • OneDriveまたはSharePointアカウント OAuth認証には、ご自身で承認を行う必要があります。このインテグレーションは、OneDriveユーザーが管理者から承認を得る認証フローをサポートしていません。
  • Treasure Dataアカウントへの認証済みアクセス

OneDriveの増分ロード

増分ロードは、ファイルの最終インポート日を使用してレコードを単調にロードし、最新の実行後のファイルを挿入または更新します。

初回実行時、このコネクタはFilename RegexModified Afterに一致するすべてのファイルをロードします。incremental : trueが設定されている場合、最新の変更日時が新しいModified After値として保存されます。

例:

  • インポートフォルダに含まれるファイル:
+--------------+--------------------------+
|   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 |
  • Filename Regex: File001.*.csv
  • Modified After: 2019-05-01T10:00:00.00Z

この場合、File0011.csvFile0012.csvFile0013.csvFile0014.csvのファイルがインポートされます。これらはFilename Regexに一致し、すべて最終更新日が2019-05-01T10:00:00.00Zより後であるためです。

ジョブが完了すると、新しいModified After = 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-09T10:00:00.123Z |
  • Filename Regex: File001.*.csv

  • Modified After: 2019-05-08T10:00:00.123Z

この場合、File0013.csvFile0015.csvのファイルのみがインポートされます。

ドメイン名と相対パス

OneDriveビジネスアカウントプラン(個人フォルダ、SharePointサイトコレクション、共有されたフォルダを含む)にアクセスするには、ドメイン名とURL相対パスが必要です。

ブラウザでインポートしたいフォルダを開きます。次に、以下のようにドメイン名と相対パスを取得します:

個人フォルダ

SharePointコレクション

共有されたフォルダ

ファイル名Regexマッチング

このコネクタはファイル名マッチャーにJava言語のRegexをサポートしています。ドキュメントを参照してください。

例:

  • .csv拡張子を持つすべてのファイルに一致: .*.csv
  • 接頭辞abcで始まるすべてのファイルに一致: abc.*
  • ファイルabc.csvに完全一致: abc.csv

要求される権限

OneDrive Connectorは、個人アカウントを使用している場合、以下の権限を要求します:

権限 説明 注記
User.Readユーザーがアプリにサインインできるようにし、アプリがサインインしたユーザーのプロフィールを読み取れるようにします。また、サインインしたユーザーの基本的な会社情報も読み取れるようにします。
Files.ReadWrite.AppFolderアプリケーションのフォルダ内のファイルの読み取り、作成、更新、削除をアプリに許可します。アプリケーションのフォルダは、「TreasureData OneDrive Connector」アプリ専用の特別なフォルダです。App Folderとはを参照してください。
Files.ReadWrite.Allサインインしたユーザーがアクセスできるすべてのファイルの読み取り、作成、更新、削除をアプリに許可します。インポートおよびエクスポートコネクタは同じクライアントアプリケーションを共有し、読み取り、作成、更新のみを実行しますが、ファイルは削除しません。
offline_accessユーザーが現在アプリを使用していない場合でも、アプリがユーザーデータを読み取り、更新できるようにします。スケジュールされたインポート/エクスポートに使用

ビジネス/ワークアカウントでは追加の権限が要求されます

権限説明注記
Sites.ReadWrite.Allすべてのグループの読み取りと書き込み、すべてのサイトコレクション内のアイテムの編集または削除読み取り、作成、更新のみを実行しますが、ファイルは削除しません。

注意: 削除権限はSites.ReadWrite.All権限の一部としてデフォルトで付与されますが、データコネクタはMicrosoft OneDrive上のファイルを削除しません。

TD Consoleを使用した接続の作成

新しい接続の作成

  1. データ接続を設定する際、インテグレーションにアクセスするための認証を提供します。Treasure Dataでは、認証を設定してから、ソース情報を指定します。

  2. Integrations Hub -> Catalogに移動し、OneDriveを検索して選択します。

  1. 以下のダイアログが開きます。

  1. Treasure Data OneDriveへのアクセスにはOAuth2認証が必要です。認証では、ユーザーが手動でTreasure DataアカウントをそれぞれのOneDriveアカウントに接続する必要があります。

  2. 認証するには、以下の手順を完了してください:

  3. Click hereを選択して、新しいアカウントに接続します。

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

  1. TD Consoleにリダイレクトされます。最初のステップ(新しい接続の作成)を繰り返し、新しいOAuth接続を選択します。

  1. 新しいOneDrive接続に名前を付けます。Doneを選択します。

OneDriveデータをTreasure Dataに転送

Authenticationsで、New Sourceを設定します。

詳細を入力し、Nextを選択します。

OneDrive Connectorは2種類のアカウントプランタイプをサポートしています:

Business

Personal

パラメータ:

  • OneDrive Account Plan: OneDriveアカウントプラン。2つのタイプをサポート:

    • Business
    • Personal
  • Ingest Shared Files: ビジネスアカウントプランのみに適用。直接共有されたファイルをインポート(共有されたフォルダとは異なります)。

  • Domain Name: ビジネスアカウントプランのみに適用。付録のドメイン名と相対パスを参照してください。

  • Relative Path: ビジネスアカウントプランのみに適用。URL相対パスを指定します。付録のドメイン名と相対パスを参照してください。

  • Folder Path: ファイルをインポートするフォルダパス。例: /import/20190501

  • This is a shared folder: 個人アカウントプランのみに適用。共有フォルダへの相対パスを指定します。FAQ「共有されたフォルダをインポートする方法」を参照してください。

  • Filename RegEx: 指定されたファイル名regexに一致するファイルのみをインポート。正規表現の詳細を参照してください。また、ファイル名Regexマッチングも参照してください。

  • Modified After: このタイムスタンプ以降に変更されたファイルのみをインポート。タイムゾーンはUTCです。このパラメータが空の場合、すべてのファイルをインポートします。タイムスタンプ形式: yyyy-MM-dd'T'HH:mm:ss.SSSZ 例: 2019-05-01T10:00:00.121Z

  • Incremental? 繰り返し実行する際、最後のインポート以降のファイルのみをインポートしようとします。増分ロードの仕組みを参照してください。

プレビュー

データプレビューはオプションであり、必要に応じてNextをクリックしてダイアログの次のページに進むことができます。

  1. Generate Previewを選択して、インポートを実行する前にデータのプレビューを表示します。

    データプレビューに表示されるデータは、ソースから近似されたものです。実際にインポートされるデータではありません。

  2. データが期待どおりに見えることを確認します。

  3. Nextを選択します。

高度な設定

高度な設定では、推測されたプロパティをカスタマイズできます。必要に応じて以下のセクションを編集してください。

  • Decoders: OneDriveに保存されているエンコードされたファイルに応じて、推測されたファイルデコーダーを変更できます。サポートされているファイルデコーダー:

    • Gzip
    • Bzip2
    • Zip
    • OpenPGP Decryption
  • Parser: 必要に応じてファイルパーサーを更新します。

    • Columns:

      • Name: カラムの名前を変更します。カラム名にサポートされている文字は、小文字のアルファベット、数字、「_」(アンダースコア)のみです。

      • Type: 値を指定された型として解析し、その型をTreasure Dataスキーマの一部として保存します。

        • boolean
        • long
        • timestamp: Treasure DataではString型としてインポートされます(例: 2017-04-01 00:00:00.000)
        • double
        • string
        • json
  • Retry Limit: オプション。システムがあきらめる前にエラーが発生したときの再試行回数。デフォルトは7

  • Initial retry time wait in millis: オプション。1回目と2回目の試行の間の時間(ミリ秒)。デフォルト: 500ミリ秒

  • Max retry wait in millis: オプション。2回目以降のすべての試行の間の時間(ミリ秒)。デフォルト: 300000 ~ 5分。

  • HTTP Connect Timeout: オプション。HTTP接続タイムアウトの時間(ミリ秒)。デフォルト: 60000 ~ 1分。

  • HTTP Read Timeout: オプション。HTTP読み取りタイムアウトの時間(ミリ秒)。デフォルト: 300000 ~ 5分。

  • Minimum task size: インポートフォルダに多数の小さなファイルが含まれている場合、インポートパフォーマンスの低下を引き起こす可能性があります。パフォーマンス向上のため、この値を設定して、1つのタスクで複数のファイルを結合します。例: 4000000 ~ 4MB

ターゲットデータベースとテーブルの選択

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

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

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

デフォルトキーではなく、異なるパーティションキーシードを設定したい場合は、ポップアップメニューを使用して指定できます。

スケジューリング

Scheduleタブで、1回限りの転送を指定するか、自動化された定期転送をスケジュールできます。Once nowを選択した場合は、Start Transferを選択します。**Repeat…**を選択した場合は、スケジュールオプションを指定してから、Schedule Transferを選択します。

New Source名を入力し、DONEを選択します

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

コマンドラインを使用したOneDrive接続の作成

TD Toolbeltを使用して接続を設定できます。

独自のRefresh_Tokenの取得

CLIからジョブを発行するには、client_idclient_secret、およびrefresh_tokenが必要です。

開発者アカウントを登録し、Azure App Registration Portal https://portal.azure.com/#homeにアクセスします。検索ボックスで、App Registrationを検索します

New Registrationを選択します。

App Nameを入力し、Account Typeを選択し、図のようにRedirect URIを入力します。Registerを選択します。

App Permissionsタブから、Add a Permissionを選択します。

Request API permissionsウィンドウから、Microsoft Graph -> Delegated permissionsを選択し、図のように権限を追加します:

Certificates & secretsタブから、New client secretを選択し、NeverAddを選択します。

新しいclient secretキーが図のように作成されます:

Overviewタブから、図のようにclient idが表示されます:

このURLのclient_idを置き換えて、ブラウザで開きます。

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=xxxxxx&response_type=code&redirect_uri=http://localhost&response_mode=query&scope=offline_access files.readwrite.all openid sites.readwrite.all files.readwrite.appfolder&state=1234

Permission Requestウィンドウを承認します。

アドレスバーからcodeをコピーします:

code、client_id、client_secretを置き換えて、curlコマンドを実行し、access_tokenrefresh_tokenを取得します

curl -X POST \
  https://login.microsoftonline.com/common/oauth2/v2.0/token \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'client_id={xxxxxx}&client_secret={xxxxx}&grant_type=authorization_code&scope=offline_access%20files.readwrite.all%20openid%20sites.readwrite.all&code={xxxxxx}&redirect_uri=http://localhost'

Treasure Data Toolbeltのインストール

ターミナルを開き、以下のコマンドを実行して最新のTD Toolbeltをインストールします。

$ gem install td
$ td --version
0.16.1

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

テキストエディタを使用して、seed.ymlというファイルを作成します。以下の情報をコピーして貼り付け、プレースホルダーテキストをOneDriveの情報に置き換えます。この設定は、「replace」モードが指定されているため、/xxxフォルダからすべてのファイルコンテンツをターゲットデータベースにダンプします。利用可能なoutモードの詳細については、付録を参照してください。

アカウントがBusinessアカウントプランの場合

in:
  type: one_drive
  refresh_token: 'xxxxxxxxxxxxxxxx'
  client_id: 'xxxxxxxxxx'
  client_secret: 'xxxxxx'
  account_type: business
  domain_name: xxxx.xxxx.com
  server_relative_path: /xxx/xx
  folder_path: /xxx
out:
  mode: append

アカウントがPersonalアカウントプランの場合

in:
  type: one_drive
  refresh_token: 'xxxxxxxxxxxxxxxx'
  client_id: 'xxxxxxxxxx'
  client_secret: 'xxxxxx'
  account_type: personal
  folder_path: /xxx
out:
  mode: append

認証

OneDriveでの認証のためにclient_idclient_secret、およびrefresh_tokenを指定します。詳細については、付録の「独自のrefresh_tokenの取得」を参照してください。

domain_name、server_relative_path、およびfolder_pathを指定します。付録のドメイン名と相対パスを参照してください。

Guess Fieldsコマンドの実行 (load.ymlファイルの生成)

スキーマレスデータベースからデータを取得する場合は、guessコマンドを使用します。ターミナルから以下のコマンドを実行します:

$ td connector:guess seed.yml -o load.yml

connector:guessは、ターゲットデータを自動的に読み取り、データ形式をインテリジェントに推測します。

load.ymlファイルを開きます。ファイル形式、エンコーディング、カラム名、型を含む、推測されたファイル形式定義が表示されます。

設定キーと説明は以下のとおりです:

Config keyTypeRequiredDescription
account_typestringyesOneDriveアカウントプラン。business
client_idstringyesOAuth client_id
client_secretstringyesOAuth client_secret
refresh_tokenstringyes独自のrefresh_tokenの取得を参照してください。
is_shared_rootbooleannobusiness accout_typeのみに適用。trueの場合、直接共有されたファイルをインポート(共有フォルダとは異なります)
is_shared_folderbooleannopersonal account_typeのみに適用。共有されたファイル/フォルダをインポート。
domain_namestringnoaccount_type = businessの場合に必要。
server_relative_pathstringnoaccount_type = businessの場合に必要。
folder_pathstringnois_shared_root = falseの場合に必要
last_modified_timestringno指定されたタイムスタンプ以降に変更されたファイルのみをインポート。タイムゾーンはUTC。このパラメータが空の場合、すべてのファイルをインポート。タイムスタンプ形式: yyyy-MM-dd'T'HH:mm:ss.SSSZ 例: 2019-05-01T10:00:00.121Z
name_match_patternstringno指定されたファイル名regexに一致するファイルのみをインポート。ファイル名Regexマッチングを参照
incrementalbooleanno繰り返し実行する際、最後のインポート以降のファイルのみをインポートしようとします。
retry_limitintegernoオプション。システムがあきらめる前にエラーが発生したときの再試行回数。デフォルトは7回
retry_initial_wait_millisintegerno1回目と2回目の試行の間の時間(ミリ秒)。デフォルト: 500ミリ秒
max_retry_wait_millisintegerno2回目以降のすべての試行の間の時間(ミリ秒)。デフォルト: 300000 ~ 5分
connection_timeout_millislongnoHTTP接続タイムアウトの時間(ミリ秒)。デフォルト: 60000 ~ 1分
read_timeout_millislongnoHTTP読み取りタイムアウトの時間(ミリ秒)。デフォルト: 300000 ~ 5分。
min_task_sizelongnoインポートフォルダに多数の小さなファイルが含まれている場合、インポートパフォーマンスの低下を引き起こす可能性があります。パフォーマンス向上のため、この値を設定して1つのタスクで複数のファイルを結合します。例: 4000000 ~ 4MB

personalアカウントプラン、incremental、およびcolumn_optionsを使用したload.ymlの例。

in:
  type: one_drive
  refresh_token: 'xxxxxxxxxxxxxxxx'
  client_id: 'xxxxxxxxxx'
  client_secret: 'xxxxxx'
  account_type: personal
  folder_path: /xxx
  decoders:
  - {type: gzip}
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: ''
    skip_header_lines: 1
    columns:
    - name: id
      type: long
    - name: company
      type: string
    - name: customer
      type: string
    - name: created_at
      type: timestamp
      format: '%Y-%m-%d %H:%M:%S'
out: {mode: append}
exec: {}

オプション: インポートするデータのプレビュー

プレビューコマンドを使用して、システムがデータをどのように解析するかをプレビューできます。

$ td connector:preview load.yml
+-------+---------+----------+---------------------+
| id    | company | customer | created_at          |
+-------+---------+----------+---------------------+
| 11200 | AA Inc. |    David | 2015-03-31 06:12:37 |
| 20313 | BB Imc. |      Tom | 2015-04-01 01:00:07 |
| 32132 | CC Inc. | Fernando | 2015-04-01 10:33:41 |
| 40133 | DD Inc. |    Cesar | 2015-04-02 05:12:32 |
| 93133 | EE Inc. |     Jake | 2015-04-02 14:11:13 |
+-------+---------+----------+---------------------+

guessコマンドは、ソースデータファイルに3行以上と2列以上が必要です。これは、ソースデータのサンプル行を使用してカラム定義を推測するためです。

システムがカラム名またはカラム型を予期せず検出した場合は、load.ymlを直接変更して、プレビューを再度実行します。

Data Connectorは、「boolean」、「long」、「double」、「string」、および「timestamp」型の解析をサポートしています。

previewコマンドは、指定されたバケットから1つのファイルをダウンロードし、そのファイルの結果を表示します。これにより、プレビューコマンドとissueコマンドの結果に違いが生じる可能性があります。

ロードジョブの実行

td connector:issueを使用してジョブを実行します。以下が必要です:

  • スケジュールの名前
  • cron形式のスケジュール
  • データが保存されるデータベースとテーブル
  • Data Connector設定ファイル
$ td connector:issue load.yml --database td_sample_db --table td_sample_table --time-column created_at \
    daily_onedrive_import ...

データベースまたはテーブルがTDに存在しない場合、td connector:issueは失敗します。

Treasure Dataのストレージは時間によってパーティション化されているため、--time-columnオプションを指定することをお勧めします(データパーティショニングを参照)。--time-columnオプションが使用できない場合、データコネクタは最初のlongまたはtimestampカラムをパーティショニング時刻として選択します。--time-columnで指定するカラムの型は、longまたはtimestamp型のいずれかである必要があります(使用可能なカラム名と型を確認するには、プレビュー結果を使用してください)。timeカラムは出力の最後に使用できます。

$ td connector:issue load.yml --database td_sample_db --table td_sample_table \
  --time-column created_at

データにtimeカラムがない場合は、add_timeフィルタを使用して追加できます。以下のように設定ファイルにadd_timeフィルタを追加することで、「time」カラムを追加します。

in:
  type: onedrive
  ...
filters:
- type: add_time
  from_value:
    mode: upload_time
  to_column:
    name: time
out:
  type: td

詳細はadd_timeフィルタプラグインを参照してください。

このインテグレーションはサーバー側でレコードをソートしません。時間ベースのパーティショニングを効果的に使用するには、インポートジョブを実行する前にファイル内のレコードをソートしてください。

timeというフィールドがある場合、--time-columnオプションを指定する必要はありません。

$ td connector:issue load.yml --database td_sample_db --table td_sample_table

スケジュールされた実行

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

スケジュールされたインポートでは、OneDrive用データコネクタはname_match_patternパラメータに一致するすべてのオブジェクトをインポートします。incrementalおよびlast_modified_timeパラメータは、最後のインポート以降にfolder_pathに更新または追加されたファイルをインポートするために使用されます。増分ロードの仕組みを参照してください。

以下は、出力に「append」モードを組み合わせた増分モードを使用したseedファイルの例です。

in:
  type: one_drive
  refresh_token: 'xxxxxxxxxxxxxxxx'
  client_id: 'xxxxxxxxxx'
  client_secret: 'xxxxxx'
  account_type: personal
  folder_path: /xxx
  incremental: true
  decoders:
  - {type: gzip}
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: ''
    skip_header_lines: 1
    columns:
    - name: id
      type: long
    - name: company
      type: string
    - name: customer
      type: string
    - name: created_at
      type: timestamp
      format: '%Y-%m-%d %H:%M:%S'
out: {mode: append}
exec: {}

スケジュールの作成

td connector:createコマンドを使用して新しいスケジュールを作成できます。以下が必要です:

  • スケジュールの名前
  • cron形式のスケジュール
  • データが保存されるデータベースとテーブル
  • Data Connector設定ファイル
$ 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

cronパラメータは、@hourly@daily@monthlyの3つの特別なオプションも受け入れます。

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

OneDriveからのインポートに関するFAQ

Q: 誰かが私と共有したフォルダをインポートするにはどうすればよいですか?

Business Account Plan:

ドメイン名、サーバーの相対パス、およびフォルダパスが必要です。ブラウザでShared With Meタブに移動します:

共有フォルダを選択し、ドメイン名と相対パスで説明されているように、ドメイン名、相対パス、およびフォルダパスをメモします。

Personal Account Plan

This is a shared folder (is_shared_folder)フィールドをtrueに設定し、画像に示すように共有フォルダにドリルダウンする必要があります。

共有フォルダf1を選択し、インポートするf2ターゲットフォルダに移動します。

図のようにフォルダパスパラメータを入力します: folder_path: /f1/f2 (注意: フォルダf0は共有されていません)

Q: SharePointコレクションからファイルをインポートするにはどうすればよいですか?

SharePointコレクションからファイルをインポートするには、ドメイン名、サーバーの相対パス、およびフォルダパスが必要です。ドメイン名と相対パスを参照してください。

Q: 「Attribute type is required but not set」というエラーが発生したのはなぜですか?

インポートフォルダに空のファイルが含まれているか、ファイルに改行文字がありません。空のファイルを削除し、インポートファイルに少なくとも2行のデータがあることを確認してください。

Q: アプリにアクセスするためにOneDrive管理者ユーザーから承認を得る必要があります。管理者から承認を得た後、OAuth接続が接続リストに表示されません

これは、コネクタがそのようなOAuthフロー(OAuthで承認を要求する)をサポートしていないためです。したがって、OneDrive管理者ユーザーに代わって認証を作成するよう依頼してください。

付録

Outプラグインのモード

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

outセクションは、データがTreasure Dataテーブルにインポートされる方法を制御します。 例えば、データを追加するか、Treasure Dataの既存のテーブルのデータを置き換えるかを選択できます。

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

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

例:

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