[ツール]DuckDB | CSVファイルをDBに取り込まずに直接SQL操作ができる!

日記
記事内に広告が含まれています。

業務システムの利用シーンで必ず出てくるのが、CSVファイル(カンマ区切りのデータファイル)。これをデータ分析するには、データベースに取り込むためCSVファイルをインポートしたり、Excelに貼り付けたりなど何かと手間がかかり面倒くさいです。一旦、データベースに取り込んでしまえば、SQL文を実行して集計・条件抽出・ソート・グルーピングが簡単にできるわけです。

手元にCSVファイルにあったとして、DBに取り込まずに直接CSVファイルに対して、SQL文を実行したいなあと思うことが多々あります。気軽でいいなあと・・・。探したら、ありました!

DuckDB (ダックディービー)

https://duckdb.org/ (公式サイト)

DuckDBとは

  • SQLiteのような軽量データベース(ローカル環境で動く)
  • 大量データ分析にも強い
  • ファイル1つで動く(インストールは簡単)
  • CSVなどのファイルを直接SQLで扱える
    という特徴を持つ、データ分析に特化したデータベースです。

もう少し説明すると

  • MITライセンス。無料で使える。
  • Windows, Mac, Linux, python, node.js, Cなど各種の実行環境をサポート。
  • SQLが使える(SELECT、JOIN、GROUP BY、ORDER BYなど、普段使うSQLがほぼそのまま使える)
  • データをインポートしなくてもread_csv_auto()でCSVファイルを直接分析できます。大きなデータを分析するのに超便利です。

DuckDBのインストール(Windows11環境)

私が試したインストール先の環境は、Windows 11 Home(バージョン 24H2)です。Windows11ではパッケージインストーラーとして、wingetが使えます。wingetを使う例を書きます。もちろん、通常のDuckDBインストーラーも用意されていますので、必要な方は、公式サイトからダウンロードしてください。

Windowsのコマンドラインプロンプト(cmd)を起動します。今回は、duckdbというフォルダを作成しておきました。インストール手順はコマンドラインから「winget install DuckDB.cli」と同意で聞かれた時の「y」を打つだけ。

C:\prj\duckdb>winget -v
v1.10.390


C:\prj\duckdb>winget install DuckDB.cli
'msstore' ソースでは、使用する前に次の契約を表示する必要があります。
Terms of Transaction: https://aka.ms/microsoft-store-terms-of-transaction
ソースが正常に機能するには、現在のマシンの 2 文字の地理的リージョンをバックエンド サービスに送信する必要があります (例: "US")。

すべてのソース契約条件に同意しますか?
[Y] はい  [N] いいえ: y
見つかりました DuckDB CLI [DuckDB.cli] バージョン 1.3.0
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
このパッケージには次の依存関係が必要です:
  - パッケージ
      Microsoft.VCRedist.2015+.x64
ダウンロード中 https://github.com/duckdb/duckdb/releases/download/v1.3.0/duckdb_cli-windows-amd64.zip
  ██████████████████████████████  10.0 MB / 10.0 MB
インストーラーハッシュが正常に検証されました
アーカイブを展開しています...
アーカイブが正常に展開されました
パッケージのインストールを開始しています...
パス環境変数が変更されました; 新しい値を使用するにはシェルを再起動してください。
コマンド ライン エイリアスが追加されました: "duckdb"
インストールが完了しました

(余談)テスト用のCSVファイルを準備する

手元にCSVファイルがある場合は、それを使いましょう。私はネットから拾ってきました(笑)。厚生労働省が提供する「介護サービス情報の公表システムデータのオープンデータ」というものがあり、利用規約にそって自由に使うことができます。ここに訪問看護の事業所情報(大きめのCSVファイル)がありましたので、利用させていただきました。ダウンロードファイル名は、「jigyosho_130_all_20250106192515.csv」となっていました。ヘッダ行込みで16290行もあります。CSVフォーマットを抜粋すると以下のとおり。文字コードはUTF-8でした。

  • 都道府県コード又は市町村コード
  • No
  • 都道府県名
  • 市区町村名
  • 事業所名
  • 事業所名カナ
  • サービスの種類
  • 住所
  • ~以下のカラムは省略~

DuckDBを動かす

DuckDBの起動と終了

(1)DuckDB起動
C:\prj\duckdb>duckdb
DuckDB v1.3.0 (Ossivalis) 71c5c07cdd
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D

(2a)DuckDB終了
コントロールキー+C

(2b)DuckDB終了
.exit

DuckDBでCSVファイルに対して、SQLを動かす(その1)

全行数を調べてみます。DuckDB内からと外から実行するケースを2つ紹介します。いずれにしろ、CSVファイルをインポートせずにSQL操作していることがわかるかと思います。

select count(*) from read_csv_auto('jigyosho_130_all_20250106192515.csv');

(1)csvファイルの行数を調べる。DuckDB内から呼ぶ
C:\prj\duckdb>duckdb
DuckDB v1.3.0 (Ossivalis) 71c5c07cdd
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D select count(*) from read_csv_auto('jigyosho_130_all_20250106192515.csv');
┌──────────────┐
│ count_star() │
│    int64     │
├──────────────┤
│    16289     │
└──────────────┘

(2)csvファイルの行数を調べる。DuckDBを外から呼ぶ
C:\prj\duckdb>duckdb -c "select count(*) from read_csv_auto('jigyosho_130_all_20250106192515.csv')"
┌──────────────┐
│ count_star() │
│    int64     │
├──────────────┤
│    16289     │
└──────────────┘

DuckDBでCSVファイルに対して、SQLを動かす(その2)

次は、ランキングを出力してみます。

select 都道府県名,count(*) as 件数 from read_csv_auto('jigyosho_130_all_20250106192515.csv')
group by 都道府県名
order by 件数 desc;

C:\prj\duckdb>duckdb
DuckDB v1.3.0 (Ossivalis) 71c5c07cdd
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D select 都道府県名,count(*) as 件数 from read_csv_auto('jigyosho_130_all_20250106192515.csv')
ツキ group by 都道府県名
ツキ order by 件数 desc;
┌────────────┬───────┐
│ 都道府県名 │ 件数  │
│  varchar   │ int64 │
├────────────┼───────┤
│ 大阪府     │  1654 │
│ 東京都     │  1508 │
│ 愛知県     │  1208 │
│ 神奈川県   │  1055 │
│ 福岡県     │  1007 │
│ 埼玉県     │   707 │
│ 兵庫県     │   688 │
│ 千葉県     │   663 │
│ 北海道     │   633 │
│ 京都府     │   406 │
│ 広島県     │   401 │
│ 静岡県     │   351 │
│ 熊本県     │   334 │
│ 群馬県     │   321 │
│ 岐阜県     │   320 │
│ 大分県     │   242 │
│ 長野県     │   242 │
│ 岡山県     │   223 │
│ 三重県     │   216 │
│ 沖縄県     │   213 │
│   ・        │    ・  │
│   ・        │    ・  │
│   ・        │    ・  │
│ 滋賀県     │   179 │
│ 長崎県     │   178 │
│ 宮崎県     │   178 │
│ 新潟県     │   169 │
│ 福島県     │   167 │
│ 青森県     │   151 │
│ 岩手県     │   140 │
│ 香川県     │   140 │
│ 栃木県     │   133 │
│ 徳島県     │   127 │
│ 石川県     │   122 │
│ 福井県     │   114 │
│ 島根県     │   109 │
│ 富山県     │   107 │
│ 山形県     │   104 │
│ 秋田県     │    97 │
│ 高知県     │    79 │
│ 鳥取県     │    77 │
│ 山梨県     │    75 │
│ 佐賀県     │    70 │
├────────────┴───────┤
│ 47 rows (40 shown) │
└────────────────────┘

中間が省略されてしまうのは謎。この手のDBクライアントアプリではレスポンスを良くするため、あるまる仕様ではありますが、逆に全部出す方法がよくわからなかったです。.output使えば全部でるよというネット情報があり、試すと全部はでました。しかし、文字化けしてしまって使えませんでした。

DuckDBを使ってみての感想

DuckDBは”お気軽に”CSVファイルを分析するには、充分に使えるツールだと思いました。SQLのJoinも使えるようですし、例えば、人事CSVと勤怠CSVのJoinで条件抽出みたいなこともできそうです。インストールが簡単かつ、パソコンのリソースを食わないのもいいですね。普段使いしたいと思います。

コメント

タイトルとURLをコピーしました