🦆

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         │
├───────────┼─────────────────────┼─────────────────────┼───┼──────────────┼──────────────────────┤
│ 12019-04-01 00:04:09 │ 2019-04-01 00:06:35 │ … │          8.82.5 │
│ 12019-04-01 00:22:45 │ 2019-04-01 00:25:43 │ … │          8.32.5 │
│ 12019-04-01 00:39:48 │ 2019-04-01 01:19:39 │ … │        47.752.5 │
│ 12019-04-01 00:35:32 │ 2019-04-01 00:37:11 │ … │          7.32.5 │
│ 12019-04-01 00:44:05 │ 2019-04-01 00:57:58 │ … │        23.152.5 │
│ 12019-04-01 00:29:16 │ 2019-04-01 00:38:00 │ … │          9.80.0 │
│ 12019-04-01 00:06:47 │ 2019-04-01 00:08:15 │ … │          6.82.5 │
│ 12019-04-01 00:52:16 │ 2019-04-01 00:55:10 │ … │          7.82.5 │
│ 22019-04-01 00:52:28 │ 2019-04-01 01:11:24 │ … │         20.32.5 │
│ 12019-04-01 00:02:19 │ 2019-04-01 00:03:05 │ … │         0.310.0 │
│ 12019-04-01 00:03:20 │ 2019-04-01 00:03:54 │ … │       240.350.0 │
│ 12019-04-01 00:13:40 │ 2019-04-01 00:20:01 │ … │         10.32.5 │
│ 42019-04-01 00:25:31 │ 2019-04-01 00:55:21 │ … │         36.32.5 │
│ 22019-04-01 00:14:55 │ 2019-04-01 00:42:23 │ … │        80.160.0 │
│ 12019-04-01 00:13:51 │ 2019-04-01 00:22:54 │ … │         14.82.5 │
│ 12019-04-01 00:24:59 │ 2019-04-01 00:31:29 │ … │         11.32.5 │
│ 12019-04-01 00:43:34 │ 2019-04-01 00:50:12 │ … │        13.562.5 │
│ 22019-04-01 00:10:05 │ 2019-04-01 00:21:46 │ … │        15.962.5 │
│ 22019-04-01 00:38:35 │ 2019-04-01 00:49:10 │ … │         15.32.5 │
│ 12019-04-01 00:03:29 │ 2019-04-01 00:10:45 │ … │        11.752.5 │
│ ·         │          ·          │          ·          │ · │          ·   │                   ·  │
│ ·         │          ·          │          ·          │ · │          ·   │                   ·  │
│ ·         │          ·          │          ·          │ · │          ·   │                   ·  │
│ 12019-04-30 23:27:52 │ 2019-04-30 23:33:56 │ … │        12.352.5 │
│ 12019-04-30 23:50:51 │ 2019-05-01 00:19:26 │ … │        28.552.5 │
│ 22019-04-30 23:04:02 │ 2019-04-30 23:10:02 │ … │        11.762.5 │
│ 22019-04-30 23:12:33 │ 2019-04-30 23:29:21 │ … │         26.82.5 │
│ 22019-04-30 23:33:19 │ 2019-04-30 23:40:45 │ … │         10.32.5 │
│ 22019-04-30 23:54:49 │ 2019-05-01 00:08:02 │ … │        20.542.5 │
│ 22019-04-30 23:11:31 │ 2019-04-30 23:39:23 │ … │        37.442.5 │
│ 42019-04-30 23:18:24 │ 2019-04-30 23:25:34 │ … │        13.562.5 │
│ 42019-04-30 23:44:01 │ 2019-04-30 23:48:32 │ … │          9.32.5 │
│ 42019-04-30 23:49:10 │ 2019-04-30 23:58:11 │ … │        15.362.5 │
│ 12019-04-30 23:05:28 │ 2019-04-30 23:11:30 │ … │         10.82.5 │
│ 12019-04-30 23:21:17 │ 2019-04-30 23:32:10 │ … │        17.152.5 │
│ 22019-04-30 23:39:31 │ 2019-05-01 22:58:58 │ … │         29.32.5 │
│ 22019-04-30 23:28:12 │ 2019-04-30 23:57:11 │ … │        44.160.0 │
│ 22019-04-30 23:03:35 │ 2019-04-30 23:12:49 │ … │        15.992.5 │
│ 22019-04-30 23:26:25 │ 2019-04-30 23:29:32 │ … │         10.82.5 │
│ 22019-04-30 23:42:44 │ 2019-04-30 23:42:44 │ … │          0.00.0 │
│ 22019-04-30 22:18:51 │ 2019-04-30 23:05:06 │ … │          0.02.5 │
│ 22019-04-30 23:05:44 │ 2019-04-30 23:05:46 │ … │          0.00.0 │
│ 22019-04-30 23:07:48 │ 2019-04-30 23:08:18 │ … │          0.00.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                   │ … │ 74331390.00 │
│ pickup_at            │ TIMESTAMP   │ 2008-08-08 09:13:28 │ … │ 74331390.00 │
│ dropoff_at           │ TIMESTAMP   │ 2008-08-08 20:25:45 │ … │ 74331390.00 │
│ passenger_count      │ TINYINT     │ 0                   │ … │ 74331390.00 │
│ trip_distance        │ FLOAT       │ 0.0                 │ … │ 74331390.00 │
│ rate_code_id         │ VARCHAR     │ 1                   │ … │ 74331390.00 │
│ store_and_fwd_flag   │ VARCHAR     │ N                   │ … │ 74331390.00 │
│ pickup_location_id   │ INTEGER     │ 1                   │ … │ 74331390.00 │
│ dropoff_location_id  │ INTEGER     │ 1                   │ … │ 74331390.00 │
│ payment_type         │ VARCHAR     │ 1                   │ … │ 74331390.00 │
│ fare_amount          │ FLOAT       │ -450.08             │ … │ 74331390.00 │
│ extra                │ FLOAT       │ -24.6               │ … │ 74331390.00 │
│ mta_tax              │ FLOAT       │ -0.5                │ … │ 74331390.00 │
│ tip_amount           │ FLOAT       │ -88.0               │ … │ 74331390.00 │
│ tolls_amount         │ FLOAT       │ -23.0               │ … │ 74331390.00 │
│ improvement_surcha…  │ FLOAT       │ -0.3                │ … │ 74331390.00 │
│ total_amount         │ FLOAT       │ -450.88             │ … │ 74331390.00 │
│ congestion_surcharge │ FLOAT       │ -2.5                │ … │ 74331390.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に注目し、便利に使わせていただきたいと思います。

GitHubで編集を提案

Discussion