Skip to content

Instantly share code, notes, and snippets.

@voluntas
Last active May 14, 2025 06:14
Show Gist options
  • Select an option

  • Save voluntas/0c221f0b294f96e4ef567ed166f45821 to your computer and use it in GitHub Desktop.

Select an option

Save voluntas/0c221f0b294f96e4ef567ed166f45821 to your computer and use it in GitHub Desktop.

Revisions

  1. voluntas revised this gist Jan 24, 2025. 1 changed file with 4 additions and 0 deletions.
    4 changes: 4 additions & 0 deletions duckdb_202501.md
    Original file line number Diff line number Diff line change
    @@ -164,6 +164,10 @@ Parquet ファイルがあまりにも便利すぎるので、クライアント

    ## DuckDB-Wasm とブラウザエディター

    CodeMirror と組み合わせて使っています。

    [DuckDB\-Wasm \+ Parquet \+ S3\-compatible object storage \+ OPFS](https://voluntas.github.io/duckdb-wasm-parquet/)

    ## DuckDB LSP

    現在DuckDB 向けの LSP を Rust で開発中です。
  2. voluntas revised this gist Jan 24, 2025. 1 changed file with 15 additions and 4 deletions.
    19 changes: 15 additions & 4 deletions duckdb_202501.md
    Original file line number Diff line number Diff line change
    @@ -1,17 +1,21 @@
    # DuckDB 座談会 v2025.1 発表者向け資料

    **書きかけです**

    これは[DuckDB 座談会 \(2025\-01\)](https://gist.github.com/voluntas/749d55ed0c558b82855d0046e61204ee) の発表者向けの資料です。

    - 著者: @voluntas
    - 著者: [@voluntas](http://x.com/voluntas)

    ## DuckDB とは

    こちらの資料がとてもお勧めです。

    [DuckDB雑紹介\(1\.1対応版\)@DuckDB座談会 \- Speaker Deck](https://speakerdeck.com/ktz/duckdbza-shao-jie-1-dot-1dui-ying-ban-at-duckdbzuo-tan-hui)

    ### DuckDB 関連のニュース

    - [Release Calendar – DuckDB](https://duckdb.org/docs/dev/release_calendar.html)
    - DuckDB 1.2 は 2025-01-27
    - [DuckDB Node Neo Client – DuckDB](https://duckdb.org/2024/12/18/duckdb-node-neo-client.html)

    ## 注意

    S3 という呼び方は S3 互換オブジェクトストレージも含んだ総称として利用しています。
    @@ -24,8 +28,11 @@ S3 という呼び方は S3 互換オブジェクトストレージも含んだ
    - DuckDB-Wasm と OPFS
    - DuckDB と PostgreSQL
    - DuckDB と Parquet
    - Parquet 2.x
    - DuckDB と Parquet Encryption
    - DuckDB-Wasm とブラウザエディター
    - duckdb_lsp
    - DuckDB を利用した完全性の確認

    ## DuckDB と S3

    @@ -75,6 +82,8 @@ DuckDB-Wasm で s3:// を使うよりは、普通に fetch で取得してきて

    OPFS に Parquet ファイルを置いていたのも不要になり、管理もとても楽になります。

    npm の duckdb-wasm で next で既に利用できます。

    - [DuckDB\-Wasm \(OPFS\) メモ](https://zenn.dev/voluntas/scraps/08e6065facbefd)
    - [DuckDB\-Wasm \+ Parquet \+ S3\-compatible object storage \+ OPFS](https://voluntas.github.io/duckdb-wasm-parquet/)

    @@ -153,6 +162,8 @@ Parquet ファイルがあまりにも便利すぎるので、クライアント
    - [Parquet Encryption – DuckDB](https://duckdb.org/docs/data/parquet/encryption.html)
    - [Parquet Modular Encryption \| Parquet](https://parquet.apache.org/docs/file-format/data-pages/encryption/)

    ## DuckDB-Wasm とブラウザエディター

    ## DuckDB LSP

    現在DuckDB 向けの LSP を Rust で開発中です。
    @@ -166,7 +177,7 @@ DuckDB をブラウザ (DuckDB-Wasm) や VS Code で利用する際、 DuckDB L
    - [supabase\-community/postgres\_lsp: A Language Server for Postgres](https://github.com/supabase-community/postgres_lsp)
    - [WhatsApp/erlang\-language\-platform: Erlang Language Platform\. LSP server and CLI\.](https://github.com/WhatsApp/erlang-language-platform)

    ## DuckDB を利用した完全性
    ## DuckDB を利用した完全性の確認

    DuckDB で で S3 や PostgreSQL にあるデータの完全性を確認するというブログを読んでこれはかなりいいのでは?と感じました。

  3. voluntas revised this gist Jan 24, 2025. 1 changed file with 76 additions and 2 deletions.
    78 changes: 76 additions & 2 deletions duckdb_202501.md
    Original file line number Diff line number Diff line change
    @@ -59,6 +59,10 @@ HTTP リクエスト経由での DuckDB を実行したい時、Go であれば

    S3 の Presigned URL を利用する事で、ブラウザに安心して S3 の Parquet ファイルをダウンロードできます。

    DuckDB-Wasm で s3:// を使うよりは、普通に fetch で取得してきて、DuckDB-Wasm に読み込ませる方が良いです。コントローラブルでエラーハンドリングがやりやすいです。

    一度永続化したい場合は OPFS に Stream 保存するのが良いと思いますが、 DuckDB OPFS が利用できる今は、そこまでの必要性はないかもしれません。

    ## DuckDB-Wasm と OPFS

    先日 (2025 年 1 月) に DuckDB-Wasm のデータベース保存先を OPFS (Origin Private File System) にできる、Pull-Request がマージされました。
    @@ -77,27 +81,97 @@ OPFS に Parquet ファイルを置いていたのも不要になり、管理も
    ## DuckDB と PostgreSQL

    DuckDB は直接 PostgreSQL からの読み込み/書き込みができる機能が備わっています。

    この機能を利用することで、集計処理を全て DuckDB 側で行う事ができるようになります。

    PostgreSQL のクラスターを普段利用しているのですが、リードレプリカに対して、 DucKDB から PostgreSQL へアクセスをするというのがとても相性が良いことに気付きました。

    バッチ処理系は DuckDB で集計してしまう方向で進めています。

    [DuckDB から直接 PostgreSQL アクセスする](https://zenn.dev/shiguredo/articles/duckdb-postgres-extension)

    ## DuckDB と Parquet

    恥ずかしながら DuckDB を触るまでは [Apache Parquet](https://parquet.apache.org/) の存在を知りませんでした。使ってみると恐ろしく便利な事がわかってきました。

    ファイルがまずデフォルトで圧縮されていること、そして [read_parquet](https://duckdb.org/docs/data/parquet/overview.html#read_parquet-function) でさくっと読み込める。さらには出力も簡単にできる。言うこと無しです。

    DucKDB と DuckDB-Wasm のやりとりも Parquet ファイルを利用しています。また S3 にある JSONL 形式のログファイルを解析したりフィルターした後も Parquet ファイルにして、S3 に置いています。

    Parquet ファイル様々です、あまりにも便利なので DuckDB 以外のところでも利用できないか?という気持ちになってきています。

    DuckDB は Parquet を扱うツールとしてだけみても、かなり便利だと感じています。

    個々まで便利だとローカルで出力した JSONL のログを Parquet にしてから S3 にアップロードするというのもありでは?とおもっています。別に json.gz で保存するのではなく parquet すれば Zstd で圧縮されますし良いことずくめです。

    - [Reading and Writing Parquet Files – DuckDB](https://duckdb.org/docs/data/parquet/overview.html)

    ### Parquet 2.x

    Parquet にバージョンがある事を最近まで知りませんでした。1 系と 2 系があるんですね。

    [Release \| Parquet](https://parquet.apache.org/blog/)

    DuckDB 1.2 では COPY TO で Parquet ファイルを出力するさいに、 Parquet のバージョンが指定できるようになるようです。

    [Query Engines: Gatekeepers of the Parquet File Format – DuckDB](https://duckdb.org/2025/01/22/parquet-encodings.html)

    ```sql
    -- Generate TPC-H scale factor 1
    INSTALL tpch;
    LOAD tpch;
    CALL dbgen(sf = 1);

    -- Export to Parquet using Snappy compression
    COPY lineitem TO 'snappy_v1.parquet'
    (COMPRESSION snappy, PARQUET_VERSION V1); -- 244 MB, ~0.46s
    COPY lineitem TO 'snappy_v2.parquet'
    (COMPRESSION snappy, PARQUET_VERSION V2); -- 170 MB, ~0.39s

    -- Export to Parquet using zstd compression
    COPY lineitem TO 'zstd_v1.parquet'
    (COMPRESSION zstd, PARQUET_VERSION V1); -- 152 MB, ~0.58s
    COPY lineitem TO 'zstd_v2.parquet'
    (COMPRESSION zstd, PARQUET_VERSION V2); -- 135 MB, ~0.44s
    ```

    zstd と parquet v2 恐ろしいほど圧縮されていてビックリです。

    - [Reading and Writing Parquet Files – DuckDB](https://duckdb.org/docs/data/parquet/overview)

    ## Duckdb と Parquet Encryption

    Parquet ファイルがあまりにも便利すぎるので、クライアントにファイルを渡す際、何か署名的なモノができないか?とおもってて調べたりしていました。

    ファイルに署名ができたら、ファイルが改ざんされていないか?ということが確認できるようになります。
    さらには利用社側も「誰が生成したファイルなのか」というのがわかってとても良いなと。

    ただ、残念ながら署名機能は無く、 DuckDB でも Parquet ファイル自体を暗号化するくらいしかないようです。
    暗号化すると、性能は 2.5 倍程度落ちるようです。

    [Parquet Encryption – DuckDB](https://duckdb.org/docs/data/parquet/encryption#performance-implications)

    - [Parquet Encryption – DuckDB](https://duckdb.org/docs/data/parquet/encryption.html)
    - [Parquet Modular Encryption \| Parquet](https://parquet.apache.org/docs/file-format/data-pages/encryption/)

    ## DuckDB LSP

    時雨堂では DuckDB 向けの LSP を Rust で開発中です。
    現在DuckDB 向けの LSP を Rust で開発中です。

    DuckDB をブラウザ (DuckDB-Wasm) や VS Code で利用する際、 DuckDB LSP を利用する事で、コード補完、エラー表示、ホバー表示、シンタックスハイライトなどの機能を利用することができるようにする予定です。

    現在は VS Code でエラー表示までは実現できています。

    現在はクローズドコードですが将来的には Apache-2.0 ライセンスで公開を検討しています。

    - [supabase\-community/postgres\_lsp: A Language Server for Postgres](https://github.com/supabase-community/postgres_lsp)
    - [WhatsApp/erlang\-language\-platform: Erlang Language Platform\. LSP server and CLI\.](https://github.com/WhatsApp/erlang-language-platform)

    ## DuckDB を利用した完全性

    DuckDB で で S3 や PostgreSQL にあるデータの完全性を確認するというブログを読んでこれはかなりいいのでは?と感じました。

    [DuckDB を使ったデータ品質保証の実践 \- Timee Product Team Blog](https://tech.timee.co.jp/)

    分散システムを運用していると、ログが分散します。これらのログが「期待通りに出力されているか」というのを DuckDB を定期的に確認する仕組みを作れるのではないか?と感じました。

    ツール自体は Python で書いて Systemd Timer 辺りで定期実行して問題が起きたら Slack やらなんやらに通知するだけで十分でしょう。
  4. voluntas revised this gist Jan 23, 2025. 1 changed file with 26 additions and 1 deletion.
    27 changes: 26 additions & 1 deletion duckdb_202501.md
    Original file line number Diff line number Diff line change
    @@ -22,7 +22,10 @@ S3 という呼び方は S3 互換オブジェクトストレージも含んだ
    - DuckDB と Go
    - DuckDB-Wasm と S3
    - DuckDB-Wasm と OPFS
    - DuckdB と PostgreSQL
    - DuckDB と PostgreSQL
    - DuckDB と Parquet
    - DuckDB と Parquet Encryption
    - duckdb_lsp

    ## DuckDB と S3

    @@ -76,3 +79,25 @@ OPFS に Parquet ファイルを置いていたのも不要になり、管理も
    DuckDB は直接 PostgreSQL からの読み込み/書き込みができる機能が備わっています。

    この機能を利用することで、集計処理を全て DuckDB 側で行う事ができるようになります。

    [DuckDB から直接 PostgreSQL アクセスする](https://zenn.dev/shiguredo/articles/duckdb-postgres-extension)

    ## DuckDB と Parquet

    - [Reading and Writing Parquet Files – DuckDB](https://duckdb.org/docs/data/parquet/overview)

    ## Duckdb と Parquet Encryption

    - [Parquet Encryption – DuckDB](https://duckdb.org/docs/data/parquet/encryption.html)
    - [Parquet Modular Encryption \| Parquet](https://parquet.apache.org/docs/file-format/data-pages/encryption/)

    ## DuckDB LSP

    時雨堂では DuckDB 向けの LSP を Rust で開発中です。

    DuckDB をブラウザ (DuckDB-Wasm) や VS Code で利用する際、 DuckDB LSP を利用する事で、コード補完、エラー表示、ホバー表示、シンタックスハイライトなどの機能を利用することができるようにする予定です。

    現在はクローズドコードですが将来的には Apache-2.0 ライセンスで公開を検討しています。

    - [supabase\-community/postgres\_lsp: A Language Server for Postgres](https://github.com/supabase-community/postgres_lsp)
    - [WhatsApp/erlang\-language\-platform: Erlang Language Platform\. LSP server and CLI\.](https://github.com/WhatsApp/erlang-language-platform)
  5. voluntas revised this gist Jan 23, 2025. No changes.
  6. voluntas revised this gist Jan 19, 2025. 1 changed file with 8 additions and 0 deletions.
    8 changes: 8 additions & 0 deletions duckdb_202501.md
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,7 @@
    # DuckDB 座談会 v2025.1 発表者向け資料

    **書きかけです**

    これは[DuckDB 座談会 \(2025\-01\)](https://gist.github.com/voluntas/749d55ed0c558b82855d0046e61204ee) の発表者向けの資料です。

    - 著者: @voluntas
    @@ -68,3 +70,9 @@ OPFS に Parquet ファイルを置いていたのも不要になり、管理も

    - [DuckDB\-Wasm \(OPFS\) メモ](https://zenn.dev/voluntas/scraps/08e6065facbefd)
    - [DuckDB\-Wasm \+ Parquet \+ S3\-compatible object storage \+ OPFS](https://voluntas.github.io/duckdb-wasm-parquet/)

    ## DuckDB と PostgreSQL

    DuckDB は直接 PostgreSQL からの読み込み/書き込みができる機能が備わっています。

    この機能を利用することで、集計処理を全て DuckDB 側で行う事ができるようになります。
  7. voluntas revised this gist Jan 19, 2025. 1 changed file with 24 additions and 1 deletion.
    25 changes: 24 additions & 1 deletion duckdb_202501.md
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,14 @@
    # DuckDB 座談会 v2025.1 発表者向け資料

    これは発表者向けの資料です。
    これは[DuckDB 座談会 \(2025\-01\)](https://gist.github.com/voluntas/749d55ed0c558b82855d0046e61204ee) の発表者向けの資料です。

    - 著者: @voluntas

    ## DuckDB とは

    こちらの資料がとてもお勧めです。

    [DuckDB雑紹介\(1\.1対応版\)@DuckDB座談会 \- Speaker Deck](https://speakerdeck.com/ktz/duckdbza-shao-jie-1-dot-1dui-ying-ban-at-duckdbzuo-tan-hui)

    ## 注意

    @@ -45,3 +53,18 @@ HTTP リクエスト経由での DuckDB を実行したい時、Go であれば
    ## DuckDB-Wasm と S3

    S3 の Presigned URL を利用する事で、ブラウザに安心して S3 の Parquet ファイルをダウンロードできます。

    ## DuckDB-Wasm と OPFS

    先日 (2025 年 1 月) に DuckDB-Wasm のデータベース保存先を OPFS (Origin Private File System) にできる、Pull-Request がマージされました。

    [Add OPFS \(Origin Private File System\) Support by e1arikawa · Pull Request \#1856 · duckdb/duckdb\-wasm](https://github.com/duckdb/duckdb-wasm/pull/1856)

    この機能は革命的な機能で、今までは DuckDB-Wasm に書き込みを行ってもブラウザを更新したタイミングで消えてしまうため、Parquet ファイルなどを OPFS に書き込んでおき、それを再度 DuckDB に読み込ませるなどの処理が必要でした。

    しかし、この OPFS の仕組みを利用することで、 DuckDB-Wasm に書き込んだデータをブラウザを更新や終了してもデータが消えることがなくなります。

    OPFS に Parquet ファイルを置いていたのも不要になり、管理もとても楽になります。

    - [DuckDB\-Wasm \(OPFS\) メモ](https://zenn.dev/voluntas/scraps/08e6065facbefd)
    - [DuckDB\-Wasm \+ Parquet \+ S3\-compatible object storage \+ OPFS](https://voluntas.github.io/duckdb-wasm-parquet/)
  8. voluntas revised this gist Jan 19, 2025. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions duckdb_202501.md
    Original file line number Diff line number Diff line change
    @@ -18,9 +18,9 @@ S3 という呼び方は S3 互換オブジェクトストレージも含んだ

    結局 S3 が便利。

    DuckDB/DuckDB-Wasm を導入するにあたり、結局 S3 (または S3 互換オブジェクトストレージ、以降は S3) をベースに組み立てることが良いという判断をした
    DuckDB/DuckDB-Wasm を導入するにあたり、結局 S3 (または S3 互換オブジェクトストレージ、以降は S3) をベースに組み立てることが良いという判断をしました

    ログ検索サーバーとして Meilisearch を導入したりしていたが、シングルノードの場合は障害に備えて、検索情報の復旧などを作り込んでいく必要がある
    ログ検索サーバーとして Meilisearch を導入したりしていましたが、シングルノードの場合は障害に備えて、検索情報の復旧などを作り込んでいく必要があります。だからといってクラスターを組む場合はコストがかかります。マネージドサービスも同様です

    ただ、ログの保存先を S3 に保存してしまえば、何考えなくて良い。障害については基本考えなくて良いですし、容量の問題でディスク増やすか ... とかも考えなくて良くなります。

  9. voluntas revised this gist Jan 19, 2025. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions duckdb_202501.md
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    # DuckDB 座談会 v2025.1 発表者資料
    # DuckDB 座談会 v2025.1 発表者向け資料

    これは発表者資料であり、発表資料ではありません
    これは発表者向けの資料です

    ## 注意

  10. voluntas revised this gist Jan 19, 2025. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions duckdb_202501.md
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    # DuckDB 座談会 v2025.1
    # DuckDB 座談会 v2025.1 発表者資料

    これは発表者資料です
    これは発表者資料であり、発表資料ではありません

    ## 注意

  11. voluntas created this gist Jan 19, 2025.
    47 changes: 47 additions & 0 deletions duckdb_202501.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,47 @@
    # DuckDB 座談会 v2025.1

    これは発表者資料です。

    ## 注意

    S3 という呼び方は S3 互換オブジェクトストレージも含んだ総称として利用しています。

    ## 本日の発表内容

    - DuckDB と S3
    - DuckDB と Go
    - DuckDB-Wasm と S3
    - DuckDB-Wasm と OPFS
    - DuckdB と PostgreSQL

    ## DuckDB と S3

    結局 S3 が便利。

    DuckDB/DuckDB-Wasm を導入するにあたり、結局 S3 (または S3 互換オブジェクトストレージ、以降は S3) をベースに組み立てることが良いという判断をした。

    ログ検索サーバーとして Meilisearch を導入したりしていたが、シングルノードの場合は障害に備えて、検索情報の復旧などを作り込んでいく必要がある。

    ただ、ログの保存先を S3 に保存してしまえば、何考えなくて良い。障害については基本考えなくて良いですし、容量の問題でディスク増やすか ... とかも考えなくて良くなります。

    ## DuckDB と Go

    バックエンドで利用す場合は、全て Go から利用しています。

    <https://github.com/marcboeker/go-duckdb>

    公式ではなくサードパーティですが、 DuckDB 開発者がかなりコミットしています。

    Go は DuckDB のプロセス利用と相性が良いです。残念ながら CGO になってしまうため、ビルド自体は面倒くさいのですが、利用する分には問題ないです。

    HTTP リクエスト経由での DuckDB を実行したい時、Go であれば Goroutine で処理を行うことができるため、同時実行に脳みそを使わなくて良くなります。

    自社では HTTP リクエストを Go のサーバで受けて、DuckDB を起動し、S3 にあるログから必要な情報をとり、フィルタリングを行い、その後 Parquet ファイルに変換、そして S3 に minio-go を利用してアップロード、さらに Presigned URL を生成してクライアントに提供という仕組みを採用しています。

    そもそも解析したいときに要求される仕組みにしているため、常時解析情報をため込んでおく必要がありません。

    非同期解析結果要求はかなりコストメリットが高いので、大変お勧めです。

    ## DuckDB-Wasm と S3

    S3 の Presigned URL を利用する事で、ブラウザに安心して S3 の Parquet ファイルをダウンロードできます。