DuckDB入门

2.1支持环境
- DuckDB支持多种编程语言和操作系统,包括Linux、Windows、macOS(Intel/AMD和ARM架构)。 同时在Python、R、Java、JavaScript、Go、Rust、Node.js、Julia、C/C++、ODBC、JDBC、WASM、Swift等编程语言,以及命令行中也有相关支持。本文接下来的内容主要结合DuckDB的命令行工具来介绍
2.2安装DuckDB CLI
2.2.1 macOS系统
- 使用Homebrew包管理器安装,先安装Homebrew(若已安装则跳过),再执行
brew install duckdb
命令。
# 安装 Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/\
Homebrew/install/HEAD/install.sh)"
2.2.2 Linux和Windows系统
- 从GitHub Releases页面获取适合系统架构的安装包,如在Linux上获取AMD64架构的安装包,下载后解压并运行可执行文件(注意更新链接到最新版本)。
- Linux 可以执行下列命令
wget https://github.com/duckdb/duckdb/releases/download/v1.1.3/duckdb_cli-linux-amd64.zip
unzip duckdb_cli-linux-amd64.zip
我的电脑是Window所以,以这个作为示例来安装 DuckDB,且后续环境系统也是以 Window 为主
- Window 可以执行下列命令
winget install DuckDB.cli
输出如下
已找到 DuckDB CLI [DuckDB.cli] 版本 1.1.3
此应用程序由其所有者授权给你。
Microsoft 对第三方程序包概不负责,也不向第三方程序包授予任何许可证。
此包需要以下依赖项:
- 程序包
Microsoft.VCRedist.2015+.x64
正在下载 https://github.com/duckdb/duckdb/releases/download/v1.1.3/duckdb_cli-windows-amd64.zip
██████████████████████████████ 9.63 MB / 9.63 MB
已成功验证安装程序哈希
正在提取存档...
已成功提取存档
正在启动程序包安装...
添加了命令行别名: "duckdb"
已修改路径环境变量;重启 shell 以使用新值。
已成功安装
2.3使用DuckDB CLI
使用 duckdb
命令,打开一个临时内存数据库
duckdb
v1.1.3 19864453f7
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D
2.3.1 SQL语句执行
输入以下SQL,可以体验一下执行与输出
D select v.* from values (1),(3),(3),(7) as v;
┌───────┐
│ col0 │
│ int32 │
├───────┤
│ 1 │
│ 3 │
│ 3 │
│ 7 │
└───────┘
- 在命令行直接输入或粘贴SQL语句,以分号和换行结束,语句将直接执行并以紧凑表格格式输出结果(可通过
.mode
命令更改输出格式),执行过程中会显示进度条(对于长时间运行的操作)。
2.3.2特殊命令(Dot Commands)
.open
关闭当前数据库并打开新数据库.read
读取SQL文件执行.tables
列出当前可用表和视图.timer
控制SQL计时输出.mode
控制输出格式.maxrows
控制默认显示行数.excel
以电子表格形式显示下一个命令的输出.exit
或.quit
或ctrl-d
退出CLI
可以通过 .help
获取所有特殊命令的概述。
2.3.3 CLI参数
-readonly
以只读模式打开数据库、-json
设置输出为JSON格式-line
设置输出为行格式-unsigned
允许加载未签名扩展-s COMMAND
或-c COMMAND
运行命令后退出(常与.read
命令结合使用)- 通过
duckdb -help
可获取所有可用CLI参数。
duckdb --json -c 'select v.* from values (1),(3),(3),(7) as v;'
[{"col0":1},
{"col0":3},
{"col0":3},
{"col0":7}]
2.4 DuckDB的扩展系统
- DuckDB有扩展系统,可安装额外功能。使用
duckdb_extensions
函数查看所有扩展(包括已安装和未安装),其返回信息包含扩展名称、是否安装和加载等。通过INSTALL
命令安装扩展,LOAD
命令加载扩展(自0.8版本起,数据库会自动加载所需扩展)。例如,使用httpfs
扩展可直接查询互联网上的文件(如CSV文件),先安装并加载该扩展,再使用FROM
语句查询文件(可通过相关函数查看扩展安装路径等信息)。
- 查看目前安装并加载的所有扩展
SELECT extension_name, loaded, installed
from duckdb_extensions()
ORDER BY installed DESC, loaded DESC;
┌──────────────────┬─────────┬───────────┐
│ extension_name │ loaded │ installed │
│ varchar │ boolean │ boolean │
├──────────────────┼─────────┼───────────┤
│ autocomplete │ true │ true │
│ fts │ true │ true │
│ icu │ true │ true │
│ json │ true │ true │
│ parquet │ true │ true │
│ shell │ true │ true │
│ tpch │ true │ true │
│ arrow │ false │ false │
│ aws │ false │ false │
│ azure │ false │ false │
│ delta │ false │ false │
│ excel │ false │ false │
│ httpfs │ false │ false │
│ iceberg │ false │ false │
│ inet │ false │ false │
│ jemalloc │ false │ false │
│ motherduck │ false │ false │
│ mysql_scanner │ false │ false │
│ postgres_scanner │ false │ false │
│ spatial │ false │ false │
│ sqlite_scanner │ false │ false │
│ substrait │ false │ false │
│ tpcds │ false │ false │
│ vss │ false │ false │
├──────────────────┴─────────┴───────────┤
│ 24 rows 3 columns │
└────────────────────────────────────────┘
- 使用
INSTALL
命令安装扩展
D INSTALL httpfs;
100% ▕████████████████████████████████████████████████████████████▏
D FROM duckdb_extensions() SELECT loaded, installed, install_path WHERE extension_name = 'httpfs';
┌─────────┬───────────┬────────────────────────────────────────────────────────────────────────────────┐
│ loaded │ installed │ install_path │
│ boolean │ boolean │ varchar │
├─────────┼───────────┼────────────────────────────────────────────────────────────────────────────────┤
│ false │ true │ C:\Users\Ouran\.duckdb\extensions\v1.1.3\windows_amd64\httpfs.duckdb_extension │
└─────────┴───────────┴────────────────────────────────────────────────────────────────────────────────┘
D Load httpfs;
D FROM duckdb_extensions() SELECT loaded, installed, install_path WHERE extension_name = 'httpfs';
┌─────────┬───────────┬────────────────────────────────────────────────────────────────────────────────┐
│ loaded │ installed │ install_path │
│ boolean │ boolean │ varchar │
├─────────┼───────────┼────────────────────────────────────────────────────────────────────────────────┤
│ true │ true │ C:\Users\Ouran\.duckdb\extensions\v1.1.3\windows_amd64\httpfs.duckdb_extension │
└─────────┴───────────┴────────────────────────────────────────────────────────────────────────────────┘
2.5使用DuckDB CLI分析CSV文件
因为安装了上面的模块,所以可以尝试读取 远程HTTP服务器上或者云存储中的数据文件:
D SELECT count(*) FROM 'https://github.com/bnokoro/Data-Science/raw/master/countries%20of%20the%20world.csv';
┌──────────────┐
│ count_star() │
│ int64 │
├──────────────┤
│ 227 │
└──────────────┘
当然有时候远程文件地址无法直接知道文件类型的情况下会报错:
D SELECT count(*) FROM 'https://bit.ly/3KoiZR0';
Catalog Error: Table with name https://bit.ly/3KoiZR0 does not exist!
Did you mean "pg_attribute"?
LINE 1: SELECT count(*) FROM 'https://bit.ly/3KoiZR0';
这时候可以考虑使用一些内置的辅助函数如 read_csv_auto
来完成查询并得到结果:
D SELECT count(*) FROM read_csv_auto("https://bit.ly/3KoiZR0");
┌──────────────┐
│ count_star() │
│ int64 │
├──────────────┤
│ 227 │
└──────────────┘
2.5.1结果模式
- 可通过
.mode <name>
选择不同结果显示模式,包括表格模式(如duckbox、box、csv、ascii、table、list、column)和行模式(如json、jsonline、line),还有html、insert、trash等其他模式。默认是duckbox模式,行模式适用于多列数据展示,如分析包含多列信息的CSV文件时,先用.mode line
切换到行模式查看所有列,再切换回其他模式(如duckbox模式)进行特定查询和结果展示。
- 行模式
D .mode line
D SELECT * FROM read_csv_auto("https://bit.ly/3KoiZR0") limit 1;
Country = Afghanistan
Region = ASIA (EX. NEAR EAST)
Population = 31056997
Area (sq. mi.) = 647500
Pop. Density (per sq. mi.) = 48,0
Coastline (coast/area ratio) = 0,00
Net migration = 23,06
Infant mortality (per 1000 births) = 163,07
GDP ($ per capita) = 700
Literacy (%) = 36,0
Phones (per 1000) = 3,2
Arable (%) = 12,13
Crops (%) = 0,22
Other (%) = 87,65
Climate = 1
Birthrate = 46,6
Deathrate = 20,34
Agriculture = 0,38
Industry = 0,24
Service = 0,38
- 表格模式
SELECT count(*) AS countries,max(Population) AS max_population,round(avg(cast("Area (sq. mi.)" AS decimal))) AS avgArea FROM read_csv_auto("https://bit.ly/3KoiZR0");
┌───────────┬────────────────┬──────────┐
│ countries │ max_population │ avgArea │
│ int64 │ int64 │ double │
├───────────┼────────────────┼──────────┤
│ 227 │ 1313973713 │ 598227.0 │
└───────────┴────────────────┴──────────┘
当然也可以利用 DuckDB 将远程数据文件的查询结果保存到本地文件中:
duckdb -csv \
-s "SELECT Country, Population, Birthrate, Deathrate
FROM read_csv_auto('https://bit.ly/3KoiZR0')
WHERE trim(region) = 'WESTERN EUROPE'" \
> western_europe.csv
head -n3 western_europe.csv
输出如下:
Country | Population | Birthrate | Deathrate |
---|---|---|---|
Andorra | 71,201 | 8,71 | 6,25 |
Austria | 8,192,880 | 8,74 | 9,76 |
Belgium | 10,379,067 | 10,38 | 10,27 |
上述列子是导出到CSV格式,也可导出到Parquet格式等
总结
- DuckDB可作为库用于Python、R、Java、JavaScript、Julia、C/C++、ODBC、WASM和Swift等语言。
- CLI支持额外的点命令,用于控制输出、读取文件、获取内置帮助等。
- 通过
.mode
,可以使用多种显示模式,包括duckbox、line和ascii等。 - 安装
httpfs
扩展后,可以直接从HTTP服务器查询CSV文件。 - 在任何数据管道中,你可以将CLI用作一个步骤,无需创建表,通过查询外部数据集并将结果写入标准输出或其他文件。
Publish on 2025-01-01,Update on 2025-02-10