🦆

Parquet(等)の中身を手軽に表示・確認するなら DuckDB CLI を使おう! 2025年版

に公開

はじめに

3年ほど前に、「Parquetの中身を手軽に表示・確認するならコレを使おう!」という記事をQiitaで書きました。

https://qiita.com/eitsupi/items/2e8383bedb2f3a076b12

ありがたいことに今でもこちらの記事は読まれているようなのと、同じようにParquetの中身を確認したいという話題を見かけることがあったので、現在の私のオススメするDuckDB CLIを使うヒントを共有したいと思います。

上記の記事を書いた2022年末の時点でDuckDBはバージョン0.6.1でしたが、2025年10月現在はバージョン1.4.1まで順調にリリースを重ね、人気も高まっているようです。

後述のように便利な機能も多数追加されており、3年前はParquetを開くためのソフトウェアをいくつか紹介しましたが、今では「もう全部DuckDBで良いんじゃないかな」という心境になってます。

DuckDB CLIとは

DuckDB CLIは、DuckDBのシングルバイナリのコマンドラインクライアントです。インストールしてすぐに使えます。
インタラクティブにSQLを実行したり、コマンドの一部として他のツールと組み合わせて使うこともできます。

https://duckdb.org/docs/stable/clients/cli/overview.html

Linux、macOS、Windowsのamd64/arm64用にはバイナリが配布されています。
LinuxとmacOSの場合はインストールスクリプトを使用してサクッとインストールできるのと、バージョン毎に保持されるので複数のバージョンを使い分けることも可能です。
詳しくは(最近リニューアルされた)インストールページをご確認ください。

https://duckdb.org/install/

DuckDB CLIでParquetの中身を確認する

サンプルとして、GitHubでDuckDB組織の公開している、以下のファイルを使用します。
curlを使用してダウンロードしておきます。

Terminal
curl -LO https://github.com/duckdb/duckdb-data/releases/download/v1.0/taxi_2019_04.parquet

コマンドラインで確認する

早速コマンドラインで、先ほどダウンロードしたファイルの中身を確認してみましょう。
ここではDuckDB CLI 1.3.0(2025年5月リリース)で追加された、「データベースファイルの代わりにParquetファイルを使用する」機能を使用します。

https://duckdb.org/2025/05/21/announcing-duckdb-130.html#directly-query-data-files-with-the-cli

DuckDB CLIでは -c オプションで文字列のSQLクエリを渡して即座に実行させられます。
以前は、ここで渡すクエリ内でParquetファイルのパスを指定する必要がありました。例えば以下のような感じです。

Terminal
duckdb -c 'from taxi_2019_04.parquet'

この方法も良いのですが、文字列内にファイル名を書く必要があるのでオートコンプリートでファイル名を補完するようなことはできないのは難点でした。

しかし前述の新機能により、クエリの外部で指定したParquetファイルに対して file という名前のViewが自動的に作成された状態でインメモリデータベースが起動できるようになりました。
これにより、常に同じクエリを使用し、対象ファイル名をクエリ外で直接指定するだけで良くなりました。
例えば、from fileというクエリをtaxi_2019_04.parquetに対して実行するのならば、以下のようになります。

Terminal
$ duckdb -c 'from file' taxi_2019_04.parquet
┌───────────┬─────────────────────┬─────────────────────┬───┬──────────────┬──────────────────────┐
 vendor_id      pickup_at     dropoff_at total_amount congestion_surcharge
  varchar      timestamp      timestamp    float        float
├───────────┼─────────────────────┼─────────────────────┼───┼──────────────┼──────────────────────┤
 1 2019-04-01 00:04:09 2019-04-01 00:06:35          8.8                  2.5
 1 2019-04-01 00:22:45 2019-04-01 00:25:43          8.3                  2.5
 1 2019-04-01 00:39:48 2019-04-01 01:19:39        47.75                  2.5
 1 2019-04-01 00:35:32 2019-04-01 00:37:11          7.3                  2.5
 1 2019-04-01 00:44:05 2019-04-01 00:57:58        23.15                  2.5
 1 2019-04-01 00:29:16 2019-04-01 00:38:00          9.8                  0.0
 1 2019-04-01 00:06:47 2019-04-01 00:08:15          6.8                  2.5
 1 2019-04-01 00:52:16 2019-04-01 00:55:10          7.8                  2.5
 2 2019-04-01 00:52:28 2019-04-01 01:11:24         20.3                  2.5
 1 2019-04-01 00:02:19 2019-04-01 00:03:05         0.31                  0.0
 1 2019-04-01 00:03:20 2019-04-01 00:03:54       240.35                  0.0
 1 2019-04-01 00:13:40 2019-04-01 00:20:01         10.3                  2.5
 4 2019-04-01 00:25:31 2019-04-01 00:55:21         36.3                  2.5
 2 2019-04-01 00:14:55 2019-04-01 00:42:23        80.16                  0.0
 1 2019-04-01 00:13:51 2019-04-01 00:22:54         14.8                  2.5
 1 2019-04-01 00:24:59 2019-04-01 00:31:29         11.3                  2.5
 1 2019-04-01 00:43:34 2019-04-01 00:50:12        13.56                  2.5
 2 2019-04-01 00:10:05 2019-04-01 00:21:46        15.96                  2.5
 2 2019-04-01 00:38:35 2019-04-01 00:49:10         15.3                  2.5
 1 2019-04-01 00:03:29 2019-04-01 00:10:45        11.75                  2.5
 ·          ·          · ·          ·                   ·
 ·          ·          · ·          ·                   ·
 ·          ·          · ·          ·                   ·
 1 2019-04-30 23:27:52 2019-04-30 23:33:56        12.35                  2.5
 1 2019-04-30 23:50:51 2019-05-01 00:19:26        28.55                  2.5
 2 2019-04-30 23:04:02 2019-04-30 23:10:02        11.76                  2.5
 2 2019-04-30 23:12:33 2019-04-30 23:29:21         26.8                  2.5
 2 2019-04-30 23:33:19 2019-04-30 23:40:45         10.3                  2.5
 2 2019-04-30 23:54:49 2019-05-01 00:08:02        20.54                  2.5
 2 2019-04-30 23:11:31 2019-04-30 23:39:23        37.44                  2.5
 4 2019-04-30 23:18:24 2019-04-30 23:25:34        13.56                  2.5
 4 2019-04-30 23:44:01 2019-04-30 23:48:32          9.3                  2.5
 4 2019-04-30 23:49:10 2019-04-30 23:58:11        15.36                  2.5
 1 2019-04-30 23:05:28 2019-04-30 23:11:30         10.8                  2.5
 1 2019-04-30 23:21:17 2019-04-30 23:32:10        17.15                  2.5
 2 2019-04-30 23:39:31 2019-05-01 22:58:58         29.3                  2.5
 2 2019-04-30 23:28:12 2019-04-30 23:57:11        44.16                  0.0
 2 2019-04-30 23:03:35 2019-04-30 23:12:49        15.99                  2.5
 2 2019-04-30 23:26:25 2019-04-30 23:29:32         10.8                  2.5
 2 2019-04-30 23:42:44 2019-04-30 23:42:44          0.0                  0.0
 2 2019-04-30 22:18:51 2019-04-30 23:05:06          0.0                  2.5
 2 2019-04-30 23:05:44 2019-04-30 23:05:46          0.0                  0.0
 2 2019-04-30 23:07:48 2019-04-30 23:08:18          0.0                  0.0
├───────────┴─────────────────────┴─────────────────────┴───┴──────────────┴──────────────────────┤
 7433139 rows (7.43 million rows, 40 shown)                                 18 columns (5 shown) │
└─────────────────────────────────────────────────────────────────────────────────────────────────┘

summarize fileというクエリを実行すると、統計値を確認できます(集計のため時間がかかります。今回はGitHub Codespacesの2コアマシンで実行して16秒かかりましたが、プログレスバーが表示されるので安心して待てました)。

https://duckdb.org/docs/stable/guides/meta/summarize

Terminal
$ duckdb -c 'summarize file' taxi_2019_04.parquet
100% ▕██████████████████████████████████████▏ (00:00:16.31 elapsed)     
┌──────────────────────┬─────────────┬─────────────────────┬───┬─────────┬─────────────────┐
     column_name column_type         min  count null_percentage
       varchar   varchar       varchar  int64  decimal(9,2)   
├──────────────────────┼─────────────┼─────────────────────┼───┼─────────┼─────────────────┤
 vendor_id VARCHAR 1 7433139            0.00
 pickup_at TIMESTAMP 2008-08-08 09:13:28 7433139            0.00
 dropoff_at TIMESTAMP 2008-08-08 20:25:45 7433139            0.00
 passenger_count TINYINT 0 7433139            0.00
 trip_distance FLOAT 0.0 7433139            0.00
 rate_code_id VARCHAR 1 7433139            0.00
 store_and_fwd_flag VARCHAR N 7433139            0.00
 pickup_location_id INTEGER 1 7433139            0.00
 dropoff_location_id INTEGER 1 7433139            0.00
 payment_type VARCHAR 1 7433139            0.00
 fare_amount FLOAT -450.08 7433139            0.00
 extra FLOAT -24.6 7433139            0.00
 mta_tax FLOAT -0.5 7433139            0.00
 tip_amount FLOAT -88.0 7433139            0.00
 tolls_amount FLOAT -23.0 7433139            0.00
 improvement_surcha… FLOAT -0.3 7433139            0.00
 total_amount FLOAT -450.88 7433139            0.00
 congestion_surcharge FLOAT -2.5 7433139            0.00
├──────────────────────┴─────────────┴─────────────────────┴───┴─────────┴─────────────────┤
 18 rows                                                             12 columns (5 shown) │
└──────────────────────────────────────────────────────────────────────────────────────────┘

余談ですが、DuckDB CLIは出力のフォーマットをMarkdownテーブル形式にできるので、良い感じにMarkdownの表を作りたい場合にも便利です。

Terminal
$ duckdb -markdown -c 'from file limit 10' taxi_2019_04.parquet
| vendor_id |      pickup_at      |     dropoff_at      | passenger_count | trip_distance | rate_code_id | store_and_fwd_flag | pickup_location_id | dropoff_location_id | payment_type | fare_amount | extra | mta_tax | tip_amount | tolls_amount | improvement_surcharge | total_amount | congestion_surcharge |
|-----------|---------------------|---------------------|----------------:|--------------:|--------------|--------------------|-------------------:|--------------------:|--------------|------------:|------:|--------:|-----------:|-------------:|----------------------:|-------------:|---------------------:|
| 1         | 2019-04-01 00:04:09 | 2019-04-01 00:06:35 | 1               | 0.5           | 1            | N                  | 239                | 239                 | 1            | 4.0         | 3.0   | 0.5     | 1.0        | 0.0          | 0.3                   | 8.8          | 2.5                  |
| 1         | 2019-04-01 00:22:45 | 2019-04-01 00:25:43 | 1               | 0.7           | 1            | N                  | 230                | 100                 | 2            | 4.5         | 3.0   | 0.5     | 0.0        | 0.0          | 0.3                   | 8.3          | 2.5                  |
| 1         | 2019-04-01 00:39:48 | 2019-04-01 01:19:39 | 1               | 10.9          | 1            | N                  | 68                 | 127                 | 1            | 36.0        | 3.0   | 0.5     | 7.95       | 0.0          | 0.3                   | 47.75        | 2.5                  |
| 1         | 2019-04-01 00:35:32 | 2019-04-01 00:37:11 | 1               | 0.2           | 1            | N                  | 68                 | 68                  | 2            | 3.5         | 3.0   | 0.5     | 0.0        | 0.0          | 0.3                   | 7.3          | 2.5                  |
| 1         | 2019-04-01 00:44:05 | 2019-04-01 00:57:58 | 1               | 4.8           | 1            | N                  | 50                 | 42                  | 1            | 15.5        | 3.0   | 0.5     | 3.85       | 0.0          | 0.3                   | 23.15        | 2.5                  |
| 1         | 2019-04-01 00:29:16 | 2019-04-01 00:38:00 | 1               | 1.7           | 1            | N                  | 95                 | 196                 | 2            | 8.5         | 0.5   | 0.5     | 0.0        | 0.0          | 0.3                   | 9.8          | 0.0                  |
| 1         | 2019-04-01 00:06:47 | 2019-04-01 00:08:15 | 1               | 0.0           | 1            | N                  | 211                | 211                 | 3            | 3.0         | 3.0   | 0.5     | 0.0        | 0.0          | 0.3                   | 6.8          | 2.5                  |
| 1         | 2019-04-01 00:52:16 | 2019-04-01 00:55:10 | 1               | 0.2           | 1            | N                  | 237                | 162                 | 1            | 4.0         | 3.0   | 0.5     | 0.0        | 0.0          | 0.3                   | 7.8          | 2.5                  |
| 2         | 2019-04-01 00:52:28 | 2019-04-01 01:11:24 | 1               | 4.15          | 1            | N                  | 148                | 37                  | 2            | 16.5        | 0.5   | 0.5     | 0.0        | 0.0          | 0.3                   | 20.3         | 2.5                  |
| 1         | 2019-04-01 00:02:19 | 2019-04-01 00:03:05 | 1               | 0.0           | 5            | N                  | 265                | 265                 | 2            | 0.01        | 0.0   | 0.0     | 0.0        | 0.0          | 0.3                   | 0.31         | 0.0                  |

ブラウザ上でインタラクティブに確認する

前回の記事ではインタラクティブな用途にはDuckDBを内蔵したTadを紹介しましたが、今回は今年から利用可能になった、DuckDBのUI拡張機能(2025年3月リリース)をオススメします。

https://duckdb.org/docs/stable/core_extensions/ui

UI拡張機能を使用するのに一番簡単な方法は、-uiオプションを指定してDuckDB CLIを実行することです。
例えば以下のように-uiオプションを指定し、データベースの代わりにParquetファイルを指定して起動できます。

Terminal
duckdb -ui taxi_2019_04.parquet

するとサーバーが起動し、ブラウザでノートブック形式のエディタが表示されます。
接続されているデータベースの情報が表示され、個々のノートブックやセルを編集してSQLを実行し結果を確認できます。

先ほどコマンドラインで行ったように、from fileを実行してみました。

duckdb ui

SQLやファイル名の補完が利くのでとても使いやすいです。

auto complete

手軽に使えつつ、本格的なクエリを書きたい場合にもそのまますぐに移行できます。

現在は結果のソートなどをインタラクティブに行う機能はありませんが、将来的には実装される予定とのことで楽しみです。

おわりに

最近のDuckDB CLIの機能を使うとParquetを手軽に開いてデータを確認できることをご紹介しました。
これからもDuckDBに注目し、便利に使わせていただきたいと思います。

Discussion