🦆

DuckDBを使ってS3にあるデータをTableauでサクっと分析する

2025/01/22に公開

カスタマーサクセスマネージャー見習いの玉井です。

SQLiteのデータ分析版ことDuckDBですが、その使いやすさから、データ分析界隈(?)では結構人気が出てきている印象です。

今回は、そんな便利なDuckDBにTableauを接続してみました。

DuckDB自体の基本操作について

以下をご覧ください。

https://dev.classmethod.jp/articles/motherduck-duckdb-tutorial-for-beginners/

やってみた

環境

  • macOS Sequoia 15.2
  • DuckDB 1.1.3
  • Tableau Desktop 2024.3.2 (Apple Silicon)

Tableau側の準備

Tableau DesktopからDuckDBに接続するためには、ドライバーの準備が必要です。基本的には以下に記載の通りに作業すれば問題ありません。

https://duckdb.org/docs/guides/data_viewers/tableau.html

以下がちゃんとした(?)公式ドキュメントですが、接続方法については、ちょっと内容が古いままです。

https://duckdb.org/docs/guides/data_viewers/tableau.html

上記ドキュメントには接続方法が2通り書かれていますが、当記事ではDuckDB側が推奨しているtacoコネクターを使った方法で行きます。

1. DuckDB JDBC driverのインストール

まず、こちらからJDBCドライバーをダウンロードし、~/Library/Tableau/Drivers/に配置します(色々ありますが、DLするのは.jarファイルだけでOKです。)

2. DuckDB用のtacoファイルのインストール

次に、こちらからtacoファイルをダウンロードし、/Users/(ユーザー名)/Documents/マイ\ Tableau\ リポ ジトリ/コネクタ/に配置します(なんかパスがガッタガタですが、日本語環境だと、コピペするとこうなります…)。

以上の2つのファイルを配置するだけで、DuckDBへの接続準備は完了します。Tableau Desktopの接続画面で以下が表示されていれば成功です。

In-Memory Databaseでの接続

デフォルトでは、DuckDBはインメモリで処理を行うようになっており、扱うデータは一時的にしか保存しない(=永続しない)ようになっています。まずはそのモードでTableauから接続してみます。

Tableau Desktopの接続画面から「MotherDuckによるDuckDB」を選択し、次に出てきた画面で「In-memory database」を選びます。

すると、データベースとスキーマだけ選べる状態になります。

「え、こっからどうすんの?」って感じですが、In-memory databaseモードでは、必ず初期SQLを使用する必要があります。このモードでは、前述したデフォルトの仕様と同様で、データを持たずに処理を行うため、「そこにあるデータを選ぶ」のではなく、「対象のデータに対するアクセスをSQLで書く」というものになっています。

例えば、以下のSQLを初期SQLとして使ってみます。

CREATE VIEW jaffle_shop_orders AS (
    FROM read_csv_auto('s3://dbt-tutorial-public/jaffle_shop_orders.csv')
)

データベースをmemory、スキーマにmainを選ぶと、テーブルが出てきてデータがプレビュれました。

当然、Vizれます。

初期SQLで、dbt社が提供しているチュートリアル用のデータ(パブリックアクセスなので誰でも読み込めます)を読み込み、VIEWとして一時的にメモリに展開していると思うのですが、それをTableau Desktopで扱えるようになっています。

何かフツーにここまで来ましたが、これDuckDBだからこそできてるんですよね。

そもそも、DuckDBは多種多様なデータに対してSQLを実行できるのですが、例えばS3のデータを分析したいとなったら、S3のURLをFROM句に指定すると、別途ダウンロード等の作業は一切せずに、直接SQLを実行することができます。そこにTableauをつなぐことで、クラウドストレージ上のデータに対して、即座にTableauでビジュアライズできるのはかなり強いのではないでしょうか。

ちなみに、「ダッシュボードとして保存できるのか?」という疑問が湧いてきますが、普通に保存・再読込できました。初回で開くときに初期SQLを実行してもよいかの警告ダイアログは出ますが、それをOKすればいけました。インメモリの処理ということで、Tableau Desktopを閉じた時点でデータへの接続は無くなっているはずですが、初期SQLを仕込んでいるので、ワークブックを開くたびに、DuckDBの初期SQLが走ってデータを取りに行っている感じでしょうか(ダッシュボード自体の設定は普通にワークブックに保存されているため、問題なくダッシュボード自体が再現できる)。

Localでの接続

今度はLocalモードを試してみたいと思います。読んで字の如く、ローカルにあるデータに接続できます(逆に言うと、ローカルに無いデータをDuckDB越しに分析したい場合は、In-Memory Databaseで初期SQLを仕込んでの接続になるという使い分けになりそうです)。

今回使用するデータですが、せっかくなのでDuckDBの機能で生成するデータにしたいと思います。

DuckDBは基本的にインメモリ…処理を終えるとデータも消えるという仕様ですが、当然ながらデータの永続化という機能もございます。

DuckDB起動時にdbファイルを指定することで、作成したテーブルをローカルに永続化(保存)することができます。

$ duckdb jaffle_shop.db
v1.1.3 19864453f7
Enter ".help" for usage hints.
D CREATE TABLE jaffle_shop AS (
      SELECT *
      FROM read_csv_auto('s3://dbt-tutorial-public/jaffle_shop_customers.csv') AS cs
      JOIN read_csv_auto('s3://dbt-tutorial-public/jaffle_shop_orders.csv') AS od
      ON cs.id = od.user_id
  );
D SHOW TABLES;
┌─────────────┐
│    name     │
│   varchar   │
├─────────────┤
│ jaffle_shop │
└─────────────┘

このjaffle_shop.dbをTableau Desktopで読み込んでみたいと思います。

Local Fileを選んで、ファイルを指定します。

問題なく読み込めました。

超デカいデータとか、ややこしい結合をした後で分析したい時などは、こちらでやったほうがパフォーマンス的に良いかもしれませんね。

おわりに

前述した通り、色々なデータに対してそのままSQLで分析ができるDuckDBの恩恵をTableauで受けられるのは大きいです。昨今、半構造化データ(jsonやparquet)が頻繁に登場していると思いますが、DuckDBはこれらももちろん対応しています(しかも、read_json_auto等で、スキーマも自動的に判断してくれます)。クラウドストレージ上にある大量の半構造化データも、DuckDB+Tableau Desktopですぐに分析することができます。

惜しいところとしては、Tableau Cloudでは使えない(非対応)ということです(パブリッシュしてもちゃんと開けない)。最近、AI機能などがTableau Cloudにどんどん増えてきているので、Tableau Cloudを選ぶユーザーも多いと思うので、Tableau CloudでもDuckDBをデータソースに指定できるようになってほしいところです(Tableau Serverは対応しています)。

なので、現時点では手元でのアドホック分析に活かすのに良さそうな組み合わせだと思いました。

MotherDuck

実は、LocalとIn-Memory Databaseの他に、もう一つ「MotherDuck」という接続メニューがあります。これは、DuckDBのSaaS版?であるMotherDuckに接続するための設定です。MotherDuckとTableauの組み合わせは、また別途やりたいと思います。

Discussion