不需要数据的数据库


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

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

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


相關推薦

2023-04-27

大,也都趋向于通过分布式训练实现。而算法工程师通常需要对这些分布式框架涉及到的底层文件存储和调度系统有较深的理解,才能够快速批量开启模型训练,保证资源利用率。 目前业界有很多类似的框架,如 TonY、TensorFl

2024-08-14

足实际业务需求。   与此同时,支撑 RAG 的向量数据库市场竞争愈加激烈。然而从当前向量数据库的实现来看,无论是插件形式,还是专门的向量数据库,底层实现上很多都是采用诸如 HNSW 之类的公开算法,因此一些关

2024-10-06

黑神话:仙童,数据库自动反射魔法棒 Golang通用代码生成器仙童发布了最新版本电音仙女尝鲜版十一及其介绍视频,视频请见:https://www.bilibili.com/video/BV1ET4wecEBk/ 此视频介绍了使用最新版的仙童代码生成器,将MariaDB数据库迁

2023-07-26

,每个统计项都是基于一种或多种运算场景。用户可根据需要创建若干个统计工程,每个统计工程可包含多个统计项,而基于同一份元数据的多个统计项叫做一个统计组。 Web模块可管理统计项的运行状态,用户可在Web端页面启

2023-05-09

驱动的架构设计;轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式 通过 ioGame 可以很容易的搭建出一个集群无中心节点、集群自动化、多进程的分步式游戏服务器 包体小、启动快、内存占用少、更加的节

2024-08-09

代码生成器仙童,2.4.0电音仙女尝鲜版八,此版本完善了数据库自动反射功能。完善了多对多候选功能,完善了下拉列表的空值。有多处缺陷修正。 Golang通用代码生成器:仙童电音仙女版本,将强大的生产力赋能广大程序员。无

2023-04-08

强。新版本中继续优化了数据导入和导出功能,支持选择需要的规则进行导入导出,实现了规则依赖的流、配置和插件等的自动推断和导出。另外,我们优化了 eKuiper manager 中的规则管理界面,可以更准确地展示规则启动中的状

2023-07-25

然后在服务器上构建应用程序镜像,并使用app和PostgreSQL数据库的容器运行 docker-compose。数据库和文件存储的数据会映射至服务器的文件系统,确保在修改代码重新部署时能保留所有数据。 该功能在Studio中隐藏了很长时间,因为

2024-10-22

业务系统中需要添加大量类似的配置源,例如:多个MySQL数据库,只是数据库名称不一样,其他:host、用户名、密码都一样,因此用户不想每个数据源都从新开始配置,只需配置一个数据源,其他数据库实例只需克隆该实例,然

2023-05-04

Apache Ignite 版本发布说明 Apache Ignite 分布式内存数据库 2.15.0 (!) 警告: 删除了Ignite节点的Daemon模式; 删除了废弃了的ignitevisorcmd工具; 删除了遗留的JMX Beans(ThreadPoolMXBean、CacheGroupMetricsMXBean、CacheMetricsMXBean、PersistenceMetri

2022-12-22

0(即将发布) 的训练数据集中删除自己的作品。艺术家需要在 Have I Been Trained 网站上找到自己的作品,然后选择将其退出训练集。 小编随手上传了一张图片进行搜索,在该站点找到了一大堆动漫/女孩相关的图像。但

2023-09-05

常实用强大的 PostgreSQL 扩展插件,允许你在现有的关系型数据库 PostgreSQL 上拥有完整的向量数据存储检索能力。 9月1号,PGVECTOR 发布了一个重大版本更新 v0.5 ,引入了一种全新类型的索引:HNSW 。在 ANN Benchmark 中,召回率和性能

2023-08-29

本(包括 ga 版本),升级到 v6.1.0 的话,无需再手工更新数据库表结构,夜莺会自动帮你更新(当然,前提是夜莺所用的数据库账号得具备数据库 alter 权限),你只需要替换二进制和 integrations 目录,然后重启进程即可。如果使

2022-04-07

元数据中心来管理外部数据源元数据,使其可以自动同步数据库物理模型与平台逻辑模型之间的结构,增强平台一站式的开发能力。 Flink 元数据持久化 Dinky 目前需要持久化 Flink Catalog,使作业开发时不再需要编写 CREATE TABLE 等