AppFlow パーティションと集約の設定について

# 概要

- AppFlowのパーティションと集約の設定についてまとめる。

# 情報

- 今回説明で使用するAppFlowの送信先はS3として任意のバケットとフォルダを選択済み。
- 出力はCSVとしてマッピングも設定済み。

# 前提

- 説明の都合上AppFlowの送信先S3バケット名は「Fooバケット」とし、フロー名は「foo-test」とする。

# ご注意

- 日時系情報はUTCで変更できないので注意する

# パーティションの設定と集約の設定

- パーティションの設定は下記の三種類である。
    - 日時
    - 実行ID
    - 送信先フィールド
- 集約の設定は下記の三種類である。
    - 集約しない
    - 全てのレコードを各パーティションの1ファイルに集約する
    - レコードを各パーティションの複数ファイルに集約する
- 上記の設定の組み合わせによって出力されるCSVの位置やファイル名が異なる。

# ~~パーティションはチェックしない 集約「集約しない」の場合~~ パーティション「実行ID」をチェックしない 集約「すべてのレコードを各パーティションの 1 ファイルに集約する」の場合

- この場合、出力先のフォルダ直下にフロー名のフォルダーを作成し、実行ID名のCSVファイルを出力する。
- なので今回の場合下記のようにCSVファイルが生成されてゆく。（特に削除したりしなければ、フローが実行されるたびにどんどんfoo-testフォルダ内にCSVが出力されてゆく）

    ```
    Fooバケット
        └foo-test
            └0-985d7648653e3bf185091d78a018a61d-0063CF51FCBF1CC437（CSVファイル）
            └0-2fb6d65d74ff5b51410c9778a7c7fce9-0063CF4D863AD02487（CSVファイル）
            └0-5f15a3e9ded929ab75943c1e886684a1-0063CF4D7BF0A69AD7（CSVファイル）
                ・
                ・
                ・
    ```

# パーティション「実行ID」と「日時（オプションは毎年）」 集約「集約しない」の場合

- この場合、出力先のフォルダ直下にフロー名のフォルダーを作成、更にその中にYYYYのフォルダを作成、更にその中に実行ID名のフォルダを作成し、その中にCSVファイルを出力する。
- 今回の場合下記のようになる。（フローが実行されるたびにYYYYフォルダ直下の実行IDフォルダが作成されてゆく。）

    ```
    Fooバケット
        └foo-test
            └YYYY
                └0-985d7648653e3bf185091d78a018a61d-0063CF51FCBF1CC437
                    └0-（CSVファイル）
                └0-2fb6d65d74ff5b51410c9778a7c7fce9-0063CF4D863AD02487
                    └0-（CSVファイル）
                        ・
                        ・
                        ・
    ```

# パーティション「実行ID」と「日時（オプションは毎月）」 集約「集約しない」の場合

- この場合、出力先のフォルダ直下にフロー名のフォルダーを作成、更にその中にYYYYのフォルダを作成、更にその中にMMのフォルダを作成、更にその中に実行ID名のフォルダを作成し、その中にCSVファイルを出力する。
- 今回の場合下記のようになる。（フローが実行されるたびにMMフォルダ直下の実行IDフォルダが作成されてゆく。）

    ```
    Fooバケット
        └foo-test
            └YYYY
                └MM
                    └0-985d7648653e3bf185091d78a018a61d-0063CF51FCBF1CC437
                        └0-（CSVファイル）
                    └0-2fb6d65d74ff5b51410c9778a7c7fce9-0063CF4D863AD02487
                        └0-（CSVファイル）
                            ・
                            ・
                            ・
    ```

# パーティション「実行ID」と「日時（オプションは毎日）」 集約「集約しない」の場合

- この場合、出力先のフォルダ直下にフロー名のフォルダーを作成、更にその中にYYYYのフォルダを作成、更にその中にMMのフォルダを作成、更にその中にDDのフォルダを作成、更にその中に実行ID名のフォルダを作成し、その中にCSVファイルを出力する。
- 今回の場合下記のようになる。（フローが実行されるたびにDDフォルダ直下の実行IDフォルダが作成されてゆく。）

    ```
    Fooバケット
        └foo-test
            └YYYY
                └MM
                    └DD
                        └0-985d7648653e3bf185091d78a018a61d-0063CF51FCBF1CC437
                            └0-（CSVファイル）
                        └0-2fb6d65d74ff5b51410c9778a7c7fce9-0063CF4D863AD02487
                            └0-（CSVファイル）
                                ・
                                ・
                                ・
    ```

# パーティション「実行ID」と「日時（オプションは毎時）」 集約「集約しない」の場合

- この場合、出力先のフォルダ直下にフロー名のフォルダーを作成、更にその中にYYYYのフォルダを作成、更にその中にMMのフォルダを作成、更にその中にDDのフォルダを作成、更にその中にHHのフォルダを作成、更にその中に実行ID名のフォルダを作成し、その中にCSVファイルを出力する。
- 今回の場合下記のようになる。（フローが実行されるたびにHHフォルダ直下の実行IDフォルダが作成されてゆく。）

    ```
    Fooバケット
        └foo-test
            └YYYY
                └MM
                    └DD
                        └HH
                            └0-985d7648653e3bf185091d78a018a61d-0063CF51FCBF1CC437
                                └0-（CSVファイル）
                            └0-2fb6d65d74ff5b51410c9778a7c7fce9-0063CF4D863AD02487
                                └0-（CSVファイル）
                                    ・
                                    ・
                                    ・
    ```

# パーティション「実行ID」と「日時（オプションは分）」 集約「集約しない」の場合

- この場合、出力先のフォルダ直下にフロー名のフォルダーを作成、更にその中にYYYYのフォルダを作成、更にその中にMMのフォルダを作成、更にその中にDDのフォルダを作成、更にその中にHHのフォルダを作成、更にその中にMMのフォルダを作成、更にその中に実行ID名のフォルダを作成し、その中にCSVファイルを出力する。
- 今回の場合下記のようになる。（フローが実行されるたびにMMフォルダ直下の実行IDフォルダが作成されてゆく。）

    ```
    Fooバケット
        └foo-test
            └YYYY
                └MM
                    └DD
                        └HH
                            └MM
                                └0-985d7648653e3bf185091d78a018a61d-0063CF51FCBF1CC437
                                    └0-（CSVファイル）
                                └0-2fb6d65d74ff5b51410c9778a7c7fce9-0063CF4D863AD02487
                                    └0-（CSVファイル）
                                        ・
                                        ・
                                        ・
    ```

# パーティション「実行ID」と「送信先フィールド（フィールドは任意のものを指定）」 集約「集約しない」の場合

- この場合、出力先のフォルダ直下にフロー名のフォルダーを作成、更にその中にフローのスキーマバージョン名のフォルダを作成、更にその中に、更にその中に実行ID名のフォルダを作成、更にその中にフィールドと値名のフォルダを作成、その中にCSVファイルを出力する。
- 今回の場合下記のようになる。ちなみにフィールドは複数設定可能である。

    ```
    Fooバケット
        └foo-test
            └schemaVersion_スキーマバージョン数
                └0-985d7648653e3bf185091d78a018a61d-0063CF51FCBF1CC437
                    └フィールド名=値
                        └0-（CSVファイル）
                └0-2fb6d65d74ff5b51410c9778a7c7fce9-0063CF4D863AD02487
                    └フィールド名=値
                        └0-（CSVファイル）
                            ・
                            ・
                            ・
    ```

# パーティション「実行ID」 集約「すべてのレコードを各パーティションの 1 ファイルに集約する」の場合

- この場合、出力先のフォルダ直下にフロー名のフォルダーを作成し、その中にフローのスキーマバージョン名のフォルダを作成、その中に実行ID名のCSVファイルを出力する。
- なので今回の場合下記のようにCSVファイルが生成されてゆく。複数回フローが実行された場合、スキーマバージョン名フォルダーにCSVが都度生成される。

    ```
    Fooバケット
        └foo-test
            └schemaVersion_スキーマバージョン数
                └0-985d7648653e3bf185091d78a018a61d-0063CF51FCBF1CC437（CSVファイル）
                └0-2fb6d65d74ff5b51410c9778a7c7fce9-0063CF4D863AD02487（CSVファイル）
                └0-5f15a3e9ded929ab75943c1e886684a1-0063CF4D7BF0A69AD7（CSVファイル）
                    ・
                    ・
                    ・
    ```

# パーティション「実行ID」 集約「レコードを各パーティションの複数のファイルに集約する」の場合

- この場合、出力先のフォルダ直下にフロー名のフォルダーを作成し、その中にフローのスキーマバージョン名のフォルダを作成、その中に実行ID名のCSVファイルを出力する。
- 一見「すべてのレコードを各パーティションの 1 ファイルに集約する」と「レコードを各パーティションの複数のファイルに集約する」で同じ様に見えるが、これはフロー実行時の送信元の状態によって異なる気がする。（複数のデータ変更があった場合、1CSVに1レコードだけしか出力せず複数ファイル設置するか、1CSVファイルに複数レコード分の情報を出力するのか）
- なので今回の場合下記のようにCSVファイルが生成されてゆく。複数回フローが実行された場合、スキーマバージョン名フォルダーにCSVが都度生成される。

    ```
    Fooバケット
        └foo-test
            └schemaVersion_スキーマバージョン数
                └0-985d7648653e3bf185091d78a018a61d-0063CF51FCBF1CC437（CSVファイル）
                └0-2fb6d65d74ff5b51410c9778a7c7fce9-0063CF4D863AD02487（CSVファイル）
                └0-5f15a3e9ded929ab75943c1e886684a1-0063CF4D7BF0A69AD7（CSVファイル）
                    ・
                    ・
                    ・
    ```

# まとめ

- パーティションは出力を行うディレクトリの情報を設定する。
- 集約は出力するファイルの出力方法を設定する。
- 「AppFlow出力ファイルを使ってlambdaでなにかする。終わったらAppFlowのファイルを削除する。」とかならパーティション「実行ID」、集約「集約しない」で十分かも。