不需要数据的数据库

来源: 投稿
2024-05-31 16:17:00

数据库的众多优点之一是它们通常试图将数据在内部的表示方式(例如在磁盘上)与数据使用方式分开。甚至 不将数据存储在运行查询的同一硬件上已成为常态。

数据库在这方面已经做得非常出色,以至于这个术语现在几乎具有误导性。“数据库”暗示着某种坚固的东西,没有它数据就会消失。但数据始终存在,只是无名硬盘上的一些位。现代数据库提供的结构和可访问性完全独立于硬盘而存在。没错——大多数数据库中不再包含任何数据。

DuckDB是为这个时代构建的数据库,并且是一个特别可爱的数据库。

假设您运营一家自动驾驶出租车服务公司。并且您在 Blob 存储中维护着一个不断增长的有趣乘车模式数据集,您希望更好地了解这些模式。这些数据被拆分成每天的单独 Parquet 文件。您如何与分析师共享该数据集?

你可以直接把所有东西都邮寄给他们,但这样数据集就太大了。而且它会立即过期。如果这是一篇博客文章,你只需发送一个链接,但这里实际上没有任何东西可以链接。而向某人发送一百个指向 S3 中的原始 blob 的链接可能会破坏任何工作关系。

相反,你可以为他们建立一个小型数据库:

# Send
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 的说明,就好像它是相关数据点的单个表格一样。

您还可以将此数据库文件发布到 Blob 存储,就在数据旁边。现在您有一个可以链接的内容:s3://robotaxi-inc/virtual-datasets/weird_rides.db

链接的接收者无需打开网络浏览器,而是启动他们自己的本地 DuckDB 会话,并 连接到引用的数据库。

# Receive
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")

# ┌─────────────────────┬─────────────────────┬───────────────┬──────────────┐
# │      pickup_at      │     dropoff_at      │ trip_distance │ total_amount │
# │      timestamp      │      timestamp      │     float     │    float     │
# ├─────────────────────┼─────────────────────┼───────────────┼──────────────┤
# │ 2019-04-01 00:03:20 │ 2019-04-01 00:03:54 │           0.0 │       240.35 │
# │ 2019-04-01 00:16:16 │ 2019-04-01 00:16:21 │           0.0 │       138.36 │
# │ 2019-04-01 02:01:22 │ 2019-04-01 02:01:28 │           0.0 │       192.96 │
# │ 2019-04-01 06:26:44 │ 2019-04-01 06:27:14 │           0.0 │        115.3 │
# │ 2019-04-01 07:28:12 │ 2019-04-01 07:28:12 │           0.0 │        127.2 │
# └─────────────────────┴─────────────────────┴───────────────┴──────────────┘

 此查询是第一次从 S3 下载数据。DuckDB 支持 部分读取weird_rides,这意味着只需要获取视图定义中使用的列,并且fare_amount > 100可以使用类似的过滤器在下载过程中丢弃更多不相关的数据。

从接收方的角度来看,这种访问数据的方式将保持不变,几乎无论底层数据发生什么变化。格式变化 不同的分区策略、架构变化——尽管如此,接收方的视图仍保持不变。

使用 DuckDB 作为数据云的浏览器,关系数据集始终只需一个超链接即可。

原文链接:https://www.nikolasgoebel.com/2024/05/28/duckdb-doesnt-need-data.html

展开阅读全文
点击加入讨论🔥(5) 发布并加入讨论🔥
5 评论
5 收藏
分享
返回顶部
顶部