DuckDB越来越受欢迎,它将SQLite的简单易用性与专业列存储数据库的分析性能相结合。本文将带你通过Python示例了解更多信息。

微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩

图片

什么是DuckDB?

【网址】:https://duckdb.org/

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的安装指南。

【安装指南】:https://duckdb.org/#Installation:~:text=of%20the%20hassle.-,Installation,-Choose%20your%20environment

图片

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

【数据集链接】:https://www.kaggle.com/datasets/arnabchaki/data-science-salaries-2023

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”,只显示了三列,并对其进行了排序和限制,以显示基于薪资的排名后五位的职位。

通过以下指南了解有关关系API的更多信息。

【指南】:https://duckdb.org/docs/api/python/relational_api

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) │
└─────────────────────────────────────────────────────────────────────────────────────────────────────┘

直接SQL方法

也有直接方法。你只需编写SQL查询即可对数据集进行分析。你将写入CSV文件的位置和名称,而不是表名。

duckdb.sql('SELECT * FROM "ds_salaries.csv" LIMIT 5')
┌───────────┬──────────────────┬─────────────────┬───┬──────────────┬──────────────────┬──────────────┐
│ 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) │
└─────────────────────────────────────────────────────────────────────────────────────────────────────┘

持久存储

默认情况下,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的用户友好性,DuckDB将在未来几年继续获得更多用户。

推荐书单

IT BOOK 多得(点击查看5折活动书单)icon-default.png?t=N7T8https://u.jd.com/psx2y1M

《SQL数据分析实战(第2版)》

《SQL数据分析实战(第2版)》详细阐述了与SQL数据分析相关的基本解决方案,主要包括SQL数据分析导论、SQL和数据准备、聚合和窗口函数、导入和导出数据、使用复合数据类型进行分析、高性能SQL、科学方法和应用问题求解等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。

《SQL数据分析实战(第2版)》icon-default.png?t=N7T8https://item.jd.com/13803180.html

图片

精彩回顾

《优化SQL查询,实现高效数据检索(下)》

《优化SQL查询,实现高效数据检索(上)》

《7个不可不知的SQL知识点》

《10道不可不会的SQL面试题》

《云计算+数据科学,5步带你突破信息泛滥(下)》

《云计算+数据科学,5步带你突破信息泛滥(上)》

微信搜索关注《Python学研大本营》,加入读者群

访问【IT今日热榜】,发现每日技术热点

Logo

一站式 AI 云服务平台

更多推荐