DuckDBでCloudShellやローカルPCからIceberg tableへSelectしてみた

DuckDBでCloudShellやローカルPCからIceberg tableへSelectしてみた

Clock Icon2025.05.24

はじめに

データ事業本部ビッグデータチームの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'
  );

https://duckdb.org/docs/stable/core_extensions/iceberg/amazon_sagemaker_lakehouse.html

SELECT * FROM glue_catalog.cm_kasama_merge_test.merge_test_table;

Screenshot 2025-05-24 at 12.32.59

データを挿入してみて最新データが取れているか確認します。

INSERT INTO merge_test_table VALUES
(4, 'D', 400),
(5, 'E', 500),
(6, 'F', 600);

データをInsertし、再度実行しましたが結果は変わりませんでした。

Screenshot 2025-05-24 at 12.48.21

現時点では以下に記載のある通り、一度DETACHして再度ATTACHが必要なようです。

The catalog is not refreshed automatically. To update the list of table in the catalog, DETACH from the catalog and ATTACH again.

https://duckdb.org/docs/stable/core_extensions/iceberg/troubleshooting

-- カタログから切断
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して再接続したら更新されました。
Screenshot 2025-05-24 at 12.51.58

ローカルPCからのアクセス

ローカルPCからのアクセスもS3への認証情報以外は設定は同じです。
S3への設定方法は以下のブログを参考にさせていただきました。
私の環境では、IAM RoleでスイッチしてS3のあるAWSアカウントに接続しているため、その方法で試します。
前提としてDuckDBやAWS CLIコマンドの設定が完了していることとします。
https://dev.classmethod.jp/articles/duckdb-s3-authentication-methods/

まず以下のコマンドで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'
);

Screenshot 2025-05-24 at 13.07.02

DuckDBではFromを最初に記述できますので、その記述で実行してみます。
https://duckdb.org/docs/stable/sql/query_syntax/from.html

FROM glue_catalog.cm_kasama_merge_test.merge_test_table select id, name, value order by id asc;

Screenshot 2025-05-24 at 13.13.46

最後に

DuckDB UIでIceberg tableを触れることで、Instant SQLを使えたり分かり易いUIで分析ができるのでとても良いと思いました。認証がもう少し簡易的になったら良いですね。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.