🦆

Azure Blob Storageに配置したcsvをDuckDBでクエリする

に公開

はじめに

DuckDB の Azure Extension を使うと Azure Blob Storage 上の csv ファイルに対し、クエリができるということで試してみたという記事です。

https://duckdb.org/docs/stable/core_extensions/azure.html

DuckDB とは

DuckDB は OLTP(On-line Transaction Processing:オンライン分散処理)に特化したデータベースで、シングルバイナリで動作するのが特徴です。
Parquet や CSV、JSON などの複数のファイル形式をサポートしており、クラウドストレージへの接続も可能です。

DuckDB の CLI のインストール

今回は、WSL 上の Ubuntu から CLI で操作することを想定します。
シェルは zsh を想定しています。
公式ドキュメントのインストール手順に沿って、DuckDB の CLI をインストールします。

https://duckdb.org/docs/installation/?version=stable&environment=cli&platform=linux&download_method=direct&architecture=x86_64

# duckdb cliのインストール
curl https://install.duckdb.org | sh

インストール後にパスを通すために~/.zshrcに追記しておきます。

# duckdb
export PATH="${HOME}/.duckdb/cli/latest":$PATH

パスが通っているかをwhichコマンドで確認しておきます。

# パスが通っているかの確認
which duckdb

パスが通っていれば問題ありません。

DuckDB の起動と Azure 拡張のセットアップ

DuckDB を起動し、Azure 拡張をセットアップしていきます。
duckdbコマンドで DuckDB を起動します。

以下のようなプロンプトが起動すれば問題ありません。

DuckDB v1.4.0 (Andium) b8a06e4a22
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D

続いて、Azure 拡張をインストールし、読み込みます。

INSTALL azure;
LOAD azure;

次に Azure のストレージアカウントとの接続のシークレットの設定をします。
CREATE SECRET命令で接続のシークレットの設定を指定しておきます。

CREATE SECRET secret1 (
    TYPE azure,
    CONNECTION_STRING 'Azureポータルで参照した接続文字列'
);

シークレットの設定には、スコープを設定可能です。特定のストレージアカウント用にシークレットを設定する場合は以下のようにします。

CREATE SECRET secret1 (
    TYPE azure,
    CONNECTION_STRING 'Azureポータルで参照した接続文字列',
    SCOPE 'azure://{ストレージアカウント名}.blob.core.windows.net/'
);

シークレットの登録が完了すると以下のように出ます。

┌─────────┐
│ Success │
│ boolean │
├─────────┤
│ true    │
└─────────┘

登録済みのシークレットの一覧は以下のコマンドで確認できます。

FROM duckdb_secrets();

また Ubuntu 上からだと Azure との接続時に SSL エラーが発生するようで、以下の設定をしておきます。

SET azure_transport_option_type = 'curl';

この解決方法は GitHub の Discussion を参考にしています。

https://github.com/duckdb/duckdb/discussions/9675#discussioncomment-9327842

Azure Blob 上の csv ファイルの操作

今回は適当に用意したストレージアカウントにduckdbという Blob コンテナを作成し、データ分析ではおなじみのIris.csvをアップロードしておきます。
csv ファイルは以下のリンクからダウンロードできます。

https://www.kaggle.com/datasets/saurabh00007/iriscsv/data

csv を配置したら、DuckDB からクエリをしてみます。
ストレージアカウント名の部分はそれぞれの環境に合わせて変更ください。

-- データ件数の確認
SELECT count(*) FROM 'azure://{ストレージアカウント名}.blob.core.windows.net/duckdb/Iris.csv';

シークレット値の設定などがうまくいっていれば、以下のように件数が確認できます。

┌──────────────┐
│ count_star() │
│    int64     │
├──────────────┤
│     150      │
└──────────────┘

少しづつ分析っぽいクエリを実行してみます。
まずはアヤメの種類ごとの件数を調べてみましょう。
アヤメの種類の情報はSpecies列に保存されています。

SELECT Species, count(*)
FROM 'azure://{ストレージアカウント名}.blob.core.windows.net/duckdb/Iris.csv'
GROUP BY Species;

それぞれ 50 件ずつ存在していることがわかりました。

┌─────────────────┬──────────────┐
│     Species     │ count_star() │
│     varchar     │    int64     │
├─────────────────┼──────────────┤
│ Iris-versicolor │           50 │
│ Iris-setosa     │           50 │
│ Iris-virginica  │           50 │
└─────────────────┴──────────────┘

次にそれぞれの種類ごとのがく辺の長さ、幅の平均、花弁の長さ、幅の平均も集計してみましょう。

SELECT Species, avg(SepalLengthCm), avg(SepalWidthCm), avg(PetalLengthCm), avg(PetalWidthCm)
FROM 'azure://{ストレージアカウント名}.blob.core.windows.net/duckdb/Iris.csv'
GROUP BY Species;
┌─────────────────┬────────────────────┬────────────────────┬────────────────────┬────────────────────┐
│     Species     │ avg(SepalLengthCm) │ avg(SepalWidthCm)  │ avg(PetalLengthCm) │ avg(PetalWidthCm)  │
│     varchar     │       double       │       double       │       double       │       double       │
├─────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┤
│ Iris-setosa     │  5.005999999999999 │ 3.4180000000000006 │              1.464 │ 0.2439999999999999 │
│ Iris-versicolor │              5.936 │ 2.7700000000000005 │               4.26 │ 1.3259999999999998 │
│ Iris-virginica  │  6.587999999999998 │ 2.9739999999999998 │              5.552 │              2.026 │
└─────────────────┴────────────────────┴────────────────────┴────────────────────┴────────────────────┘

きちんと取得できていますね。

まとめ

本記事では、DuckDB を使って、Azure Blob Storage 上に保存した csv ファイルに対し、クエリする方法を紹介しました。

軽く触ってみただけですが、クラウドストレージ上にあるファイルを SQL を使ってクエリできるのはかなり便利だなと思いました。
アプリケーションから構造化したデータを Parquet や csv で Blob ストレージ上に保存し、DuckDB で分析するというユースケースでも使えそうです。

Discussion