Upgrade to Pro — share decks privately, control downloads, hide ads and more …

15分で学ぶDuckDBの可愛い使い方 DuckDBの最近の更新

notrogue
February 28, 2025

15分で学ぶDuckDBの可愛い使い方 DuckDBの最近の更新

notrogue

February 28, 2025
Tweet

Other Decks in Programming

Transcript

  1. 3 © Techtouch, Inc. 自己紹介 • 木村誠(Zennとかでは@not_rogue) • Zennで最初にDuckDBの記事書いたよ ◦

    🦆🦆🦆🦆🦆🦆DuckDB入門🦆🦆🦆🦆🦆🦆 ◦ 日本語で紹介したのは多分最初の方 ◦ (公平性のため:日本語でもR/Arrow界隈の人で紹介してた方はいます)
  2. 5 © Techtouch, Inc. 自己紹介 • 木村誠(Zennとかでは@not_rogue) • Zennで最初にDuckDBの記事書いたよ ◦

    🦆🦆🦆🦆🦆🦆DuckDB入門🦆🦆🦆🦆🦆🦆 ◦ 日本語で紹介したのは多分最初の方 ▪ (公平性のため:日本語でもR/Arrow界隈の人で紹介してた方はいます) • ちょっと前に会社のブログでも書いたよ ◦ DuckDBでお手軽!データフェデレーション ◦ jq的に使うのも便利だよというお話 • DuckDBは主にファイルビュアー的に使ってるよ ◦ S3にあるJSON眺めたり、ExcelとCSVを比較したり
  3. 10 © Techtouch, Inc. 15秒でわかるDuckDB • OLAP特化のSQLite的なデータベースだよ ◦ OLAP特化=データ量が多いテーブルに(比較的)即時性はいらない・多くないクエリを実行 •

    便利なSQL構文があったり、(ある程度)大きなデータもローカルで処理できるよ • 詳しくは↓の記事とか見てね ◦ 🦆🦆🦆🦆🦆🦆DuckDB入門🦆🦆🦆🦆🦆🦆 ◦ DuckDB雑紹介(1.1対応版)@DuckDB座談会 by ktz-saz
  4. 12 © Techtouch, Inc. DuckDB 最近の更新: 目的 • 最近のDuckDB関連の(面白と思った)話題をお話 •

    お話すること ◦ (DuckDB本体以外の)エコシステム/コミュニティ関係のアップデート ◦ 最近のリリース ◦ 拡張 • 提供したい情報 ◦ あまりDuckDB知らない方 => ▪ DuckDBが最近注力してる(であろう)ことから、DuckDB利用のイメージをつかんでいただく ◦ DuckDB知ってる方 => ▪ どれか一つくらい知らない便利情報共有できると嬉しいな • お話しないこと ◦ 個々の話題の深掘り
  5. 14 © Techtouch, Inc. DuckDBコミュニティまわりの最近の話題:メディア/イベント • DuckCon ◦ 2022年から半年に一回くらい開催されてる(#1〜#6)、名前の通りDuckDBのConference ◦

    よくあるトピック(YouTubeに動画アップされます) ▪ DuckDB Labsの人による最近の振り返り&今後の予定 ▪ 利用ユーザーの事例紹介 ▪ ライブラリ・エコシステム(dbtとか)の紹介 ▪ 内部実装の話 • 本が三冊出版 ◦ DuckDB Up and Runing(2024) ◦ DuckDB in Action(2024) ◦ Getting Started with DuckDB(2024) • 日本国内 ◦ 企業のテックブログに限っても多分10〜20社くらいは書かれてそう ◦ Zennでは72記事、Qiitaでは50記事 ▪ なんとなくGIS・WASM・AWSのログ閲覧の記事が人気な雰囲気
  6. 17 © Techtouch, Inc. DuckDBコミュニティまわりの最近の話題:Survey • 2024後半にコミュニティでアンケートが行われてました(n>500) ◦ by DuckDB

    Labs(contributorが何人かいたりサポート提供してる企業) • ユーザーの利用イメージを特に掴めそうな箇所をいくつか抜粋 質問 回答 所感 動かしている環境 Laptop 87%, Server 58% データフォーマット Parquet 79%, CSV 73% JSON 42%, NDJSON(JSONL)11% NDJSON(JSONL)が意外と少ない データセットサイズ 1GB以下 12% 1~10GB 30% 10-100GB 31% 100GB-1TB 20% 数100MB~数GBかな?と思ってたので意外と多い。 (1TB規模は別々の処理の合計を答えた回答かも?) クライアント Python 73% Command Line 47% R/WASM/Java/Node.jsが10% 程度
  7. 18 © Techtouch, Inc. DuckDB 最近の更新: エコシステム:ユースケース 名前 ソース 概要

    okta DataCouncil(ブログ) データパイプラインの一部を lambda上のDuckDBで実行 (特にSnowflakeだとtoo muchなサイズのデータ) dozzle ソースコード DockerコンテナのログをWebブラウザで閲覧できるようにするツール。 DuckDB(WASM)でログ(JSON)に対しSQLを実行できるようにしてます。 watershed DuckCon#3 GXのSaas GCSにあるParquetデータを集計(テナントあたり数百MB)。 元々PostgreSQLから以降してコスト削減 airbnb Medium メトリクスの集計 Rill ドキュメント データソース(S3とかSnowflake)からデータを取り込む、OLAP Engineとして利用(他にApache Druid/Apache Pinot/Clickhouse) (接続先のDBとしてもあり) 時雨堂 Zenn DuckDB(WASM)を使ったダッシュボード Newmo テックブログ GIS情報(GeoJSON)のブラウザでの編集(DuckDB(WASM)) IVRy テックブログ S3のファイルビュアーとして(この用途では他にもたくさん事例がありそう)
  8. 21 © Techtouch, Inc. DuckDB 最近の更新: 最近のリリース • リリース状況 ◦

    https://duckdb.org/docs/dev/release_calendar.html ◦ 2025/02時点最新は1.2 ▪ 1.3は5月予定 ◦ 大体半年に一回くらいのリリースされます • リリースブログでよく取り上げられる話題: ◦ SQL構文の拡張/利便性の改善 ◦ パフォーマンス改善 ◦ 読み込み対象の拡充 ◦ 安定性改善 • それぞれの話題から、(僕が好きな)DuckDB-ishな機能をいくつかご紹介します ◦ DuckDBが力を入れてる箇所・人気の理由をご紹介 余談:リリースにはアヒルの学術名が付けられ、専用のアイコンも付与されます
  9. 22 © Techtouch, Inc. DuckDB 最近の更新: 最近のリリース:SQL構文の拡張/利便性の改善: positional join •

    DuckDBが実装してるJOINいろいろ Ver JOIN 補足 outer join/inner join よく見るJOIN cross product join natural join inner join + usingのシンタックスシュガー? 0.8 semi join in + サブクエリのシンタックスシュガー? 0.8 anti join not in + サブクエリのシンタックスシュガー? 0.8 asof join 条件を満たすレコードのうち特に近いもので JOIN lateral join 0.7 positional join 後述
  10. 23 © Techtouch, Inc. DuckDB 最近の更新: 最近のリリース:SQL構文の拡張/利便性の改善: positional join •

    名前の通り、並び順でJOINする機能 例 a1,a2,a3,b1,b2 apple, alpine, amsterdam, brunei, bangladesh atmark, ,arigato, beijing, brussel example1.csv line_number, content 1, aiu 2, kakiku 3, sasisu example2.csv D select * from './example1.csv' positional join read_csv('./example2.csv'); ┌─────────┬─────────┬────────────┬──────────┬─────────────┬──────── ───── │ a1 │ a2 │ a3 │ b1 │ b2 │ line_number │ content │ │ varchar │ varchar │ varchar │ varchar │ varchar │ int64 │ varchar │ ├─────────┼─────────┼────────────┼──────────┼─────────────┼──────── ───── │ apple │ alpine │ amsterdam │ brunei │ bangladesh │ 1 │ aiu │ │ atmark │ │ arigato │ beijing │ brussel │ 2 │ kakiku │ │ NULL │ NULL │ NULL │ NULL │ NULL │ 3 │ sasisu │ query結果
  11. 24 © Techtouch, Inc. DuckDB 最近の更新: 最近のリリース: SQL構文の拡張/利便性の改善: positional join

    • 名前の通り、並び順でJOINする機能 • どんな時に嬉しい? ◦ pandas(concat)や、Linuxのpasteと同じ働き ◦ それらと同じく下のような場合に便利 ▪ 複数のファイルが行番号(でのみ)対応するような場合 ▪ 連番とかIDとか各行につける • (order by以外では)並び順を無視するのが主流[要出典]なSQL/RDBの世界では、珍しい機能で pandasやonelinerの代替としての立場もあるDuckDBっぽい機能 ◦ (余談)ClickHouseにはpaste joinという似た機能があります • (補足)並び順とはなんぞや ◦ 単一ファイル読み込み(read_json/read_csv/read_parquet)ではファイル内の順番が(原則)保存 ◦ 保証される・されない場合は -> https://duckdb.org/docs/sql/dialect/order_preservation.html
  12. 25 © Techtouch, Inc. DuckDB 最近の更新: 最近のリリース:SQL構文の拡張/利便性の改善: カラム選択系 • カラム選択を便利にする機能が色々あります

    • ”Friendlier SQL”を紹介してる記事があるので、そちらもご参照ください ◦ https://duckdb.org/docs/sql/dialect/friendly_sql.html ◦ https://duckdb.org/2022/05/04/friendlier-sql.html Ver リリース内容 補足 1.2 RENAME Snowflakeにもあるやつ 1.2 カラムをLIKE SELECT * LIKE ‘val%’みたいなの。COLUMNSのシンタックスシュガー 1.1 * columns構文 PythonとかTypeScriptにあるunpack(spread)と同じ役割 0.6 columns構文 カラムを正規表現(など)で指定。 ちなみにClickHouse由来 前から UNION BY NAME UNION ALLのカラム名での紐付け版。ヘッダーが異なるファイルを読む時 地味に便利 0.6(CSV) 0.9(JSON) union_by_name 複数ファイルを読む時に、各ファイルのカラムの論理和を読み込み結果のカ ラム名とする =ファイル毎にカラム名が違っても大丈夫
  13. 26 © Techtouch, Inc. DuckDB 最近の更新: 最近のリリース: パフォーマンス関係:CSV Readerの改善 •

    CSV関係は、ほぼ毎回リリースブログに載るレベルで重視されてるようです(JSONはあまりない) • 彼らがCSVを重視する理由は、インタビューのPodcastなどで説明 ◦ ユースケースの一つ ◦ データベースで最初の方にやることなので、そこでストレスを生みたくない Ver リリース内容 補足 1.2 new algorithm unlimited row length 新しいアルゴリズムで 15%改善 1.1 parallel union_by_name デフォルトではサンプルしたファイルでカラムを決定しますが、 union_by_name=trueでは複数ファイルのカラムを使います。その高速 化 0.10 CSV Reader Rework むっちゃ早くなったよ!( Parallel State Machine) 0.6 Parallel CSV Loading 複数ファイル読み込みを並列実行
  14. 27 © Techtouch, Inc. DuckDB 最近の更新: 最近のリリース: パフォーマンス関係:CSV Readerの改善 •

    新旧バージョンでの高速化を確認してみる(ダミーデータを使用。正確な測定ではないのはご注意) # read_csvを使ってcountするSQLをファイルに記載 > cat count.sql .timer on select count(1) from read_csv('people-2000000.csv', header=False, columns={'Index': 'VARCHAR', 'User Id': 'VARCHAR', 'First Name': 'VARCHAR', 'Last Name': 'VARCHAR', 'Sex': 'VARCHAR', 'Email': 'VARCHAR', 'Phone': 'VARCHAR', 'Data of birth': 'VARCHAR', 'Job Title': 'VARCHAR'}) > cat count.sql | duckman run v0.5.0 ┌──────────┐ │ count(1) │ ├──────────┤ │ 2000001 │ └──────────┘ Run Time (s): real 0.609 user 0.549122 sys 0.040836 0.5では200万行のカウントに0.6ms程度
  15. 28 © Techtouch, Inc. DuckDB 最近の更新: 最近のリリース: パフォーマンス関係:CSV Readerの改善 •

    新旧バージョンでの高速化を確認してみる(ダミーデータを使用。正確な測定ではないのはご注意) time wc -l people-2000000.csv 2000001 people-2000000.csv ________________________________________________________ Executed in 109.87 millis fish external usr time 85.72 millis 0.56 millis 85.16 millis sys time 22.70 millis 1.27 millis 21.42 millis wc -lでカウントすると110から130ms程度です(ちなみにpandasだと秒のオーダー) (DuckDBはCSVとして扱うために追加の処理を行ってる、時間の計測方法が違うので同条件ではないことは注意) > cat count.sql | duckman run v1.2.0 ┌────────────────┐ │ count(1) │ │ int64 │ ├────────────────┤ │ 2000001 │ │ (2.00 million) │ └────────────────┘ Run Time (s): real 0.112 user 0.582470 sys 0.058470 1.2では200万行のカウントに110ms程度
  16. 29 © Techtouch, Inc. DuckDB 最近の更新: 最近のリリース: パフォーマンス関係:CSV Readerの改善 •

    高速化の方法や歴史については、DuckDBのCSVについて1時間話すセミナーがあります。そちら をご参照してください ◦ DSDSD31st Efficient CSV Parsing - On the Complexity of Simple Thing ▪ (動画 資料) • Parallel-State machine、その他細かいテクニック色々
  17. 30 © Techtouch, Inc. DuckDB 最近の更新: 最近のリリース:読み込み対象の拡充 • 読み書き対象の拡充はリリースに頻出する話題の一つ ◦

    追加されたフォーマットがどこまで何をサポートしてるかはバラバラなので、ご利用前に確認お願いします • (DB内ではない)どこか別のところにあるデータを読むという、DuckDBのユースケース・特徴が見 て取れそう バージョン 追加されたフォーマット 1.1 DeltaLake 0.10 read_text/read_blob 0.9 iceberg 0.6 json それ以前から SQLite/PostgreSQL/Excel/MySQL/Arrow (Community)Extension avro/BigQuery/Protocol Buffers/ODBC/
  18. 31 © Techtouch, Inc. DuckDB 最近の更新: 最近のリリース: 安定性改善:データベースファイルの互換性 • DuckDB自身でデータを持つ(ファイルに保存)こともできます

    • 0.10.0で、DuckDBのデータベースファイルが後方互換性を持つように • 1.0.0のリリースブログ他でも取り上げており、彼ら的には重要と思ってそうなポイント # duckmanは特定のバージョンでDuckDBを実行するラッパーです > duckman run v0.5.0 sample_files_0.5.db -c 'create or replace table t1 as select 1 as c' # 0.6で開こうとするとエラー > duckman run v0.6.0 sample_files_0.5.db -c 'select * from t1' Error: unable to open database "sample_files_0.5.db": IO Error: Trying to read a database file with version number 38, but we can only read version 39. The database file was created with an older version of DuckDB. 0.10.0以前では違うバージョンのDBを開こうとするとエラー > duckman run v0.10.0 sample_files_0.10.db -c 'create or replace table t1 as select 1 as c' > duckman run v1.2.0 sample_files_0.10.db -c 'select * from t1' ┌───────┐ │ c │ │ int32 │ ├───────┤ │ 1 │ └───────┘ 0.10.0以降では後方互換性がある(1.2で0.10のデータベースが読めてる)
  19. 32 © Techtouch, Inc. DuckDB 最近の更新: 最近のリリース:安定性改善:サポート • サポートポリシーの明確化と、エンタープライズサポートの公開 •

    サポートポリシー ◦ マイナーなプラットフォームとか回答の約束は出来ないといったお話 • エンタープライズサポート ◦ DuckDB Labs(DuckDBの創始者が所属してる組織)がサポートしてくれる ◦ 「Negotiable support volume」なので実際どこまでサポートしてくれるかは相談してみてください
  20. 35 © Techtouch, Inc. DuckDB 最近の更新: 拡張 • ExtensionでDuckDBの機能を拡張することができます •

    最近の動き色々としては、DuckDBコントリビューター以外もやすいようにしたいぽい? ◦ use DuckDB as a platform to build their own stuff to build extensions on, and where DuckDB kind of becomes this fabric of efficient operators and efficient data representations, all that stuff, that you can glue various extensions together. And it's all accessible from sort of a unified interface look like SQL. バージョン リリース内容 補足 1.2 C API Cでも作れるようにすることで(元々は C++)、他の言語にも対 応しやすくなったり、バージョンあげやすくなるらしい 1.1 Community Extension DuckDB Labs以外の人が拡張を頒布するリポジトリ 1.1 query/query_table 参照するテーブルを動的に変えられる (pivotのような汎用的なSQLマクロを作れるように) 0.9 DuckDB-wasm対応(一部) バージョン外 extension-template 拡張作るためのテンプレート( C++)
  21. 36 © Techtouch, Inc. DuckDB 最近の更新: 拡張 • ExtensionでDuckDBの機能を拡張することができます •

    おもしろそうと思った拡張を適当に紹介 ◦ Community Extension/Experimentalも含むので自己責任で 名前 機能 shellfs コマンド(lsとか)の実行結果を読み書き gsheets Google Spreadsheetにアクセス duckpgq PGQ(SQL:2023のグラフクエリ拡張)の対応 mysql/postgres DuckDBからPostgreSQL/MySQLにクエリ
  22. 37 © Techtouch, Inc. DuckDB 最近の更新: 拡張 • lsのコマンド結果をwhereで絞り込んでいる例 ◦

    逆方向(SQL結果をパイプ経由でコマンドに)もできます # read_csvの引数がコマンド。一行目がカラム名になるのでechoをくっつけてます D select * from read_csv('echo file_name; ls |') where file_name like '%.csv'; ┌────────────────────┐ │ file_name │ │ varchar │ ├────────────────────┤ │ people-100.csv │ │ people-1000.csv │ │ people-10000.csv │ │ people-100000.csv │ │ people-1000000.csv │ │ people-2000000.csv │ │ people-500000.csv │ └────────────────────┘
  23. 39 © Techtouch, Inc. まとめ • DuckDBの最近のアップデートを見ていきました ◦ コミュニティ・エコシステム ◦

    SQL構文の拡張/利便性の改善 ◦ パフォーマンス改善 ◦ 読み込み対象の拡充 ◦ 安定性改善 • ご紹介したリリースから、DuckDBが「便利に」「早く」「より安定して」「色々なデータを閲覧しやす い」ことを重視したデータベースであることを、感じていただければ幸いです