DuckDB
约 4 分钟阅读
- duckdb/duckdbGitHubduckdb/duckdbduckdb/duckdb · MIT, C++ · 嵌入式 OLAP 数据库 · 类似 SQLite - 但列存储,面向分析 · 支持查询 Parquet, CSV · 向量引擎,并行查询 · 官方支持 SDK: Python, Java, C++, NodeJS, R笔记:DuckDB
- MIT, C++
- 嵌入式 OLAP 数据库
- 类似 SQLite - 但列存储,面向分析
- 支持查询 Parquet, CSV
- 向量引擎,并行查询
- 官方支持 SDK: Python, Java, C++, NodeJS, R
- 语法类似 pg - 使用 libpg_query
- musl binary #12523GitHubduckdb/duckdb/discussions/12523
- external table #14422GitHubduckdb/duckdb/discussions/14422
brew install duckdb # by macOS Homebrew
# by Download
curl -LO https://echo.wener.cc/github.com/duckdb/duckdb/releases/download/v0.8.0/duckdb_cli-osx-universal.zip
unzip duckdb_cli-osx-universal.zip
./duckdb
duckdb -hSELECT * FROM 'myfile.csv';
SELECT * FROM 'myfile.parquet';
SELECT * FROM 'myfile.json';
SELECT * FROM 'myfile.jsonl';
-- 行模式
.mode line
SELECT * FROM users WHERE id = 1;
-- csv, parquet
SELECT * FROM 'https://domain.tld/file.extension';
-- S3
SET s3_region='us-east-1';
SET s3_endpoint='<domain>.<tld>:<port>';
SET s3_url_style='path';
SET s3_access_key_id='<AWS access key id>';
SET s3_secret_access_key='<AWS secret access key>';
SET s3_session_token='<AWS session token>';
SELECT * FROM 's3://bucket/file.extension';
SELECT * FROM parquet_scan('s3://bucket/*.parquet');
SELECT COUNT(*) FROM parquet_scan('s3://bucket/folder*/100?/t[0-9].parquet');
SELECT * FROM parquet_scan('s3://bucket/*.parquet', FILENAME = 1);
SELECT * FROM parquet_scan('s3://bucket/*/file.parquet', HIVE_PARTITIONING = 1);
-- s3_uploader_max_parts_per_file, s3_uploader_max_filesize, s3_uploader_thread_limit
COPY table_name TO 's3://bucket/file.extension';
-- SQLite
CALL sqlite_attach('data.db');
PRAGMA show_tables;
-- PostgreSQL
-- connect string
CALL POSTGRES_ATTACH('');
SELECT * FROM POSTGRES_SCAN('', 'public', 'mytable');
-- CSV
SELECT * FROM read_csv_auto('test.csv');
-- HEADER=TRUE
-- read_csv_auto -> read_csv(AUTO_DETECT=TRUE)
SELECT * FROM read_csv_auto('test.csv', SAMPLE_SIZE=20000);
-- 导入
CREATE TABLE ontime AS SELECT * FROM read_csv_auto('test.csv');
-- 也可以先创建表再通过 COPY 导入
COPY ontime FROM 'test.csv' ( DELIMITER '|', HEADER, AUTO_DETECT TRUE );
-- PARQUET
SELECT * FROM parquet_scan('test.parquet');
SELECT * FROM 'test.parquet';
-- 多文件
SELECT * FROM parquet_scan('test/*.parquet');
-- 不导入但也提供查询
CREATE VIEW people AS SELECT * FROM parquet_scan('test.parquet');
-- 导入带压缩
COPY tbl TO 'result-zstd.parquet' (FORMAT 'PARQUET', CODEC 'ZSTD')
-- 导出表 - 可以 FORMAT PARQUET
COPY lineitem TO 'lineitem.tbl' ( DELIMITER '|', HEADER );
COPY lineitem(l_orderkey) TO 'orderkey.tbl' ( DELIMITER '|' );
COPY (SELECT 42 AS a, 'hello' AS b) TO 'query.csv' WITH (HEADER 1, DELIMITER ',');
-- 导出数据库
-- 导出到目录
EXPORT DATABASE 'target_directory';
-- 导出 CSV
EXPORT DATABASE 'target_directory' (FORMAT CSV, DELIMITER '|');
-- 导出 parquet 格式
EXPORT DATABASE 'target_directory' (FORMAT PARQUET);
-- 导入
IMPORT DATABASE 'target_directory'Awesome
- duckdb/pg_duckdbGitHubduckdb/pg_duckdb
- 作为 PG 插件使用 DuckDB
- supabase/postgres#1106GitHub Issuesupabase/postgres#1106
- duckdb/duckdb-wasmGitHubduckdb/duckdb-wasm
- 在 Web 内执行,基于 FS API 进行 IO 交互
- HN #32684424Hacker NewsHacker News #32684424Hacker News
- h2oai.github.io/db-benchmark
- duckdblabs/arrowGitHubduckdblabs/arrow
- Arrow - Python Binding
- evanwashere/duckdbGitHubevanwashere/duckdbduckdb/duckdb · MIT, C++ · 嵌入式 OLAP 数据库 · 类似 SQLite - 但列存储,面向分析 · 支持查询 Parquet, CSV · 向量引擎,并行查询 · 官方支持 SDK: Python, Java, C++, NodeJS, R笔记:DuckDB
- bun binding
- duckdb/ducklakeGitHubduckdb/ducklake
- integrated data lake and catalog format
- DuckDB UI 的 API duckdb/duckdb-ui/discussions/83GitHubduckdb/duckdb-ui/discussions/83
- ibero-data/duck-uiGitHubibero-data/duck-ui
- duckui.com
- extendsion
INSTALL httpserver FROM community;
LOAD httpserver;
-- curl -X POST -d "SELECT 'hello', version()" "http://user:pass@localhost:9999/"
-- default_format=JSONEachRow,JSONCompact
-- curl -X POST -d "SELECT 'hello', version()" "http://localhost:9999/?default_format=JSONCompact"
-- SELECT httpserve_start('localhost', 9999, 'user:pass');
-- X-API-Key
SELECT httpserve_start('localhost', 9999, 'supersecretkey');Inspect
PRAGMA storage_info('table_name');
SELECT * EXCLUDE (column_path, segment_id, start, stats, persistent, block_id, block_offset, has_updates)
FROM pragma_storage_info('names') USING SAMPLE 10 ROWS
ORDER BY row_group_id;extension
select * from duckdb_extensions();
install 'fts';
load 'fts';
-- 下载 http://extensions.duckdb.org/v0.6.1/osx_amd64/httpfs.duckdb_extension.gz
-- 本地 ~/.duckdb/extensions/v0.6.1/osx_amd64/httpfs.duckdb_extension
install 'httpfs';
load 'httpfs';- 不支持代理 duckdb/duckdb#3836GitHub Issueduckdb/duckdb#3836
ver=$(duckdb -version | cut -d ' ' -f 1)
mkdir -p ~/.duckdb/extensions/$ver/osx_amd64
cd ~/.duckdb/extensions/$ver/osx_amd64
# https://duckdb.org/docs/extensions/overview
for name in httpfs excel fts sqlite_scanner postgres_scanner json parquet jemalloc; do
[ -e $name.duckdb_extension ] && continue
echo Installing $name
curl -LO http://extensions.duckdb.org/$ver/osx_amd64/$name.duckdb_extension.gz
gzip -d $name.duckdb_extension.gz
doneload 'jemalloc';
load 'json';
load 'postgres_scanner';
load 'sqlite_scanner';- sqlite_scanner
sqlite_attach('data.sqlite')- 创建 view - 只能查 不能写- sqlite_scan -
SELECT * FROM sqlite_scan('data.sqlite', 'tab');- 直接查询单个表
- wasm
- visualizer
- 测试结果 -> HTML
pragma visualize_last_profiling_output('__TEST_DIR__/test.html')
- sqlsmith
- SQL 生成器,用于测试
- tpch
- tpcds
Settings
| name | value |
|---|---|
| memory_limit | |
| threads | |
| enable_progress_bar | |
| default_null_order | nulls_last |
SELECT current_setting('threads') AS threads;
SELECT *
FROM duckdb_settings()
WHERE name = 'threads';NodeJS
- duckdb/duckdb-node-neoGitHubduckdb/duckdb-node-neo
- npm:@duckdb/node-api
- 基于 @duckdb/node-bindings
- 直接使用 DuckDB C API, 不依赖 SQLite Node API
- 数据处理更高效
- 直接使用 DuckDB binaries 而不是重新构建
- npm:@duckdb/node-api
- duckdb/duckdb-nodeGitHubduckdb/duckdb-node
- npm
- 基于 SQLite Node API
- 使用的重新构建的 DuckDB
import duckdb from '@duckdb/node-api';
import { test } from 'vitest';
test('duckdb info', async () => {
console.log(duckdb.version());
console.log(duckdb.configurationOptionDescriptions());
});Version
- 1.2.0
- prefix alias
SELECT alias: column_name from t: table_name - rename column
SELECT * RENAME (a TO b) - star LIKE
SLEECT * LIKE '%_time'- 也支持
SIMILAR TO
- 也支持
- prefix alias
- upsert 0.6.2
- 支持 insert or replace/ignore
- 支持 on conflict
FAQ
duckdb vs SQLite3
| - | duckdb | SQLite |
|---|---|---|
| Since | 2018 | 2000-08-17 |
| 架构 | 列存 | 行存 |
| 场景 | OLAP | OLTP |
| 语言 | C++ | C |
| 多线程访问 | ❌ | ✅ |
| 生态 | ⭐️ | ⭐️⭐️⭐️ |
| 成熟 | ⭐️ | ⭐️⭐️⭐️ |
| 并发 | MVCC | fs lock |
| Native JSON | ✅ | ❌ |
关联信息
反向链接、本文链接的其他页面和外部资料。
反向链接
- Database Awesome笔记 · duckdb/duckdb
| name | stand for | · | Relational DBMS | 关系型数据库 | · | Key-value stores | KV 存储 | · | Document stores | 文档存储 | · | Time Series DBMS | 时序数据库 |
参考资料
GitHub16 条
- duckdb/duckdbgithub.com/duckdb/duckdb
- duckdb/duckdb-nodegithub.com/duckdb/duckdb-node
- duckdb/duckdb-node-neogithub.com/duckdb/duckdb-node-neo
- duckdb/duckdb-ui/discussions/83github.com/duckdb/duckdb-ui/discussions/83
- duckdb/duckdb-wasmgithub.com/duckdb/duckdb-wasm
- duckdb/duckdb/discussions/12523github.com/duckdb/duckdb/discussions/12523
- duckdb/duckdb/discussions/14422github.com/duckdb/duckdb/discussions/14422
- duckdb/duckdb#14436github.com/duckdb/duckdb/pull/14436
- duckdb/duckdb#3836github.com/duckdb/duckdb/issues/3836
- duckdb/ducklakegithub.com/duckdb/ducklake
- duckdb/pg_duckdbgithub.com/duckdb/pg_duckdb
- duckdblabs/arrowgithub.com/duckdblabs/arrow
- evanwashere/duckdbgithub.com/evanwashere/duckdb
- ibero-data/duck-uigithub.com/ibero-data/duck-ui
- Query-farm/httpservergithub.com/Query-farm/httpserver
- supabase/postgres#1106github.com/supabase/postgres/issues/1106
Hacker News1 条
- Hacker News #32684424HN #32684424
其他外链4 条
- duckdb.org/community_extensions/list_of_extensionsduckdb.org/community_extensions/list_of_extensions
- duckdb.org/docs/stable/configuration/overviewduckdb.org/docs/stable/configuration/overview
- duckdb.org/why_duckdb.htmlduckdb.org/why_duckdb.html
- h2oai.github.io/db-benchmarkh2oai.github.io/db-benchmark