DuckDB快速入门教程

DuckDB是一个用c++编写的进程内OLAP DBMS,太复杂了。我们从简单的开始,好吗?DuckDB是用于分析的SQLite。它没有依赖关系,非常容易设置,并且经过优化可以对数据执行查询。本文将介绍什么是DuckDB,如何使用它,以及为什么它对你很重要。

DuckDB应用场景

为什么DuckDB ?作为数据分析师或数据科学家,典型的工作流程是从CSV文件或S3桶加载数据,执行预处理步骤,然后运行分析。要实现这些功能,您需要打开一个Jupyter notebook,导入Numpy和Pandas,然后执行查询。有趣的是,如果回顾这些操作,通常包括类似数据库中的操作,如连接、聚合、筛选等。但是,不是使用关系数据库管理系统(RDBMS),而是使用Pandas和Numpy。

问题是,为什么?设置数据库并在其中,加载数据可能是一种痛苦、缓慢和令人沮丧的体验。如果这很容易,那么使用RDBMS就可以获得一切。这就是DuckDB要解决的需求场景,DuckDB是使用数据库分析数据的最简单和最快的方法。

DuckDB介绍

在这里插入图片描述

DuckDB优势

  • 本地化

​ 首先,DuckDB是进程内单文件数据库,没有外部依赖关系。这是什么意思?与Postgres不同,它不需要设置客户端/服务器,也不需要安装外部依赖项。此外,客户端与服务端之间的数据传输速度比正常情况下要慢。另一方面,DuckDB嵌入到主机应用程序进程中,并管理存储在单个文件中的数据库。没有客户机/服务器,安装起来很简单。如果你需要运行DB来进行本地数据分析,那么它就是你的选择!

  • 性能

​ 其次,DuckDB针对分析查询工作负载(OLAP)进行了高度优化。因为它是面向列的数据库(以及其他优化),所以聚合、连接或读取数据的复杂长时间查询变得非常快!可以很容易地说,90%的大数据工作负载可以在一台机器上处理,而不需要DuckDB进行任何设置或计算。Pandas不是这样的。Pandas不能利用CPU内核来并行计算,这使得它们完成起来很慢。它完全在内存中操作,如果数据集太大,就会导致内存不足错误。

  • SQL

​ 无论您喜欢与否,SQL比以往任何时候都更加活跃。DuckDB支持相当高级的SQL命令集,例如窗口函数和聚合。它提供事务性保证(ACID属性)并使用Postgres API。忘记丑陋和缓慢的pandas操作。你可以用优雅的SQL替换它们(它在SQL之上提供了一些附加功能,使其更友好,如下所示)。最后,DuckDB有一个Python客户端,当与Arrow和Parquet混合使用时,它会很出色。

​ 总之,DuckDB是开源的、可嵌入的、进程内的、面向列的SQL OLAP RDBMS。非常适合想要轻松快速地执行本地分析工作负载的数据从业者。

DuckDB限制

DuckDB被设计为在单台机器上运行。这意味着你的数据必须适合那台机器;否则,它不起作用。实际上,您可以使用功能强大的计算机来处理99%的工作负载。这应该不是问题,除非你每天处理数tb的数据。通过查看AWS产品,您可以拥有一个拥有1952gb内存和128个vcpu的实例。

另一个限制是DuckDB不是一个多租户数据库。拥有不同团队的不同人员、开发模型和共享数据库上的数据将是非常具有挑战性的。但是,当你将数据库与其他工具(如Airflow、S3、Parquet和dbt)集成时,可以获得一个健壮的数据生态系统,团队可以使用该生态系统高效地工作。

这本身并不是限制,但是DuckDB不是事务性数据库,不应该这样使用。

DuckDB vs SQLite

虽然SQLite是一个通用的数据库引擎,但它主要是为快速在线事务处理(OLTP)而设计的。

SQLite是:

  • 跨平台:SQLite数据库存储在单个文件中。
  • 紧凑和独立:可作为一个小文件。它不需要安装或配置,也没有外部依赖。
  • 可靠:经常用于关键任务应用程序,如飞行软件。
  • 快:每秒可以支持数万个事务。
  • ACID保证:事务是原子的、一致的、隔离的和持久的

上述特性与DuckDB相同。这就是为什么它声称是“用于分析的SQLite”。那么有什么不同呢?

DuckDB是为进程内OLAP从头开始构建的,采用列式存储、向量化查询处理和针对ETL操作优化的多版本并发控制。另一方面,SQLite使用面向行的存储格式,这意味着SQL查询对单个行而不是成批行进行操作,就像在向量化查询处理中那样,这会给OLAP查询带来较差的性能。

总之,他们都有许多共同的特点。但是,DuckDB针对跨大量行应用聚合计算的查询进行了优化,而SQLite针对单个数据行的快速扫描和查找进行了优化。如果您需要执行分析查询,请使用DuckDB;否则,使用SQLite。

Python操作DuckDB

是时候使用DuckDB了。首先,创建一个duckdb目录,以CSV数据文件为例,这里没有实际业务处理,实际内容不重要。下面数据集包含测试数据:销售数据,列为订单ID、产品、数量等。

Order_ID	Product	Quantity	Price	Order_Date
176558	USB-C Charging Cable	2	11.95	19-04-2019
176559	Bose SoundSport Headphones	1	99.99	07-04-2019
176560	Google Phone	1	600	12-04-2019
176560	Wired Headphones	1	11.99	12-04-2019
176561	Wired Headphones	1	11.99	30-04-2019
176562	USB-C Charging Cable	1	11.95	29-04-2019
176563	Bose SoundSport Headphones	1	99.99	02-04-2019
176564	USB-C Charging Cable	1	11.95	12-04-2019
176565	Macbook Pro Laptop	1	1,700.00	24-04-2019

要使用DuckDB,必须安装Python包。为了避免与机器上已经安装的包冲突,最好的做法是创建一个Python虚拟环境。为此,打开终端并键入命令python3 -m venv venv。通过执行source venv/bin/activate来激活环境,并在VS Code(或任何IDE)中运行一个单元。

在文件中输入# %%,创建VS Code类型的单元格,可以实现类似Notebook功能:
图1
按shift+enter组合键,可以运行单元格内代码。

安装依赖

准备好Python虚拟环境后,创建一个新文件requirements.txt。该文件包含DuckDB工作所需的Python包以及DuckDB本身。

duckdb==1.1.3
pandas==2.1.1
seaborn==0.13.0
matplotlib==3.8.0

保存该文件并运行命令pip install -r requirements.txt来安装依赖项。
回到笔记本并在第一个单元格中添加以下导入:
在这里插入图片描述

创建数据库

默认情况下,不带参数的connect会创建一个全局存储在Python模块中的内存数据库。如果关闭启动连接的程序,就会丢失数据库和数据。如果希望持久化数据,则传递文件名进行连接,以便它创建与数据库对应的文件。

conn = duckdb.connect()
# conn = duckdb.connect("my_db.db")

最后,如果你想查询现有的数据库,而不向它写入数据,传递read_only参数,如下所示:

conn = duckdb.connect("my_db.db", read_only=True

现在,采用第一个选项,创建内存数据库作为示例。

使用DuckDB查询数据

在新单元格中,增加并执行下面代码:

conn.sql("""SELECT *FROM 'data/*.csv'LIMIT 10
""")

SQL对数据库执行SQL查询。在上面的示例中,DuckDB加载数据集目录中的所有CSV文件并打印前10行。在底层,DuckDB使用CSVLoader自动推断列和类型。如你所见,这很简单。为CSV文件提供路径,就可以像查询SQL表一样查询它们。当然DuckDB支持很多文件类型,如Parquet、Hive分区、JSON等等。

能够查询数据固然很好,但是从查询中检索数据就更好了!DuckDB提供了多种方法,可以使用这些方法来有效地检索数据,例如:

  • fetchnumpy()将数据作为Numpy数组的字典
  • df()将数据作为Pandas数据框
  • arrow()将数据作为arrow表
  • pl()将数据作为polar数据框

最终根据需求选择合适的方法。作为最佳实践,不要使用fetch_one或fetch_all,因为它们会为查询返回的每个值创建一个Python对象。如果有很多数据,可能会出现内存错误或性能问题。
让我们通过像这样更改前面的单元格来检索数据作为Pandas Dataframe:

# %%
conn = duckdb.connect("my_db.db")
df = conn.sql("""SELECT *FROM 'data/*.csv'LIMIT 10
""").df()
df

执行结果如下:
在这里插入图片描述

从Dataframe创建表

现在,你已经使用DuckDB直接查询了这些文件。另一种方法是将前一个查询的输出注册为一个虚拟表,这样你就可以使用通常的SQL表特性查询数据。如何?简单!

# %%
conn.register("df_view", df)
print(conn.execute("DESCRIBE df_view").df())print(conn.execute("DESCRIBE df_view").df())

这将从数据帧df创建虚拟表df_view。重新运行单元将得到预期的输出:
在这里插入图片描述

总结

DuckDB通过易于使用和高效地查询任何数据来节省您的时间。不需要通过经典的RDBMS来加载和查询数据,只需使用DuckDB即可。对于大多数场景,可能不需要100个cpu和100Gb内存的大型设置。此外,DuckDB还提供了与Pandas、Arrow、Polars、Parquet和Numpy等许多知名包的兼容性,这使得在它们之间进行操作变得方便。希望大家喜欢,下次教程再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/489808.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【橘子容器】如何构建一个docker镜像

你肯定打过docker镜像是吧,作为一个开发这很正常,那么你用的什么打包方式呢,这里我们来梳理几种常用的docker镜像构建方式。 ps:这里不是太讲原理,更多的是一种科普和操作。因为讲原理的东西网上已经够多了。 一、Dock…

操作系统(8)死锁

一、概念 死锁是指在一个进程集合中的每个进程都在等待只能由该集合中的其他进程才能引起的事件,而无限期地僵持下去的局面。在多任务环境中,由于资源分配不当,导致两个或多个进程在等待对方释放资源时陷入无限等待的状态,这就是死…

el-table行合并及合并后序号处理

效果图 <el-tableclass"ncky-detail-table"v-loading"tableLoading"border:data"tableDataVo":span-method"objectSpanMethod"row-key"uniqueFlag":row-class-name"tablerowclassname"><el-table-column…

【Python】使用Selenium的find_element模块获取网页上的大段文字和表格的方法(建议收藏!)

发现了一个使用Selenium的find_element模块&#xff0c;快速获取文字和表格的方法&#xff0c;很实在&#xff0c;以后爬网的时候&#xff0c;就不用beautifulSoup 和 pandas的read_html 混起来用了&#xff01; 文字部分&#xff1a;实现网络节点下&#xff0c;某个节点下的其…

24秋:模式识别:答题第一波除解析

判断题&#xff1a; T 模式识别中的人脸识别问题是根据已知数据类别预测未知数据类别的问题。F 人脸图像在计算机中是以矩阵的方式存储的。F 训练集和测试集有交集。T 算法&#xff08;模型&#xff09;是以样本所包含的信息为基础&#xff0c;对总体的某些特征进行判断、预测…

【蓝桥杯每日一题】推导部分和——带权并查集

推导部分和 2024-12-11 蓝桥杯每日一题 推导部分和 带权并查集 题目大意 对于一个长度为 ( N ) 的整数数列 ( A 1 , A 2 , ⋯ , A N A_1, A_2, \cdots, A_N A1​,A2​,⋯,AN​ )&#xff0c;小蓝想知道下标 ( l ) 到 ( r ) 的部分和 ∑ i l r A i A l A l 1 ⋯ A r \su…

<项目代码>YOLOv8 车牌识别<目标检测>

项目代码下载链接 &#xff1c;项目代码&#xff1e;YOLOv8 车牌识别&#xff1c;目标检测&#xff1e;https://download.csdn.net/download/qq_53332949/90121387YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题…

STM32 CubeMx HAL库 独立看门狗IWDG配置使用

看门狗这里我就不多介绍了&#xff0c;能搜到这篇文章说明你了解 总之就是一个单片机重启程序&#xff0c;设定好超时时间&#xff0c;在超时时间内没有喂狗&#xff0c;单片机就会复位 主要应用在单片机异常重启方面&#xff0c;比如程序跑飞&#xff08;注意程序跑飞时你就…

实现某海外大型车企(T)Cabin Wi-Fi 需求的概述

最近参与某海外大型车企&#xff08;T&#xff09;的 Wi-Fi 功能需求开发&#xff0c;T 提出了一个 Cabin Wi-Fi 的概念&#xff0c;首先我们先对 Cabin Wi-Fi 进行一个较全面的了解。 1. Cabin Wi-Fi 概念概述 Cabin Wi-Fi 通常指用于飞机客舱、火车车厢、豪华巴士或船舶上的无…

OpenAI直播发布第4天:ChatGPT Canvas全面升级,免费开放!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

【Linux课程学习】:第二十一弹---深入理解信号(中断,信号,kill,abort,raise,larm函数)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ Linux学习笔记&#xff1a; https://blog.csdn.…

2021 年 6 月青少年软编等考 C 语言四级真题解析

目录 T1. 数字三角形问题思路分析T2. 大盗思路分析T3. 最大子矩阵思路分析T4. 小球放盒子思路分析T1. 数字三角形问题 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 注…

购物车案例--分模块存储数据,发送请求数据渲染,底部总计数量和价格

shift鼠标右键&#xff0c;打开powershell&#xff0c;新建项目 自定义 只有一个页面&#xff0c;不涉及路由&#xff0c;勾选vuex,css,babel 无需保存预设 回车项目开始创建 项目用vscode打开 将src里的内容全部清空 将第七天的课程准备代码复制粘贴到src中 刷新页面&…

内网是如何访问到互联网的(华为源NAT)

私网地址如何能够访问到公网的&#xff1f; 在上一篇中&#xff0c;我们用任意一个内网的终端都能访问到百度的服务器&#xff0c;但是这是我们在互联网设备上面做了回程路由才实现的&#xff0c;在实际中&#xff0c;之前也说过运营商是不会写任何路由过来的&#xff0c;那对于…

C++编程: 基于cpp-httplib和nlohmann/json实现简单的HTTP Server

文章目录 0. 引言1. 完整实例代码2. 关键实现3. 运行与测试 0. 引言 本文基于 cpp-httplib 和 nlohmann/json 实现简单的 HTTPS Server 实例代码&#xff0c;这两个库均是head-only的。 1. 完整实例代码 如下实例程序修改自example/server.cc #include <httplib.h>#i…

收银pos源代码(Win版+安卓版)

1.收银pos版本 支持市面上主流系统版本&#xff0c;如支持win版&#xff08;exe安装包&#xff09;、安卓版&#xff08;apk安装包&#xff09;&#xff1b; 2.多样化收银 支持Windows收银机、安卓收银机、ai智能称重、收银称重一体机、无人自助收银、手机端收银等&#xff…

springboot项目如何运行起来

时常开发好的springboot项目是如何运行起来的&#xff1f; 经常会使用到打包插件spring-boot-maven-plugin SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。在pom文件里加入这个插件即可&#xff1a; org.springframework.boot spring-b…

ubuntu18.04配置实时内核

ubuntu系统&#xff1a;18.04 当前内核&#xff1a;5.4.0-84-generic 待安装实时内核&#xff1a; 5.6.19-rt11 1、查看当前版本 uname -r 2、下载内核与补丁 一种方式从官网自己下载 官方内核下载地址官方补丁下载地址阿里镜像内核下载地址&#xff08;速度快&#xff0…

Centos7环境下安装Flink1.20

目录 介绍1、涉及安装包2、节点3、修改hostname4、将flink安装包上传并解压5、修改配置文件6、修改masters和workers&#xff08;所有节点&#xff09;7、集群启停 介绍 Flink 是一个分布式系统&#xff0c;需要有效分配和管理计算资源才能执行流应用程序。它集成了所有常见的…

EXCEL数据清洗的几个功能总结备忘

目录 0 参考教材 1 用EXCEL进行数据清洗的几个功能 2 删除重复值&#xff1a; 3 找到缺失值等 4 大小写转换 5 类型转化 6 识别空格 0 参考教材 精通EXCEL数据统计与分析&#xff0c;中国&#xff0c;李宗璋用EXCEL学统计学&#xff0c;日EXCEL统计分析与决策&#x…