大家好,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()
方法,可以连接到磁盘上的持久化数据库文件。任何写入该数据库连接的数据都将保存到磁盘文件中,并在重新连接到同一文件时重新加载。
将使用.connect()
方法创建一个数据库。
运行SQL查询创建一个表。
使用查询添加两条记录。
显示新创建的测试表。
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将在未来几年继续获得更多用户。