DuckDB数据分析实战:CSV文件导入导出

在数据分析领域,CSV(Comma-Separated Values)是一种非常通用的数据交换格式。无论是 Excel 导出的报表、业务系统产生的数据、日志文件,还是不同数据库之间的数据传输,CSV 常常都是首选格式。

DuckDB 作为近年来最受欢迎的分析型数据库之一,对于 CSV 格式提供了开箱即用的支持。它不仅能够直接查询 CSV 文件,还能够快速将 CSV 导入数据库表,或者将查询结果导出为 CSV 文件。

本文使用的示例文件 databases.csv 内容如下:

text 复制代码
name, type, version
sqlite, oltp, 3.53.3
duckdb, olap, 1.5.4
mysql, oltp, 9.7.0

直接读取 CSV 文件

DuckDB 可以自动识别 CSV 文件格式、列名和字段类型,因此很多场景下甚至不需要创建表,直接查询文件即可。其中,最标准的方式是使用 read_csv() 函数。例如:

sql 复制代码
SELECT * FROM read_csv('databases.csv');

┌─────────┬─────────┬─────────┐
│  name   │  type   │ version │
│ varchar │ varchar │ varchar │
├─────────┼─────────┼─────────┤
│ sqlite  │  oltp   │  3.53.3 │
│ duckdb  │  olap   │  1.5.4  │
│ mysql   │  oltp   │  9.7.0  │
└─────────┴─────────┴─────────┘

DuckDB 可以自动解析文件内容并推断字段类型。当然,我们也可以显式指定字段类型等参数。例如:

sql 复制代码
SELECT *
FROM read_csv(
    'databases.csv',
    delim = ',',
    header = true,
    columns = {
        'name': 'VARCHAR',
        'type': 'VARCHAR',
        'version': 'VARCHAR'
    }
);

其中,delim 用于指定字段分隔符,header 表示是否包含表头,columns 用于指定字段类型。

更多关于 read_csv() 函数参数的介绍,可以参考官方文档

不仅如此,DuckDB 还能够根据文件扩展名自动识别 CSV 文件,因此甚至可以省略 read_csv() 函数:

sql 复制代码
SELECT * FROM 'databases.csv';

# 使用FROM优先的查询语法
FROM 'databases.csv' SELECT *;

这种写法更加简洁,也是许多 DuckDB 用户的常用写法。

如果某个目录下包含多个格式类似的文件,可以使用通配符一次读取。例如:

sql 复制代码
SELECT *
FROM read_csv('data/*.csv');

DuckDB 会把多个文件的数据自动合并成一个结果。

CSV 文件导入数据表

如果想要长期保存数据,可以基于 CSV 文件创建数据库表并导入数据:

sql 复制代码
CREATE TABLE db AS
SELECT *
FROM read_csv('databases.csv');

SELECT * FROM db;

DuckDB 会自动基于 CSV 文件推断字段类型并创建表,然后导入全部数据,整个过程一步完成。

同样,我们也可以采用 FROM 优先的查询语法进一步简化语句:

sql 复制代码
CREATE TABLE db AS
FROM 'databases.csv';

另一种场景是目标表已经存在,可以使用 INSERT INTO 语句导入数据:

sql 复制代码
DELETE FROM db;

INSERT INTO db
SELECT * FROM read_csv('databases.csv');

针对大批量数据导入场景,DuckDB 还提供了专门的数据装载语句(COPY):

sql 复制代码
DELETE FROM db;

COPY db
FROM 'databases.csv';

数据导出到 CSV 文件

如果想要把表中的数据导出为 CSV 文件,可以使用 COPY 语句。例如:

sql 复制代码
COPY db TO 'output.csv' (HEADER, DELIMITER ',');

其中,output.csv 是文件名,HEADER 表示导出表头,DELIMITER 指定字段的分隔符。

另外,COPY 语句也可以用于导出查询结果。例如:

sql 复制代码
COPY (SELECT name, version FROM db)
TO 'output.csv' (HEADER, DELIMITER ',');

总结

DuckDB 对于 CSV 格式的支持非常完善,既可以直接查询 CSV 文件,也可以导入到数据库表中,还可以将查询结果或表数据导出为 CSV 文件。同时,它还具备 CSV 格式自动探测功能,可以识别分隔符、表头、数据类型等信息,因此大部分情况下无需手工配置。

相关推荐
大数据魔法师6 小时前
DuckDB高阶实战指南!多文件处理、窗口函数、性能调优、工程化落地
python·数据分析
Patrick在香港7 小时前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
专注API从业者13 小时前
告别人工盯品!Open Claw 搭建京东商品全自动监控与数据分析系统(附完整可运行代码)
大数据·数据库·数据分析
生态博士的R笔记15 小时前
R语言方差分析:单因素与双因素ANOVA完整流程
数据分析
十三画者16 小时前
【文献分享】CANVAS:基于细胞构架与邻域信息的组织病理学虚拟空间肿瘤分析
人工智能·机器学习·数据挖掘·数据分析·数据可视化
yanweijie031718 小时前
Pandas 完整数据分析工作流实战(标准 5 步流程)
数据挖掘·数据分析·pandas
数模竞赛Paid answer20 小时前
2019年深圳杯数学建模A题深圳居民健康水平评估与测控模型研究解题全过程文档及程序
数学建模·数据分析·深圳杯数学建模挑战赛
数模竞赛Paid answer2 天前
2025年五一杯数学建模A题支路车流量推测问题求解全过程论文及程序
数学建模·数据分析·五一杯
cui_ruicheng2 天前
Python数据分析(十四):Pandas 数据可视化
python·信息可视化·数据分析·pandas
leisoo80972 天前
筹码分布数据分析实战:用Python构建主力建仓成本分析系统
python·数据挖掘·数据分析