DuckDB入门

HongBao

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.quitctrl-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  │
├───────────┼────────────────┼──────────┤
2271313973713598227.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

输出如下:

CountryPopulationBirthrateDeathrate
Andorra71,2018,716,25
Austria8,192,8808,749,76
Belgium10,379,06710,3810,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