世界を動かす技術を、日本語で。

DuckDB ダックレイク

2026年10月8日原文(github.com)

概要

  • DuckLake は SQL と Parquet を基盤としたオープンなLakehouseフォーマット
  • DuckDB 拡張機能として DuckLake を直接読み書き可能
  • メタデータ はカタログDB、 データ はParquetファイルに保存
  • インストール・利用方法や スキーマ進化/タイムトラベル 等の主要機能
  • ビルド/テスト/コントリビューション 手順も網羅

DuckLake概要と特徴

  • DuckLake :SQLとParquetを基盤とした オープンLakehouseフォーマット
  • メタデータ :カタログデータベースに格納
  • データ :Parquetファイルとして保存
  • DuckDB拡張機能 :DuckLakeのデータを直接読み書き可能
  • 詳細は DuckLake公式ウェブサイト 参照

インストール方法

  • DuckLake拡張機能のインストールコマンド
    • INSTALL ducklake;
  • 最新開発版のインストールコマンド
    • FORCE INSTALL ducklake FROM core_nightly;

基本的な利用方法

  • DuckLakeデータベース のアタッチ
    • ATTACH 'ducklake:metadata.ducklake' AS my_ducklake (DATA_PATH 'file_path/');
  • データベースの利用開始
    • USE my_ducklake;
  • テーブル作成
    • CREATE TABLE my_ducklake.my_table(id INTEGER, val VARCHAR);
  • データ挿入
    • INSERT INTO my_ducklake.my_table VALUES (1, 'Hello'), (2, 'World');
  • データ参照
    • FROM my_ducklake.my_table;

データ更新・参照

  • UPDATE文 によるデータ更新
    • UPDATE my_ducklake.my_table SET val='DuckLake' WHERE id=2;
  • 結果確認
    • FROM my_ducklake.my_table;

タイムトラベル機能

  • バージョン指定 で過去状態を参照
    • FROM my_ducklake.my_table AT (VERSION => 2);

スキーマ進化

  • ALTER TABLE によるカラム追加
    • ALTER TABLE my_ducklake.my_table ADD COLUMN new_column VARCHAR;
  • NULL値 で新カラムが初期化

変更データフィード(Change Data Feed)

  • 変更履歴の取得
    • FROM my_ducklake.table_changes('my_table', 2, 2);
  • スナップショットID、 変更種別、 レコード内容 の確認

詳細ガイド

  • さらなる詳細は Usage guide 参照

拡張機能のビルド・ロード

  • サブモジュール初期化
    • git submodule init
    • git submodule update --recursive
  • ビルド(マルチコア対応)
    • make GEN=ninja release
  • DuckDBバージョン管理
    • サブモジュールは .github/duckdb-version に連動
  • 最新ブランチへの移動(ビルド失敗の可能性あり)
    • make pull
  • シェル起動
    • ./build/release/duckdb

コントリビューションガイド

  • 外部コントリビューション 歓迎
  • mainブランチ が開発の中心
  • すべてのプルリクはmain対象

テスト実行方法

  • すべてのDuckLake拡張テスト
    • ./build/release/test/unittest
  • 単一テストファイル
    • ./build/release/test/unittest test/sql/transaction/create_conflict.test
  • パターン一致テスト
    • ./build/release/test/unittest "test/sql/partitioning/*"
  • DuckLakeをストレージバックエンドとしたDuckDBコアテスト
    • ./build/release/test/unittest --test-config test/configs/attach_ducklake.json --test-dir duckdb
  • PostgreSQLカタログDB利用テスト(要PostgreSQL起動)
    • ./build/release/test/unittest --test-config test/configs/postgres.json
  • SQLiteカタログDB利用テスト
    • ./build/release/test/unittest --test-config test/configs/sqlite.json
  • デリーションベクター有効テスト
    • ./build/release/test/unittest --test-config test/configs/deletion_vectors.json

Hackerたちの意見

でも「Duckpond」はそこにあったんだよね!

└

別の人生であればね。

MotherduckがO'reillyの「DuckLake: The Definitive Guide」の無料コピーをDuckLakeのウェブページで提供してるよ。 https://motherduck.com/product/ducklake/

└

いいね、ありがとう!

└

どういうこと?メールアドレスを入力したら、本の代わりにウェルカムメールが届いたんだけど。

DuckDBは1990年代以来、世界が得た最高のものだね。 https://duckdb.org/2025/05/19/the-lost-decade-of-small-data....

└

SQLiteを忘れてるけど、そうだね。

あんまり知られてないと思うけど、Ducklakeはduckdbを必要としないんだ。単にduckdbで動く(良い)データレイクの仕様なんだよね。面白い代替のrust/datafusionエコシステムの取り組みが進行中で、https://github.com/datafusion-contrib/datafusion-ducklake、Quackプロトコルもたくさんの面白い可能性を開いてると思う。Ducklakeで何をするかアイデアが必要なら、エージェントのトレースを全部ぶち込むのをおすすめするよ。

└

ありがとう!ちょっと背景を説明すると、以前は特定のユースケースに最適化したカスタムカタログを作ってたんだけど、維持が大変で、要件が変わると特に面倒だったんだ。それに、Apache Icebergはうちの低レイテンシーの作業には重すぎた。Ducklakeはまだ仕様段階だから、datafusion-ducklakeを実装したら、今まで作ったカスタムカタログと同じくらいのパフォーマンスが出たよ。カタログストアにはPostgresを使ってて、これ以上シンプルなものはないね。トランザクショナルデータ用のトランザクショナルデータベースだからね。それに、タイムトラベルやスナップショットみたいな複雑な部分を実装するための明確な仕様もあるし、本当に助かってる。貢献者を歓迎するし、どんどん参加してほしいな!

└

そうなんだ!カタログはduckdbのファイルだと思ってた。例えば、データはパーティション化されたparquetファイルに入ってるけど、どのparquetファイルが現在のものか、ソフトデリートされてるかなどはduckdbのデータファイルで管理されてると思ってた。でも、https://ducklake.select/を見たら、カタログはPostgresSQLにあるみたいだから、実際にはducklakeじゃなくてpostgresslakeなんだね。知識が増えた!

なんでグリーンフィールドをC++でプログラムするの?「rustで作られた」っていうのはミームだけど、2026年にはメモリ安全な言語を使わない理由は何?

└

DuckDBは2018年からあるよね。だから、その子供たちはC++を使ってるんだ。

Hacker Newsで議論の続きを見る