- DuckDBは、データが実際にデータベース内部へ保存されていなくても、データベースのように動作できる
- データは別のストレージに保存され、データベースはそれを参照する形で動作する
- データベースファイルには実データは含まれず、データをどう処理するかという指示だけが含まれる
例: ロボタクシーサービス
- 状況説明: ロボタクシーサービスで毎日生成されるデータをアナリストと共有しなければならない状況。
- 問題点: データが大きすぎてメールで送れず、リンクで共有するのも複雑。
- 解決策: DuckDBを使ってデータベースファイルを作成し、それを共有する。
# 데이터베이스 생성
import duckdb
db = duckdb.connect("weird_rides.db")
db.sql("""
CREATE VIEW weird_rides
AS SELECT pickup_at, dropoff_at, trip_distance, total_amount
FROM 's3://robotaxi-inc/daily-ride-data/*.parquet'
WHERE fare_amount > 100 AND trip_distance < 10.0
""")
db.close()
- 結果:
weird_rides.db ファイルには実データは含まれていないが、データをどう処理するかという指示が含まれている。
- 共有方法: このファイルをBlobストレージにアップロードし、リンクを共有する。
データアクセス
- データベース接続: 受信者はローカルのDuckDBセッションを開始し、共有されたデータベースファイルに接続する。
# 데이터베이스 연결
import duckdb
conn = duckdb.connect()
conn.sql("""
ATTACH 's3://robotaxi-inc/virtual-datasets/weird_rides.db'
AS rides_db (READ_ONLY)
""")
conn.sql("SELECT * FROM rides_db.weird_rides LIMIT 5")
- データダウンロード: クエリ実行時に必要なデータだけをS3からダウンロードする。
- 効率的なデータ処理: 必要な列だけを読み取り、フィルタを適用して不要なデータを除外する。
DuckDBの利点
- 変更に強い: データ形式、パーティショニング戦略、スキーマ変更があっても、受信者のデータアクセス方法は変わらない。
- データクラウドブラウザ: DuckDBを使えば、リレーショナルデータセットにハイパーリンク経由で簡単にアクセスできる。
2件のコメント
大規模データの中で小規模データのカタログと正確なパスさえあれば、サーバーリソースを少し節約できるかもしれませんね(笑)
Hacker Newsの意見
DuckDBとduckdb-wasmを使ってフォームビルダーSaaSの回答シートを効率的に処理: 回答データをS3に保存し、クライアント側でduckdb-wasmを通じてローカルDBとしてクエリすることで、ネットワークとメモリ使用を最適化している。
MotherDuckの紹介: サーバーレスのマネージドDuckDBデータウェアハウスで、ゼロコピークローン、安全な共有、クラウドデータとのハイブリッドモードなどを提供している。
DuckDBをqStudio SQLエディタに統合: さまざまなデータベースとのJOINをサポートしており、DuckDBを始めるのに適したIDEとして勧められている。
S3リンク経由でデータを提供する提案: 中間データベースやビューの価値に疑問を呈し、データアナリストが生データを直接扱うほうがより効率的かもしれないと主張している。
Data Tapの紹介: Lambda関数にDuckDBを組み込み、データをS3にParquet形式で保存するソリューションで、コスト効率とスケーラビリティを強調している。
データアクセス方式に対する混乱: データエンジニアは事前集計を避け、データアナリストは生データへのアクセスを好む傾向があると説明している。
ほとんどのデータベースがデータを含んでいないという主張への反応: この主張は誇張されていると考えている。
SQLクエリを同僚にメールで送る方法の提案: バイナリデータベースファイルの利点に疑問を投げかけている。
新しいSQLツールの有用性への疑問: 永続的なデータウェアハウスにデータを保存し、必要なビューを作成するほうが適切だと考えている。
Presto/Trinoとの類似性: DuckDBのアプローチがPresto/Trinoに似ていると感じる意見。