一、DuckDB 数据库简介

DuckDB 是一款优秀的嵌入式 SQL 数据库管理系统,专注于分析查询处理。它以其轻量级、易用、高性能等特点在业界备受关注。以下是它的主要特性:

  • 嵌入式: DuckDB 直接嵌入到应用程序中,不需要单独的服务器进程,因此启动速度极快且内存占用少。
  • 易用: DuckDB 提供标准的 SQL 接口,熟悉 SQL 的朋友可以立即上手使用。它还支持绑定到 C/C++、Python 和 R 等语言,方便数据分析和嵌入式使用。
  • 高性能: DuckDB 在执行分析查询方面表现出色,尤其擅长聚合操作和大型数据集的复杂查询。其执行速度与许多传统数据库系统相比毫不逊色。

对应的优点如下:

  • 跨平台: DuckDB 支持多种操作系统和处理器架构,可以在各种环境中运行。
  • 无外部依赖: DuckDB 自包含,不需要安装其他软件或库。
  • 丰富的 SQL 功能: DuckDB 支持标准 SQL 的绝大多数特性,并且还扩展了一些高级功能,例如任意和嵌套子查询、窗口函数、排序规则、复杂类型 (数组、结构) 等。
  • 多数据库支持: DuckDB 可以连接 MySQL、PostgreSQL 和 SQLite 数据库,方便从其他系统读取数据并在 DuckDB 中进行分析。

本篇主要总结下Excel数据分析统计场景。

1echo hello
2yum -y install git 
3cd /opt
4rm -rf /opt/gohugo
5git clone git@codehub.devcloud.la-north-2.huaweicloud.com:mysite00001/gohugo.git

Duckdb 列名为中文时,使用where条件是会存在问题,需要修改列名称,不需要全部修改,仅修条件中需要使用到的即可。默认是内存数据库,所有数据在查询结束后都是不会存的,

 1-- read a set of CSV files combining columns by position
 2SELECT * FROM read_csv('flights*.csv');
 3
 4-- 查询excel 
 5INSTALL spatial;
 6LOAD spatial;
 7select * from ST_Read("11月.xlsx") ;
 8
 9-- 创建新的表
10create table test as select * from ST_Read("11月.xlsx") ;
11
12-- 修改列名称
13-- ALTER TABLE 表名 RENAME COLUMN 原列名 TO 新列名;
14
15
16SELECT * FROM st_read('test_excel.xlsx', layer = 'Sheet1');
17CREATE TABLE new_tbl AS SELECT * FROM st_read('test_excel.xlsx', layer = 'Sheet1');
18INSERT INTO tbl SELECT * FROM st_read('test_excel.xlsx', layer = 'Sheet1');
19
20CREATE TABLE 新表名 LIKE table1;
21INSERT INTO 新表名 SELECT * FROM table1;
22INSERT INTO 新表名 SELECT * FROM table2;
23
24link: https://duckdb.org/docs/guides/import/excel_import
25
26-- 写excel
27COPY tbl TO 'output.xlsx' WITH (FORMAT GDAL, DRIVER 'xlsx');
28COPY (SELECT * FROM tbl) TO 'output.xlsx' WITH (FORMAT GDAL, DRIVER 'xlsx');

可视化工具:https://zhuanlan.zhihu.com/p/627565479 https://duckdb.org/docs/guides/sql_editors/dbeaver

python连接操作

1import duckdb
2con = duckdb.connect("file.db")
3con.sql("CREATE TABLE integers (i INTEGER)")
4con.sql("INSERT INTO integers VALUES (42)")
5con.sql("SELECT * FROM integers").show()

读取目录下的所有excel文件,并插入到对应的表里:

 1import duckdb
 2import glob,os
 3
 4sql = '''
 5CREATE TABLE tbcopy AS SELECT * FROM st_read('./source/01.xlsx') LIMIT 0;
 6'''
 7
 8con = duckdb.connect("file.db")
 9con.install_extension('spatial')
10con.load_extension('spatial')
11cursor = con.cursor()
12cursor.execute(sql)
13
14directory = "/mnt/c/Users/y84315786/Downloads/test/source"
15pattern = os.path.join(directory, "*.xlsx")  # 匹配所有文件
16
17for filename in glob.glob(pattern):
18    print(filename)  # 打印文件路径
19    sql = "INSERT INTO tbcopy SELECT * FROM st_read('" + filename + "');"
20    cursor.execute(sql)
21
22con.close()

https://www.codemag.com/Article/2305071/Using-DuckDB-for-Data-Analytics

https://hakibenita.com/fast-excel-python

DuckDB 是一个强大、易用且高性能的数据库管理系统,非常适合需要快速进行数据分析和处理的场景。主要的适用场景如下:

  • 处理和存储表格数据集,例如来自 CSV 或 Parquet 文件的数据。
  • 交互式数据分析,例如连接和聚合多个大型表格。
  • 需要进行大量数据变更的场景,例如添加或删除行/列、附加新表等。
  • 需要将庞大的结果集传输到客户端的场景。