简单易用的DuckDB数据库管理系统

news2025/1/10 12:40:51

大家好,DuckDB是一个免费的、开源的、嵌入式数据库管理系统,专为数据分析和在线分析处理而设计。这意味着以下几点:

  • 它是免费的开源软件,因此任何人都可以使用和修改代码。

  • 它是嵌入式的,这意味着DBMS(数据库管理系统)与使用它的应用程序在同一进程中运行。这使得它快速且易于使用。

  • 它针对数据分析和OLAP(在线分析处理)进行了优化,而不仅仅是像典型数据库那样只针对事务数据。这意味着数据按列而不是行组织以优化聚合和分析。

  • 它支持标准SQL,因此可以在数据上运行查询、聚合、连接和其他SQL函数。

  • 它在进程中运行,即在应用程序本身内运行,而不是作为单独的进程运行。这消除了进程间通信的开销。

  • 与SQLite一样,它是一个简单的、基于文件的数据库,因此不需要单独安装服务器。只需将库包含在应用程序中即可。

总之,DuckDB为需要快速和简单的数据分析能力的应用程序提供了易于使用的嵌入式分析数据库,它填补了分析处理领域的一个空白,而完整的数据库服务器则过于复杂。

DuckDB受欢迎的原因

现在有许多原因使公司开始在DuckDB上搭建产品,该数据库专为快速分析查询而设计,因此它针对大型数据集上的聚合、连接和复杂查询进行了优化,这些类型的查询通常在分析和报告中使用。此外:

  • 它易于安装、部署和使用。没有需要配置的服务器——DuckDB在应用程序内部嵌入运行。这使得它易于集成到不同的编程语言和环境中。

  • 尽管它很简单,但DuckDB具有丰富的功能集。它支持完整的SQL标准、事务、二级索引,并且与流行的数据分析编程语言如Python和R集成良好。

  • DuckDB是免费的,任何人都可以使用和修改它,这降低了开发人员和数据分析师采用它的门槛。

  • DuckDB经过充分的测试和稳定性验证。它有一个广泛的测试套件,并在各种平台上进行持续集成和测试,以确保稳定性。

  • DuckDB提供与专门的OLAP数据库相当的性能,同时更易于部署。这使得它既适用于中小型数据集的分析查询,也适用于大型企业数据集。

简而言之,DuckDB将SQLite的简单易用性与专业列存储数据库的分析性能相结合,性能、简单性、功能和开源许可这些因素促使DuckDB在开发人员和数据分析师中越来越受欢迎。

DuckDB Python示例 

本文使用Python API测试一下DuckDB的一些特性,可以使用Pypi安装DuckDB:

pip install duckdb

对于其他编程语言,请参考DuckDB的安装指南。

 在这个例子中,本文将使用来自Kaggle的Data Science Salaries 2023 CSV数据集,并尝试测试DuckDB的各种功能。

Relation API

可以像pandas一样将一个CSV文件加载到一个关系中,DuckDB提供了一个关系API,允许用户将查询操作连接在一起。这些查询是懒惰评估的,这使得DuckDB能够优化它们的执行。

现在已经加载了数据科学工资数据集,并显示了别名。

import duckdb
rel = duckdb.read_csv('ds_salaries.csv')
rel.alias
'ds_salaries.csv'

为了显示列名,我们将使用与pandas类似的.columns

rel.columns
['work_year',
 'experience_level',
 'employment_type',
 'job_title',
 'salary',
 'salary_currency',
 'salary_in_usd',
 'employee_residence',
 'remote_ratio',
 'company_location',
 'company_size']

可以将多个函数应用到关系中以获得特定结果,在本文的示例中过滤掉了“work_year”,只显示了三列,并对其进行了排序和限制,以显示基于薪资的排名后五位的职位。

rel.filter("work_year > 2021").project(
    "work_year,job_title,salary_in_usd"
).order("salary_in_usd").limit(5)
┌───────────┬─────────────────┬───────────────┐
│ work_year │    job_title    │ salary_in_usd │
│   int64   │     varchar     │     int64     │
├───────────┼─────────────────┼───────────────┤
│      2022 │ NLP Engineer    │          5132 │
│      2022 │ Data Analyst    │          5723 │
│      2022 │ BI Data Analyst │          6270 │
│      2022 │ AI Developer    │          6304 │
│      2022 │ Data Analyst    │          6359 │
└───────────┴─────────────────┴───────────────┘

还可以使用关系API来连接两个数据集,在本例中我们通过更改“job_title”的别名名称来连接同一个数据集。

rel2 = duckdb.read_csv('ds_salaries.csv')
rel.set_alias('a').join(rel.set_alias('b'), 'job_title').limit(5)
┌───────────┬──────────────────┬─────────────────┬───┬──────────────┬──────────────────┬──────────────┐
│ work_year │ experience_level │ employment_type │ ... │ remote_ratio │ company_location │ company_size │
│   int64   │     varchar      │     varchar     │   │    int64     │     varchar      │   varchar    │
├───────────┼──────────────────┼─────────────────┼───┼──────────────┼──────────────────┼──────────────┤
│      2023 │ SE               │ FT              │ ... │          100 │ US               │ L            │
│      2023 │ MI               │ CT              │ ... │          100 │ US               │ S            │
│      2023 │ MI               │ CT              │ ... │          100 │ US               │ S            │
│      2023 │ SE               │ FT              │ ... │          100 │ US               │ S            │
│      2023 │ SE               │ FT              │ ... │          100 │ US               │ S            │
├───────────┴──────────────────┴─────────────────┴───┴──────────────┴──────────────────┴──────────────┤
│ 5 rows                                                                         21 columns (6 shown) │
└─────────────────────────────────────────────────────────────────────────────────────────────────────┘

持久存储

默认情况下,DuckDB运行在内存数据库中。这意味着创建的任何表都存储在内存中,而不是持久化到磁盘上。然而,通过使用.connect()方法,可以连接到磁盘上的持久化数据库文件。任何写入该数据库连接的数据都将保存到磁盘文件中,并在重新连接到同一文件时重新加载。

  1. 将使用.connect()方法创建一个数据库。

  2. 运行SQL查询创建一个表。

  3. 使用查询添加两条记录。

  4. 显示新创建的测试表。

 

import duckdb

con = duckdb.connect('kdn.db')

con.sql("CREATE TABLE test_table (i INTEGER, j STRING)")
con.sql("INSERT INTO test_table VALUES (1, 'one'),(9,'nine')")
con.table('test_table').show()

┌───────┬─────────┐
│   i   │    j    │
│ int32 │ varchar │
├───────┼─────────┤
│     1 │ one     │
│     9 │ nine    │
└───────┴─────────┘

我们也可以使用数据科学工资CSV文件创建新表:

con.sql('CREATE TABLE ds_salaries AS SELECT * FROM "ds_salaries.csv";')
con.table('ds_salaries').limit(5).show()
┌───────────┬──────────────────┬─────────────────┬───┬──────────────┬──────────────────┬──────────────┐
│ work_year │ experience_level │ employment_type │ ... │ remote_ratio │ company_location │ company_size │
│   int64   │     varchar      │     varchar     │   │    int64     │     varchar      │   varchar    │
├───────────┼──────────────────┼─────────────────┼───┼──────────────┼──────────────────┼──────────────┤
│      2023 │ SE               │ FT              │ ... │          100 │ ES               │ L            │
│      2023 │ MI               │ CT              │ ... │          100 │ US               │ S            │
│      2023 │ MI               │ CT              │ ... │          100 │ US               │ S            │
│      2023 │ SE               │ FT              │ ... │          100 │ CA               │ M            │
│      2023 │ SE               │ FT              │ ... │          100 │ CA               │ M            │
├───────────┴──────────────────┴─────────────────┴───┴──────────────┴──────────────────┴──────────────┤
│ 5 rows                                                                         11 columns (6 shown) │
└─────────────────────────────────────────────────────────────────────────────────────────────────────┘

执行完成所有任务后,必须关闭与数据库的连接。

con.close()

综上,DuckDB快速、简单,易于学习和管理,简洁性是DuckDB在数据科学界得到广泛应用的主要原因。DuckDB提供了一个直观的SQL接口,数据分析师和科学家很容易上手,安装简单直接,数据库文件轻巧且易于管理。

凭借强大的数据加载、管理和分析工具,DuckDB为数据科学提供了比其他数据库解决方案更具吸引力的选择。随着越来越多的数据专业人士发现DuckDB的用户友好性,DuckDB将在未来几年继续获得更多用户。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++中的数学问题---进制转换

二进制转十六进制 string binToHex(string bin){string hex"";if(bin.size()%4!0){for(int i0;i<(4-bin.size()%4);i){bin"0"bin;}}for(int i0;i<bin.size();i4){string tmpbin.substr(i,4);bitset<4>b(tmp);hexb.to_ulong()<10?char(b.t…

定点乘法器优化(3)---华为杯

一. 简介 在上次优化中&#xff0c;针对部分积生成进行了一个优化&#xff0c;将一个部分积生成的门电路数从221减少到了119。虽然减少了很多&#xff0c;但不够。本次将提出另外一种新的编码与部分积生成方式&#xff0c;将门电路的个数大大减少。 二. 新的编码方式 基4 Bo…

fiddler基本使用(上)

目录 1、Fiddler介绍 2、fiddler下载及安装证书 4、抓取手机包 5、fifter 数据包过滤 6、模拟限速 1、Fiddler介绍 本质&#xff1a;位于客户端与服务器端之间的代理。 fiddler会捕获客户端、服务器端的包&#xff0c;发送给彼此。 代理设置&#xff1a; 2、fiddler下载及…

VMware虚拟机无法上网的解决办法

&#xff08;1&#xff09;1、在虚拟机右下角的网络适配器上面观察该图标是否是有绿色的灯在闪烁&#xff0c;如果网络适配器是灰色的证明虚拟机的网络没有打开&#xff0c;而是被禁用了&#xff0c;在适配器上点击鼠标右键&#xff0c;打开【设置】&#xff0c;在【已连接】、…

医院影像PACS系统和放射影像科业务

前言&#xff1a;对于医院的放射科来说&#xff0c;要实现其业务效率&#xff0c;增强患者的就医体验&#xff0c;提升医院的服务质量&#xff0c;那么一个良好的PACS系统能够高效实现这一目标。本文以放射科为例&#xff0c;对PACS系统和就医流程进行一个简单的介绍&#xff0…

Golang time 包以及日期函数

time 包 在 golang 中 time 包提供了时间的显示和测量用的函数。 time.Now()获取当前时间 可以通过 time.Now()函数获取当前的时间对象&#xff0c;然后获取时间对象的年月日时分秒等信息。 示例代码如下&#xff1a; package mainimport ("fmt""time" )…

js实现上下无缝滚动(不卡顿)

效果图如下&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport"…

Java阶段五Day13

Java阶段五Day13 文章目录 Java阶段五Day13回顾昨天思路Redis五种数据类型和类型无关的命令基本类型——String基本类型——hash基本类型——list基本类型——set基本类型——zset&#xff08;sorted set&#xff09; Redis实现分布式锁抢锁的设计思路整改当前消费逻辑添加分布…

前端 | ( 十三)CSS3简介及基本语法(下)| 伸缩盒模型 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 系列笔记&#xff1a; 【HTML4】&#xff08;一&#xff09;前端简介【HTML4】&#xff08;二&#xff09;各种各样的常用标签【HTML4】&#xff08;三&#xff09;表单及HTML4收尾…

网工内推 | 网络安全工程师,有安全相关证书优先

01 航天四创科技有限责任公司 招聘岗位&#xff1a;网络安全工程师 职责描述&#xff1a; 1、根据项目的投标技术方案、适配测试方案等&#xff0c;制定网络系统、安全系统、主机系统、存储系统等的深化设计方案和实施方案&#xff1b; 2、安装、配置和搭建基于软硬件设备的网…

RocketMQ基本概念与入门

文章目录 MQ基本结构依赖案例:productConsumer 核心概念1.nameserver2.broker3.主题队列4.queue队列5. 生产者6.消费者分组和生产者分组7.消费点位 MQ基本结构 message: 消息数据对象product: 程序代码,生成消息,发送消息到队列consumer: 程序代码,监听(绑定)队列,获取消息,执行…

MPU6050简介

文章目录 简介参数IIC通信的从机地址硬件电路框图 简介 MPU6050是一个6轴姿态传感器&#xff0c;可以测量芯片自身X,Y,Z轴的加速度&#xff0c;角速度&#xff0c;从而得到姿态角&#xff0c;用于平衡车&#xff0c;飞行器等。 内部结构&#xff1a; 3轴加速度计&#xff08;A…

数据库运维作业2

1.理解MySQL主从复制原理。 主要基于MySQL二进制日志 主要包括三个线程&#xff08;2个I/O线程&#xff0c;1个SQL线程&#xff09; 1&#xff09;MySQL将数据变化记录到二进制日志中&#xff1b; 2&#xff09;Slave将MySQL的二进制日志拷贝到Slave的中继日志中&#xff1b; 3…

vscode插件unocss无法正常使用

官网文档&#xff1a;https://alfred-skyblue.github.io/unocss-docs-cn/integrations/vscode#VPSidebarNav 无法使用的原因 很多人在使用的时候会配置uno.config.ts文件&#xff0c;但这个文件不一定放置在根目录下。扩展程序将尝试在您的项目中查找 UnoCSS 配置。如果未找到…

selenium 获取请求响应信息,包括请求的响应头和响应体

在我们使用selenium请求网页时&#xff0c;有时不想从浏览器解析后的html标签获取数据&#xff0c;如果能直接获取url返回的json格式数据会更容易解析。就像request和scrapy爬虫返回的响应数据一样。那么&#xff0c;我们用selenium应该怎么做呢&#xff1f; selenium并不支持…

pytest——断言后继续执行

前言 在编写测试用例的时候&#xff0c;一条用例可能会有多条断言结果&#xff0c;当然在自动化测试用例中也会遇到这种问题&#xff0c;我们普通的断言结果一旦失败后&#xff0c;就会出现报错&#xff0c;哪么如何进行多个断言呢&#xff1f;pytest-assume这个pytest的插件就…

Git的核心概念:探索Git中的提交、分支、合并、标签等核心概念,深入理解其作用和使用方法

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

学生管理系统-02项目案例(2)

一、表单的验证 完成表单验证的步骤 在el-form表单元素上添加一个rules属性&#xff0c;rules中配置相关的验证规则 在el-form表单元素上添加:model将data中验证的响应式数据关联起来 在el-form-item中添加prop属性&#xff0c;该属性一定和rules中的key值对应来 <el-fo…

区块链实验室(12) - 网络拓扑对PBFT共识流量的影响

区块链实验室(10) - 实例说明PBFT的共识过程说明了1个简单又极端的网络&#xff0c;在这个网络中完成1个交易的共识&#xff0c;需要26次通信&#xff0c;见下图所示。 换1个网络&#xff0c;这个网络是强连通图&#xff0c;见下图。 在这个网络中完成1次交易&#xff0c;流量见…

vue3 +ts 报错 index.vue 不是模块

那是因为index.vue中创建了一个空的script标签&#xff0c;而且语法使用的是ts语法。vue-cli会用ts语法解析和校验 如果是无状态组件&#xff0c;删掉 如果是有状态组件&#xff0c;导出该组件的实例 去掉null的script后&#xff1a;