Amazon QuickSight で既存の複数データセットを結合したデータセットを API から作成してみた

2023.04.28

いわさです。

QuickSight のデータセットでは既存のデータセットを結合して新しいデータセットを作成することが出来ます。
先日 AWS CLI (API) で既存のデータセットを指定して構築出来るのかを質問され検証してみましたので確認結果を共有したいと思います。

結論としてはLogicalTableMapを使って結合を表現出来ますよ。という感じです。

コンソールでデータセットを作成して定義を確認してみる

QuickSight で何かをコード化したい際に、イチからコードを作成するのは中々大変です。
そこで、お勧めなのは一度コンソール上から GUI で作成したものを CLI で参照して定義を確認する方法です。

まず次のように 2 つの適当なデータセットが存在しているものとします。

データセット編集画面で既存データセットをデータソース代わりに指定することが出来るので、上記の 2 つのデータセットを追加します。
そうすると、2 つのデータセットの結合方法を設定出来ます。
ここでは検証なので何でも良いのですが Left Outer Join させてみましょう。

このように簡単にコンソール上で結合されたデータセットを作成することが出来ました。

続いて、AWS CLI でdescribe-data-setを使って、データセットの定義を確認してみましょう。

以下のハイライト部分で既存データセットの定義と、結合されたデータセットの定義がされていますね。

% aws-v1 quicksight describe-data-set --aws-account-id 123456789012 --data-set-id edcaf5e6-1df5-4933-a060-1af5e47a2a1a 
{
    "Status": 200,
    "DataSet": {
        "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/edcaf5e6-1df5-4933-a060-1af5e47a2a1a",
        "DataSetId": "edcaf5e6-1df5-4933-a060-1af5e47a2a1a",
        "Name": "hoge0425join2",
        "CreatedTime": 1682431971.308,
        "LastUpdatedTime": 1682431995.074,
        "PhysicalTableMap": {},
        "LogicalTableMap": {
            "1731dbb0-1228-4299-9a2d-71438db3d29f": {
                "Alias": "hoge0425b",
                "DataTransforms": [
                    {
                        "RenameColumnOperation": {
                            "ColumnName": "key1",
                            "NewColumnName": "key1[hoge0425b]"
                        }
                    }
                ],
                "Source": {
                    "DataSetArn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/599be6e0-c054-4d56-91cb-eb3b3a24a25d"
                }
            },
            "79449835-fe41-4174-bb1b-d838ebb4ad30": {
                "Alias": "hoge0425a",
                "Source": {
                    "DataSetArn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/a1e4803a-5ea6-4191-ac14-7bf4a434e695"
                }
            },
            "93ca75d9-e35d-428b-8ab6-9f75e9defb80": {
                "Alias": "Intermediate Table",
                "DataTransforms": [
                    {
                        "ProjectOperation": {
                            "ProjectedColumns": [
                                "key1",
                                "val1",
                                "key1[hoge0425b]",
                                "val2"
                            ]
                        }
                    }
                ],
                "Source": {
                    "JoinInstruction": {
                        "LeftOperand": "79449835-fe41-4174-bb1b-d838ebb4ad30",
                        "RightOperand": "1731dbb0-1228-4299-9a2d-71438db3d29f",
                        "Type": "LEFT",
                        "OnClause": "key1 = {key1[hoge0425b]}"
                    }
                }
            }
        },
        "OutputColumns": [
            {
                "Name": "key1",
                "Type": "STRING"
            },
            {
                "Name": "val1",
                "Type": "INTEGER"
            },
            {
                "Name": "key1[hoge0425b]",
                "Type": "STRING"
            },
            {
                "Name": "val2",
                "Type": "INTEGER"
            }
        ],
        "ImportMode": "SPICE",
        "ConsumedSpiceCapacityInBytes": 234,
        "FieldFolders": {},
        "DataSetUsageConfiguration": {
            "DisableUseAsDirectQuerySource": false,
            "DisableUseAsImportedSource": false
        }
    },
    "RequestId": "96ccb4b8-676b-4eb0-a897-ae04f90582d5"
}

上記を参考にデータセットを作成したいと思います。
データセット作成時にはパーミッション設定も必要になるので、上記のコンソールで作成したデータセットのパーミッション情報を参考のために取得しておきます。

% aws-v1 quicksight describe-data-set-permissions --aws-account-id 123456789012 --data-set-id edcaf5e6-1df5-4933-a060-1af5e47a2a1a
{
    "Status": 200,
    "DataSetArn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/edcaf5e6-1df5-4933-a060-1af5e47a2a1a",
    "DataSetId": "edcaf5e6-1df5-4933-a060-1af5e47a2a1a",
    "Permissions": [
        {
            "Principal": "arn:aws:quicksight:ap-northeast-1:123456789012:user/default/cm-iwasa.takahito/cm-iwasa.takahito",
            "Actions": [
                "quicksight:PassDataSet",
                "quicksight:CreateIngestion",
                "quicksight:DeleteRefreshSchedule",
                "quicksight:UpdateRefreshSchedule",
                "quicksight:UpdateDataSet",
                "quicksight:DeleteDataSetRefreshProperties",
                "quicksight:CreateRefreshSchedule",
                "quicksight:DescribeDataSetPermissions",
                "quicksight:ListIngestions",
                "quicksight:UpdateDataSetPermissions",
                "quicksight:DescribeIngestion",
                "quicksight:PutDataSetRefreshProperties",
                "quicksight:DeleteDataSet",
                "quicksight:DescribeDataSet",
                "quicksight:CancelIngestion",
                "quicksight:DescribeRefreshSchedule",
                "quicksight:ListRefreshSchedules",
                "quicksight:DescribeDataSetRefreshProperties"
            ]
        }
    ],
    "RequestId": "a236245c-6c88-459a-bcc9-19de15fec2d5"
}

良いですね。

結合データセットの定義を構成して API からデータセットを作成

続いてcreate-data-setを使って新規データセットを作成します。

コマンドの入力パラメータは次のような形で用意しました。
LogicalTableMapは先程のものを参考にほぼ同じ形で構成しています。

また、Permissionsでは取得したパーミッション設定を参考に似たものを設定しています。

create-data-set.json

{
    "AwsAccountId": "123456789012",
    "DataSetId": "hoge0425dataset1111111",
    "Name": "hoge0425dataset1111111",
    "PhysicalTableMap": {},
    "LogicalTableMap": {
        "hoge0425b": {
            "Alias": "hoge0425b",
            "DataTransforms": [
                {
                    "RenameColumnOperation": {
                        "ColumnName": "key1",
                        "NewColumnName": "key1[hoge0425b]"
                    }
                }
            ],
            "Source": {
                "DataSetArn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/599be6e0-c054-4d56-91cb-eb3b3a24a25d"
            }
        },
        "hoge0425a": {
            "Alias": "hoge0425a",
            "Source": {
                "DataSetArn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/a1e4803a-5ea6-4191-ac14-7bf4a434e695"
            }
        },
        "hoge0425c": {
            "Alias": "Intermediate Table",
            "DataTransforms": [
                {
                    "ProjectOperation": {
                        "ProjectedColumns": [
                            "key1",
                            "val1",
                            "key1[hoge0425b]",
                            "val2"
                        ]
                    }
                }
            ],
            "Source": {
                "JoinInstruction": {
                    "LeftOperand": "hoge0425a",
                    "RightOperand": "hoge0425b",
                    "Type": "LEFT",
                    "OnClause": "key1 = {key1[hoge0425b]}"
                }
            }
        }
    },
    "ImportMode": "SPICE",
    "FieldFolders": {},
    "Permissions": [
        {
            "Principal": "arn:aws:quicksight:ap-northeast-1:123456789012:user/default/hoge-iwasa.takahito/hoge-iwasa.takahito",
            "Actions": [
                "quicksight:PassDataSet",
                "quicksight:CreateIngestion",
                "quicksight:DeleteRefreshSchedule",
                "quicksight:UpdateRefreshSchedule",
                "quicksight:UpdateDataSet",
                "quicksight:DeleteDataSetRefreshProperties",
                "quicksight:CreateRefreshSchedule",
                "quicksight:DescribeDataSetPermissions",
                "quicksight:ListIngestions",
                "quicksight:UpdateDataSetPermissions",
                "quicksight:DescribeIngestion",
                "quicksight:PutDataSetRefreshProperties",
                "quicksight:DeleteDataSet",
                "quicksight:DescribeDataSet",
                "quicksight:CancelIngestion",
                "quicksight:DescribeRefreshSchedule",
                "quicksight:ListRefreshSchedules",
                "quicksight:DescribeDataSetRefreshProperties"
            ]
        }
    ],
    "DataSetUsageConfiguration": {
        "DisableUseAsDirectQuerySource": false,
        "DisableUseAsImportedSource": false
    }
}

コマンド(API)を実行してみます。

% aws-v1 quicksight create-data-set --cli-input-json file://create-data-set.json
{
    "Status": 201,
    "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/hoge0425dataset1111111",
    "DataSetId": "hoge0425dataset1111111",
    "IngestionArn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/hoge0425dataset1111111/ingestion/5c4d4fa2-6595-47a1-ad41-1252d6ae2d7a",
    "IngestionId": "5c4d4fa2-6595-47a1-ad41-1252d6ae2d7a",
    "RequestId": "5002c2f6-588f-4acb-a8a3-c5b7b13970a0"
}

エラーなく成功しました。

コンソールからデータセットを確認してみると、データセットが作成されていることがわかります。

また、データセット編集画面などを確認してみると、期待したとおり既存のデータセット同士で結合したデータセット構成となっていることが確認出来るはずです。

さいごに

本日は Amazon QuickSight で既存の複数データセットを結合したデータセットを API から作成してみました。

あまり一からデータセットを API で構築する機会は無いと思いますが(私も初めて質問されました)、PhysicalTableMapLogicalTableMapは混乱しやすいので、今回使ったようなコンソールから定義を取得して確認する方法だけでも覚えておくと良いと思います。