当前位置: 首页 > news >正文

DuckDB全面挑战SQLite

21171de31d5a44f99b249d374de5dcc4.jpg


 

概要

 

当我们想要在具有嵌入式数据库的本地环境中工作时,我们倾向于默认使用 SQLite。虽然大多数情况下这都很好,但这就像骑自行车去 100 公里之外:可能不是最好的选择。

这篇文章中将讨论以下要点:

  • • DuckDB 简介:它是什么、为什么要使用它以及何时使用它

  • • DuckDB 集成到 Python 中

什么是 DuckDB?

如果查看 DuckDB 的网站,在其主页上看到的第一件事就是:DuckDB 是一个进程内 SQL OLAP 数据库管理系统。

让我们尝试解读这句话,因为它包含相关信息。

  • • 进程内 SQL 意味着 DuckDB 的功能在应用程序中运行,而不是在应用程序连接的外部进程中运行。换句话说:没有客户端发送指令,也没有服务器读取和处理它们。与 SQLite 的工作方式相同,而 PostgreSQL、MySQL……则不然。

  • • OLAP 代表在线分析处理,微软将其定义为组织大型业务数据库并支持复杂分析的技术。它可用于执行复杂的分析查询,而不会对事务系统产生负面影响。OLAP 数据库管理系统的另一个示例是 Teradata。

所以基本上,如果寻找无服务器数据分析数据库管理系统,DuckDB 是一个不错的选择。强烈建议查看 Mark Raasveldt 博士和 Hannes Mühleisen 博士 (两位最重要的 DuckDB 开发人员)发表的精彩同行评审论文,以了解 DuckDB 试图填补的空白。

此外它还是一个支持 SQL 的关系数据库管理系统 (DBMS)。这就是为什么我们将它与具有相同特征的其他 DBMS(例如 SQLite 或 PostgreSQL)进行比较。

为什么选择 DuckDB?

知道了 DuckDB 在数据库行业中的作用。但是为什么要选择它而不是针对给定项目可能有的许多其他选项呢?

对于数据库管理系统而言,不存在一刀切的情况,DuckDB 也不例外。我们将介绍它的一些功能,以帮助决定何时使用它。

它是一个高性能工具。正如 GitHub 页面所示:“它的设计目标是快速、可靠且易于使用。”

  • • 它的创建是为了支持分析查询工作负载 (OLAP)。他们的方式是通过向量化查询执行(面向列),而前面提到的其他 DBMS(SQLite、PostgreSQL…)按顺序处理每一行。这就是其性能提高的原因。

  • • DuckDB 采用了 SQLite 的最佳特性:简单性。DuckDB 开发人员在看到 SQLite 的成功后,选择安装简单性和嵌入式进程内操作作为 DBMS。

  • • 此外 DuckDB 没有外部依赖项,也没有需要安装、更新或维护的服务器软件。如前所述,它是完全嵌入式的,这具有与数据库之间进行高速数据传输的额外优势。

  • • 熟练的开创者。他们是一个研究小组,创建它是为了创建一个稳定且成熟的数据库系统。这是通过密集和彻底的测试来完成的,测试套件目前包含数百万个查询,改编自 SQLite、PostgreSQL 和 MonetDB 的测试套件。

  • • 功能完备。支持 SQL 中的复杂查询,提供事务保证( ACID 属性),支持二级索引以加速查询……更重要的是深度集成到 Python 和 R 中,以实现高效的交互式数据分析。

  • • 还提供 C、C++、Java 的 API

  • • 免费和开源

这些都是官方的优势。

还有另外需要再强调一点:DuckDB 不一定是 Pandas 的替代品。它们可以携手合作,如果是 Pandas 粉丝,也可以使用 DuckDB 在 Pandas 上执行高效的 SQL。

什么时候使用DuckDB?

这确实取决于喜好,但让我们回到其联合创始人发布的论文。

他们解释说,显然需要嵌入式分析数据管理。SQLite 是嵌入式的,但如果我们想用它进行详尽的数据分析,它太慢了。他们坚持认为“这种需求来自两个主要来源:交互式数据分析和“边缘”计算。”

以下是 DuckDB 的前 2 个用例:

  • • 交互式数据分析。现在大多数数据专业人员在本地环境中使用 R 或 Python 库(例如 dplyr 或 Pandas)来处理从数据库检索的数据。DuckDB 为我们的本地开发提供了使用 SQL 效率的可能性,而不会影响性能。无需放弃最喜欢的编码语言即可获得这些好处(稍后会详细介绍)。

  • • 边缘计算。使用维基百科的定义“边缘计算是一种分布式计算范式,使计算和数据存储更接近数据源。” 使用嵌入式 DBMS,没有比这更接近的了

DuckDB 可以在不同的环境中安装和使用:Python、R、Java、node.js、Julia、C++…这里,我们将重点关注 Python,很快就会看到它是多么容易使用。

将 DuckDB 与 Python 结合使用(简介)

打开终端并导航到所需的目录,因为我们即将开始。创建一个新的虚拟环境(或不创建)并安装 DuckDB:

pip install duckdb==0.7.1

如果需要另一个版本,请删除或更新该版本。

为了让事情变得更有趣,我将使用我在 Kaggle 上找到的有关 Spotify 有史以来流媒体最多的歌曲的真实数据[6]。我将使用典型的 Jupyter Notebook。由于我们获得的数据是两个 CSV 文件(Features.csv 和 Streams.csv),因此我们需要创建一个新数据库并将它们加载到:

import duckdb# Create DB (embedded DBMS)
conn = duckdb.connect('spotiStats.duckdb')
c = conn.cursor()# Create tables by importing the content from the CSVs
c.execute("CREATE TABLE features AS SELECT * FROM read_csv_auto('Features.csv');"
)
c.execute("CREATE TABLE streams AS SELECT * FROM read_csv_auto('Streams.csv');"
)

就像这样,我们创建了一个全新的数据库,添加了两个新表,并用所有数据填充了它们。所有这些都只有 4 行简单的代码(如果我们考虑导入,则为 5 行)。

让我们显示 Streams 表中的内容:

c.sql("SELECT * FROM streams")

37642ed682cd4b64b5b9c9cbbe77a628.png

 让我们开始做一些分析任务。例如想知道前 100 首中有多少首 2000 年之前的歌曲。这是一种方法:

c.sql('''
SELECT * 
FROM streams 
WHERE regexp_extract("Release Date", '\d{2}$') > '23'
''')

7259cce06fcd4daaaf7055211dae7947.png

 之前提到过同时使用 DuckDB 和 Pandas 很容易。这是一种使用 Pandas 执行相同操作的方法:

我所做的就是将初始查询转换为 DataFrame,然后以 Pandas 的方式应用过滤器。结果是一样的,但是他们的表现呢?

>>> %timeit df[df['Release Date'].apply(lambda x: x[-2:] > '23')]
434 µs ± 25.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)>>> %timeit c.sql('SELECT * FROM streams WHERE regexp_extract("Release Date", \'\d{2}$\') > \'23\'')
112 µs ± 25.3 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

操作相当简单:我们对 100 行表应用一个简单的过滤器。但如果我们将其与 DuckDB 实现进行比较,使用 Pandas 的执行时间几乎是其 4 倍。

如果我们尝试更详尽的分析操作,改进可能是巨大的。

我认为提供更多示例并没有多大意义,因为对 DuckDB 的介绍将转换为 SQL 介绍。这不是我想要的。

我们将最后的结果(2000 首之前的歌曲)导出为 parquet 文件 - 因为它们始终是传统 CSV 的更好替代品。同样这将非常简单:

c.execute('''
COPY (SELECT * FROM streams WHERE regexp_extract("Release Date", '\d{2}$') > '23'
) 
TO 'old_songs.parquet' (FORMAT PARQUET);
''')

我所做的就是将之前的查询放在括号内,DuckDB 只是将查询的结果复制到 old_songs.parquet 文件中。

结论

DuckDB 改变了进程内分析领域,这种影响还将继续。

 

 

今天的分享就到这里,欢迎点赞收藏转发,感谢🙏

 

相关文章:

DuckDB全面挑战SQLite

概要 当我们想要在具有嵌入式数据库的本地环境中工作时,我们倾向于默认使用 SQLite。虽然大多数情况下这都很好,但这就像骑自行车去 100 公里之外:可能不是最好的选择。 这篇文章中将讨论以下要点: • DuckDB 简介:它…...

Elasticsearch查询裁剪

如果source有成千上百个字段,查询的数据没法看 某些敏感字段不能随意展示 响应数据较大影响网络带宽 查看文档信息 查看ffbf索引id为123的文档信息 GET /ffbf/_doc/123返回结果 {"_index" : "ffbf","_type" : "_doc","_id&qu…...

Hadoop——Hive运行环境搭建

Windows:10 JDK:1.8 Apache Hadoop:2.7.0 Apache Hive:2.1.1 Apache Hive src:1.2.2 MySQL:5.7 1、下载 Hadoop搭建 Apache Hive 2.1.1:https://archive.a…...

(vue)vue项目中引入外部字体

(vue)vue项目中引入外部字体 效果: 第一步 放置字体包,在assets下创建一个fonts文件夹,放入下载的字体文件 第二步 创建一个font.css文件用于定义这个字体包的名字 第三步 在App.vue的css中将这个css文件引入 第四步 页面使用 font-famil…...

ChatGPT在语义理解和信息提取中的应用如何?

ChatGPT在语义理解和信息提取领域有着广泛的应用潜力。语义理解是指对文本进行深层次的理解,包括词义、句义和篇章义等层面的理解。信息提取是指从文本中自动抽取结构化的信息,如实体、关系、事件等。ChatGPT作为一种预训练语言模型,具有丰富…...

Mysql-主从复制与读写分离

Mysql 主从复制、读写分离 一、前言:二、主从复制原理1.MySQL的复制类型2. MySQL主从复制的工作过程;3.MySQL主从复制延迟4. MySQL 有几种同步方式:5.Mysql应用场景 三、主从复制实验1.主从服务器时间同步1.1 master服务器配置1.2 两台SLAVE服务器配置 2…...

算法练习(3):牛客在线编程04 堆/栈/队列

package jz.bm;import java.util.*;public class bm4 {/*** BM42 用两个栈实现队列*/Stack<Integer> stack1 new Stack<>();Stack<Integer> stack2 new Stack<>();public void push(int node) {stack1.push(node);}public int pop() {while (!stack1…...

mac下安装vue cli脚手架并搭建一个简易项目

目录 1、确定本电脑下node和npm版本是否为项目所需版本。 2、下载vue脚手架 3、创建项目 1、下载node。 如果有node&#xff0c;打开终端&#xff0c;输入node -v和npm -v , 确保node和npm的版本&#xff0c;(这里可以根据自己的需求去选择&#xff0c;如果对最新版本的内容有…...

尝试-InsCode Stable Diffusion 美图活动一期

一、 Stable Diffusion 模型在线使用地址&#xff1a; https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型相关版本和参数配置&#xff1a; 活动地址 三、图片生成提示词与反向提示词&#xff1a; 提示词&#xff1a;realistic portrait painting of a japanese…...

【OpenGL学习】之着色器GLSL基础

基本类型: 类型说明void空类型,即不返回任何值bool布尔类型 true,falseint带符号的整数 signed integerfloat带符号的浮点数 floating scalarvec2, vec3, vec4n维浮点数向量 n-component floating point vectorbvec2, bvec3, bvec4n维布尔向量 Boolean vectorivec2, ivec3, iv…...

Python爬虫基础知识点有哪些

目录 Python爬虫基础知识点 Requests库 Beautiful Soup库 正则表达式 数据存储 防止被反爬虫策略 爬虫调度和任务管理 认识robots.txt文件 反爬虫法律与道德 示例代码 Requests库 Beautiful Soup库 正则表达式 数据存储 防止被反爬虫策略 结语 网络世界中信息的…...

【CSS】 vh、rem 和 px 的区别

vh、rem 和 px 都是 CSS 中常见的长度单位&#xff0c;它们有以下区别&#xff1a; px&#xff08;像素&#xff09;是一个绝对单位&#xff0c;表示屏幕上的实际像素点。它的大小不会根据设备或浏览器的设置进行调整&#xff0c;是一个固定值。 rem&#xff08;根元素字体大小…...

如何设置板子从emmc启动-针对imx6ull

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习…...

使用Newtonsoft直接读取Json格式文本(Linq to Json)

使用Newtonsoft直接读取Json格式文本&#xff08;Linq to Json&#xff09; 使用 Newtonsoft.Json&#xff08;通常简称为 Newtonsoft&#xff09;可以轻松地处理 JSON 格式的文本。Newtonsoft.Json 是 .NET 中一个流行的 JSON 处理库&#xff0c;它提供了丰富的功能和灵活性。…...

服务器用友数据库中了locked勒索病毒后怎么解锁数据恢复

随着信息技术的迅速发展&#xff0c;服务器成为现代企业中不可或缺的重要设备。然而&#xff0c;由于网络安全风险的存在&#xff0c;服务器在日常运作中可能遭受各种威胁&#xff0c;包括恶意软件和勒索病毒攻击。近日&#xff0c;我们收到很多企业的求助&#xff0c;企业的用…...

Linux-MariaDB数据库的备份与初始化

Linux-MariaDB数据库的备份与初始化 缘起数据库备份数据库用户查询数据库新建用户数据库权限回收数据库更新密码数据库root密码重置 缘起 Linux系统下我们比较常用的数据库软件是开源又免费的MySQL。MariaDB是MySQL的一个分支&#xff0c;采用GPL授权许可&#xff0c;完全兼容…...

springboot-redis使用fastjson2

1、pom 注&#xff1a;springboot2.*使用fastjson2-extension-spring5&#xff0c;3.*使用fastjson2-extension-spring6 <fastjson.version>2.0.37</fastjson.version> <!-- json --> <dependency><groupId>com.alibaba.fastjson2</groupId…...

SOC FPGA之HPS模型设计(二)

根据SOC FPGA之HPS模型设计(一)&#xff0c; Quartus工程经过全编译后会产生Handoff文件夹、SOPCINFO文件、SVD文件 二、生成Preloader镜像文件 通过信息交换文件Handoff文件生成Preloader&#xff0c;需要用到SOC EDS Preloader也被称为spl(Second Program Loader)或u-boot…...

Go基础—反射,性能和灵活性的双刃剑

Go基础—反射&#xff0c;性能和灵活性的双刃剑 1 简介2 结构体成员赋值对比3 结构体成员搜索并赋值对比4 调用函数对比5 基准测试结果对比 1 简介 现在的一些流行设计思想需要建立在反射基础上&#xff0c;如控制反转&#xff08;Inversion Of Control&#xff0c;IOC&#x…...

MATLAB与ROS联合仿真(慕羽☆)全套开源资料索引

自2021年9月份开始进行MATLAB与ROS联合仿真相关的研究&#xff0c;至2021年12月份研究基本上结束&#xff0c;至今&#xff0c;已经近两年时间&#xff0c;期间曾收到过很多小伙伴的私信&#xff0c;想让我出点教程&#xff0c;期间我也曾多次想要抽点时间出教程&#xff0c;但…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...