
DuckDBでCloudShellやローカルPCからIceberg tableへSelectしてみた
はじめに
データ事業本部ビッグデータチームのkasamaです。
今回はS3のIceberg tableに対して、CloudShellやローカルPC上からアクセスしたいと思います。
テストデータ準備
LOCATIONのS3 Bucketは手動で用意したものを設定します。テストデータもSQL文でInsertし、準備は完了です。
CREATE DATABASE cm_kasama_merge_test;
CREATE TABLE merge_test_table (
id INT,
name STRING,
value INT
)
LOCATION 's3://<your_s3_bucket>/merge_test_table/'
TBLPROPERTIES (
'table_type'='iceberg',
'write_compression' = 'zstd',
'format'='PARQUET'
);
-- 初期データを挿入
INSERT INTO merge_test_table VALUES
(1, 'A', 100),
(2, 'B', 200),
(3, 'C', 300);
-- 初期状態確認
SELECT * FROM merge_test_table ORDER BY id;
検証
CloudShell上でアクセス
まずはCloudshell上でDuckDBをinstallし、duckdbのセッションに入ります。CloudShellへはS3のアクセスができるRoleで接続しています。
curl https://install.duckdb.org | sh
duckdb
次にIcebergのExtensionでアクセスするためのExtensionをinstallし、Glueとのコネクションを作成します。
CREATE SECRET(
TYPE S3,
PROVIDER CREDENTIAL_CHAIN
);
INSTALL iceberg;
LOAD iceberg;
-- アカウントIDを指定してGlue Catalogに接続
ATTACH '<AWS_ACCOUNT_ID>' AS glue_catalog (
TYPE iceberg,
ENDPOINT_TYPE 'glue'
);
SELECT * FROM glue_catalog.cm_kasama_merge_test.merge_test_table;
データを挿入してみて最新データが取れているか確認します。
INSERT INTO merge_test_table VALUES
(4, 'D', 400),
(5, 'E', 500),
(6, 'F', 600);
データをInsertし、再度実行しましたが結果は変わりませんでした。
現時点では以下に記載のある通り、一度DETACHして再度ATTACHが必要なようです。
The catalog is not refreshed automatically. To update the list of table in the catalog, DETACH from the catalog and ATTACH again.
-- カタログから切断
DETACH glue_catalog;
-- 再度接続
ATTACH '<AWS_ACCOUNT_ID>' AS glue_catalog (
TYPE iceberg,
ENDPOINT_TYPE 'glue'
);
-- 最新データを確認
SELECT * FROM glue_catalog.cm_kasama_merge_test.merge_test_table;
確かにDETACHして再接続したら更新されました。
ローカルPCからのアクセス
ローカルPCからのアクセスもS3への認証情報以外は設定は同じです。
S3への設定方法は以下のブログを参考にさせていただきました。
私の環境では、IAM RoleでスイッチしてS3のあるAWSアカウントに接続しているため、その方法で試します。
前提としてDuckDBやAWS CLIコマンドの設定が完了していることとします。
まず以下のコマンドでAccessKeyId
, SecretAccessKey
, SessionToken
を取得します。
aws configure export-credentials --profile <your-profile>
次にDuckDB Local UIを立ち上げます。
duckdb --ui
立ち上がったらセル上で、以下のコマンドを実行します。
CREATE SECRET secret_c (
TYPE s3,
PROVIDER credential_chain,
CHAIN 'sts',
KEY_ID '<取得したAccessKeyId>',
SECRET '<取得したSecretAccessKey>',
SESSION_TOKEN '<取得したSessionToken>'
);
INSTALL iceberg;
LOAD iceberg;
ATTACH '<AWS_ACCOUNT_ID>' AS glue_catalog (
TYPE iceberg,
ENDPOINT_TYPE 'glue'
);
DuckDBではFromを最初に記述できますので、その記述で実行してみます。
FROM glue_catalog.cm_kasama_merge_test.merge_test_table select id, name, value order by id asc;
最後に
DuckDB UIでIceberg tableを触れることで、Instant SQLを使えたり分かり易いUIで分析ができるのでとても良いと思いました。認証がもう少し簡易的になったら良いですね。