Skip to content

Instantly share code, notes, and snippets.

@Mooan
Created May 8, 2025 15:51
Show Gist options
  • Select an option

  • Save Mooan/771df6fc90764a1920fe21852eeb5884 to your computer and use it in GitHub Desktop.

Select an option

Save Mooan/771df6fc90764a1920fe21852eeb5884 to your computer and use it in GitHub Desktop.
JAWS-UG 名古屋 ①「データ利活用研究会」 LT DuckDBをS3 Tablesのクライアントとして動かしてみた
marp theme size paginate
true
gaia
58140
true
<style> @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&family=M+PLUS+1+Code&display=swap'); @import url('./theme.css'); </style>

JAWS-UG 名古屋 ①「データ利活用研究会」 LT

DuckDBをS3 Tablesのクライアントとして動かしてみた

Koji YASUDA
2025年05月08日

アジェンダ

  1. 背景:
    • DuckDBとは?
    • DuckDBS3 Tablesサポートについて
  2. 実験
    • DuckDBS3 Tablesのクライアントとして動かしてみた
  3. まとめ

1.背景 ~ DuckDBとは?

DuckDBとは?

  • データ分析(OLAP)に適した組み込みデータベース

1.背景 ~ DuckDBとは?

DuckDBの位置付けを理解するための2つの分類軸

  • 分類軸① アーキテクチャ
    • 組み込みDB:
      • ホストアプリのプロセスに組み込んで使われる
    • クライアント-サーバー型DB:
      • データベースがプロセスを占有し、アプリから通信を介して使われる

1.背景 ~ DuckDBとは?

DuckDBの位置付けを理解するための2つの分類軸(Cont.d)

  • 分類軸② ワークロード
    • OLAP(OnLine Analytical Processing):
      • データ分析処理。大量データへの複雑な読み取り操作
    • OLTP(OnLine Transaction Processing):
      • 日常的な取引処理。多数の短時間・小規模な読み書き操作

1.背景 ~ DuckDBとは?

縦軸を分類軸①アーキテクチャ、横軸を分類軸② ワークロードで分類すると、DuckDBは以下の位置付けとなる

OLAP OLTP
組み込みDB DuckDB SQLite
クライアント
サーバー型DB
Snowflake, RedShift, Google BigQuery PostgreSQL, MySQL, Aurora

→ DuckDBはデータ量が数百ギガバイトを超えない規模のデータ分析に適用でき、小規模データの処理に適しているとされる


1.背景 ~ DuckDBS3 Tablesサポート

  • マネージドなIcebergサービスとしてS3 Tablesが登場
  • これを受けて、DuckDBにもS3 Tables対応が追加された

1.背景 ~ DuckDBS3 Tablesサポート

  • DuckDBはExtensionにIceberg対応が入っており、その対応の中にS3 Tablesが含まれる
    • Extension: を利用することで、DuckDBにコア機能に含まれない新しい機能を追加することが可能

1.背景 ~ DuckDBS3 Tablesサポート

  • Iceberg拡張: Icebergテーブルへのアクセスを提供
  • HTTPFS拡張: バックエンドとしてS3の汎用バケット上のIcebergにアクセスできる模様(動作未確認)
  • Amazon S3 Tables拡張: S3 TablesIceberg REST catalogのエンドポイント利用
  • Amazon SageMaker Lakehouse (AWS Glue)拡張:  SageMaker LakehouseIceberg REST catalogのエンドポイント利用

1.背景 ~ DuckDBS3 Tablesサポート


2. 実験

DuckDBS3 Tablesのクライアントとして動かしてみた

発表者は、SageMakerに詳しくないので、S3 TablesIceberg REST catalogのエンドポイント利用する方式で実験していきます。

(注): クリーンなアカウントでの動作確認はしていないため、環境によっては追加の設定が必要となる場合があります。


2. 実験

実験は以下の4ステップで行います。

  1. S3 Tablesの準備
  2. Athenaでテーブルを作成
  3. DuckDBCloudShell環境にインストール
  4. DuckDBからSQLクエリを発行

1. S3 Tablesの準備

# S3 Tables Bucketの作成
~ $ aws s3tables create-table-bucket --name test-table
{
    "arn": "arn:aws:s3tables:ap-northeast-1:123456789:bucket/test-table"
}

1. S3 Tablesの準備

# Namespaceの作成
# S3_TABLE_ARNは作成したS3 Table BucketのARN
~ $ aws s3tables create-namespace \
> --table-bucket-arn $S3_TABLE_ARN \
> --namespace "test_namespace"
{
    "tableBucketARN": "arn:aws:s3tables:ap-northeast-1:123456789:bucket/test-table",
    "namespace": [
        "test_namespace"
    ]
}

2. Athenaでテーブルを作成

CLIから実行しようと思ったが、できなかったのでマネコンから操作
先ほど作成したテーブルを選択し、「Athenaでテーブルを作成」

width:960


2. Athenaでテーブルを作成

Athenaに画面遷移後、SQLクエリがセットされている。そのまま実行 (途中の選択肢では、先ほど作成した名前空間を指定する。)

width:960


3.DuckDBCloudShell環境にインストール

# CloudShellでDuckDBのインストール
~ $ curl https://install.duckdb.org | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3268  100  3268    0     0   8541      0 --:--:-- --:--:-- --:--:--  8554

*** DuckDB Linux/MacOS installation script, version 1.2.2 ***


         .;odxdl,            
       .xXXXXXXXXKc          
       0XXXXXXXXXXXd  cooo:  
      ,XXXXXXXXXXXXK  OXXXXd 
       0XXXXXXXXXXXo  cooo:  
       .xXXXXXXXXKc          
         .;odxdl,  


Destination binary /home/cloudshell-user/.duckdb/cli/1.2.2/duckdb already exists

Hint: Append the following line to your shell profile:
export PATH='/home/cloudshell-user/.duckdb/cli/latest':$PATH


To launch DuckDB now, type
/home/cloudshell-user/.duckdb/cli/latest/duckdb

4. DuckDBからSQLクエリを発行

# **DuckDB**の起動
~ $ /home/cloudshell-user/.duckdb/cli/latest/duckdb
v1.2.2 7c039464e4
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D 

4. DuckDBからSQLクエリを発行

## Iceberg拡張機能をインストール
D FORCE INSTALL iceberg FROM core_nightly;
100% ▕████████████████████████████████████████████████████████████▏

4. DuckDBからSQLクエリを発行

## AWSとの認証設定
D CREATE SECRET (
      TYPE S3,
      PROVIDER credential_chain
    );
┌─────────┐
│ Success │
│ boolean │
├─────────┤
│ true    │
└─────────┘

4. DuckDBからSQLクエリを発行

## S3 Tablesに接続
D ATTACH 'arn:aws:s3tables:ap-northeast-1:123456789:bucket/test-table'
        AS s3_tables_db (
            TYPE iceberg,
            ENDPOINT_TYPE s3_tables
        );
## 全てのテーブルを表示
D SHOW ALL TABLES;
┌──────────────┬────────────────┬─────────────┬──────────────┬──────────────┬───────────┐
│   database   │     schema     │    name     │ column_names │ column_types │ temporary │
│   varchar    │    varchar     │   varchar   │  varchar[]   │  varchar[]   │  boolean  │
├──────────────┼────────────────┼─────────────┼──────────────┼──────────────┼───────────┤
│ s3_tables_db │ test_namespace │ daily_sales │ [__]         │ [INTEGER]    │ false     │
└──────────────┴────────────────┴─────────────┴──────────────┴──────────────┴───────────┘

DuckDBのSQLクエリから、Athenaで作成したテーブルが確認できた


4. DuckDBからSQLクエリを発行

## daily_salesテーブル
D FROM s3_tables_db.test_namespace.daily_sales;
┌───────────┬──────────────────┬──────────────┐
│ sale_date │ product_category │ sales_amount │
│   date    │     varchar      │    double    │
├───────────┴──────────────────┴──────────────┤
│                   0 rows                    │
└─────────────────────────────────────────────┘

4. DuckDBからSQLクエリを発行

## テーブルの新規作成
D CREATE TABLE s3_tables_db.space.t1 (id INTEGER);
Not implemented Error:
Create Table

Iceberg Extensionによると、2025/5/8時点では、書き込みは制限事項 -> 残念 https://duckdb.org/docs/stable/extensions/iceberg/overview#limitations


3. まとめ

  • DuckDBの位置付けをざっくりと説明した
  • DuckDBをS3 Tablesのクライアントとしての使用方法を紹介した
  • その中から一つの方法を選び、実際に動作を確認した
    • DuckDBでは書き込みは2025年5月時点では非サポートであることがわかった

ご清聴ありがとうございました

参考文献

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment