データ品質保証ツールとしてのDuckDB
株式会社タイミー / chanyou0311
メンバー / データエンジニア / 従業員規模: 1,001〜5,000名 / エンジニア組織: 101名〜300名
ツールの利用規模 | ツールの利用開始時期 | 事業形態 |
---|---|---|
10名以下 | 2024年12月 | B to B B to C |
ツールの利用規模 | 10名以下 |
---|---|
ツールの利用開始時期 | 2024年12月 |
事業形態 | B to B B to C |
アーキテクチャ

導入の背景・解決したかった問題
導入背景
タイミーでは、データウェアハウスとしてBigQueryを採用し、あらゆるデータを集約・統合することでデータ活用を推進しています。
データのユースケースによっては高い品質が求められるため、重複や欠損がないかなど、様々な観点からデータ品質テストを実施し、その保証に努めています。
特に、S3に保存されたParquetファイルをBigQueryへロードする際には、データが1行も欠損することなく完全に転送されることを保証する必要がありました。 これを実現するために S3上のParquetファイルとBigQueryテーブルのデータを突き合わせ、完全性を検証するデータテスト(完全性のテスト)で DuckDB を採用しました。
ツール導入前の課題
DuckDB 導入前のデータ完全性テストでは、転送前後のデータ比較において、計算コストの観点から統計量を比較する手法を主に採用していました。
この方法は全レコード・全カラムに対して欠損が全くないことを厳密に保証することが難しく、近似的な比較に留まっていました。
どのような状態を目指したか
上記の課題を解決するため、転送元と転送先のデータが完全に一致することを保証できる状態を目指しました。
具体的にはセル単位での厳密なデータ比較を実現し、データの完全性をより高い精度で担保できる状態を目指しました。
比較検討したサービス
- Pandas
比較した軸
- 複数データソースへの対応: 異なるデータソース(例: S3上のParquet、BigQuery)に対して、同様のインターフェースでクエリを実行できること。
- パフォーマンス: 大量のデータに対しても、実用的な時間内で比較処理を実行できる高いパフォーマンスを有していること。
- クエリの簡潔性: データ比較のロジックを、SQLなどを用いて簡潔かつ直感的に記述できること。
- 実行環境の整備の容易さ: 依存関係が少なく、実行環境のセットアップやメンテナンスが容易であること。
選定理由
最終的にDuckDBの採用を決定した主なポイントは以下の通りです。
複数データソースへのシームレスなアクセスとパフォーマンス
DuckDBは、S3上のParquetファイルやBigQueryのデータを扱う際に、高いパフォーマンスを維持しながら統一的なSQLでクエリを実行できる点が、今回のユースケースに非常にマッチしていました。
SQLによる簡潔な比較ロジック
EXCEPT
句など、標準的なSQL構文を用いることで、データ間の差分検出ロジックを非常に簡潔に記述できる点が魅力でした。
導入の手軽さ
シングルバイナリで動作し、依存モジュールのメンテナンスコストが低い点が、Pandasなどの他の候補と比較して優位でした。実行環境の整備が容易であることは、迅速な導入と運用負荷の軽減に繋がると判断しました。
導入の成果
改善したかった課題はどれくらい解決されたか
DuckDBを導入したことで、従来の統計量比較による近似的な保証しかできなかったデータ完全性テストの課題を解決できました。
S3上のParquetファイルとBigQueryテーブル間で、セル単位での厳密なデータ比較が可能となり、データの完全性を高いレベルで保証できるようになりました。
どのような成果が得られたか
- 厳密な完全性テストの実現: S3上のParquetファイルとBigQueryテーブル間で、セル単位での厳密なデータ比較が可能となり、データの完全性を高いレベルで保証できるようになりました。
- 複数データソースへの容易なアクセス: ローカルファイル、S3、GCSなど、データの保存場所に関わらず、
read_parquet()
関数のような統一的な方法でデータを読み込めるため、生産性高く開発できました。 - 高いパフォーマンスと安定性: 100GB程度のParquetファイルの完全性テストが、I/O処理を含めて10分以内に完了するなど、非常に高いパフォーマンスで安定して実行できています。これにより、デイリーでのデータ転送時など、頻繁なチェックにも対応可能となりました。
導入時の苦労・悩み
BigQuery Community Extensionの挙動
当初、DuckDBのBigQuery Community Extensionを利用してBigQueryに直接クエリを実行することを試みましたが、一部の文字列型のフィールドでカラムが正常に読み取れない事象が発生しました。 エラーメッセージが明確ではなく原因特定が難航したため、今回のケースではこのExtensionの利用は見送りました。
代替案として、BigQueryからGCSにParquetファイルとしてエクスポートし、そのファイルをDuckDBで読み込む方式を採用しました。
導入に向けた社内への説明
上長・チームへの説明
OSS で比較的試しやすい環境にあったため PoC を実施して、主に以下の点を確認しました。
- データベースをまたいだクエリを容易に実行できるか
- 実行が現実的な時間で終わるか
- 実行にどの程度の料金コストがかかるか
- その他運用上の課題・懸念がないか
PoC の結果、上記の観点で導入に支障がないことが確認できたため、本番環境への実装を進めました。
活用方法
よく使う機能
DuckDBの機能の中で、特にデータ品質保証の文脈でよく利用しているものは以下の通りです。
read_parquet()
: Parquetファイルを直接読み込むための関数です。S3やGCS上のファイルも指定可能です。EXCEPT
句: 2つのSELECT文の結果セットの差分を取得するためのSQL演算子です。データ比較に使用しています。- Secret Manager: クラウドストレージ等への認証情報を安全に管理・利用するための機能です。
- 出力形式の指定 (例:
jsonlines
): クエリ結果をスクリプトで扱いやすい形式(JSON Linesなど)で出力する機能です。今回のケースではjq
などのツールと組み合わせて後続処理を容易にしています。
ツールの良い点
- 複数データソースへの容易なアクセスとSQLの表現力: ローカルファイル、S3、GCSなど、様々な場所にあるParquetファイルなどを、
read_parquet()
のようなシンプルな関数で読み込み、標準的なSQLで操作できる点は非常に便利です。EXCEPT
句などを用いたデータ比較も直感的に記述できます。 - 高いパフォーマンスと安定性: インメモリ処理を基本とすることで、大規模なデータセットに対しても高速なクエリ実行が可能です。今回の完全性テストでは、100GB程度のデータでも10分以内に処理が完了しており、安定性も高いです。
- 導入・運用の手軽さ: シングルバイナリで動作するため、依存関係が少なく、環境構築やデプロイが非常に簡単です。コンテナとの相性も良く、ポータブルな実行環境を容易に構築できます。
- 柔軟な出力形式: クエリ結果をCSV、JSON、Parquetなど様々な形式で出力できるため、シェルスクリプトや他のツールとの連携が容易です。特に
jsonlines
形式とjq
の組み合わせは、スクリプト処理において非常に便利でした。
ツールの課題点
- 分析用途でのガバナンス: DuckDBは非常に手軽に利用できる反面、中央集権的にデータへのアクセス制御を行う機能はありません。今回のケースではスクリプト内での利用でしたが、分析用途で利用する際には、DuckDBの外側でアクセス制御を行う必要があります。
- 頻繁に更新されるデータとの同期: RDBMSのようにトランザクショナルな更新が頻繁に行われるデータソースとのリアルタイム同期は得意ではありません。更新頻度の低いデータや、バッチ処理でS3などに出力されたデータとの連携に適しています。
今後の展望
今回のデータ完全性テストでの成功体験を踏まえ、今後DuckDBの活用を以下のように広げていきたいと考えています。
- 他のデータテストへの展開: 完全性テスト以外にも、一意性テスト、有効性テスト、整合性テストなど、様々なデータ品質に関わるテストのエンジンとしてDuckDBの利用を検討していきたいです。
- 更新頻度の低い大規模なデータの分析用途: 2025年3月にDuckDB UI機能がリリースされて、よりユーザーフレンドリーにデータを扱えるようになりました。静的だが大量データの手元での分析と相性がよさそうなので、有用性を検証していきたいです。
株式会社タイミー / chanyou0311
メンバー / データエンジニア / 従業員規模: 1,001〜5,000名 / エンジニア組織: 101名〜300名
よく見られているレビュー
株式会社タイミー / chanyou0311
メンバー / データエンジニア / 従業員規模: 1,001〜5,000名 / エンジニア組織: 101名〜300名