DuckDB 安装与使用:快速启动指南 – wiki词典

I apologize for the previous error. I made a mistake in trying to use a tool that is not available to me. I cannot directly write files to your file system with the tools I have.

Instead, I will provide the article content directly in my response.


DuckDB 安装与使用:快速启动指南

引言

在数据分析领域,我们经常需要处理大量数据并进行快速查询。传统的数据库系统可能需要复杂的配置和维护,这对于轻量级分析任务来说显得过于繁重。正是在这种背景下,DuckDB 应运而生。

什么是 DuckDB?

DuckDB 是一个开源的、嵌入式、进程内的分析型数据库管理系统(OLAP DBMS)。它被设计为在分析工作负载中提供卓越的性能,同时保持易用性和零配置的特点。与传统的服务器-客户端模式数据库不同,DuckDB 直接运行在你的应用程序内部,无需单独的服务器进程。

为什么选择 DuckDB?

  1. 极速性能: DuckDB 采用列式存储和向量化执行引擎,为分析查询(如聚合、过滤、连接)提供了惊人的速度。
  2. 易于使用: 作为嵌入式数据库,它无需复杂的安装或配置。你可以在几秒钟内启动并运行。
  3. 零依赖、无服务器: 它是一个独立的库,没有外部依赖,非常适合本地数据处理和边缘计算。
  4. SQL 兼容: 支持标准的 SQL 语法,这意味着你可以利用现有的 SQL 知识进行数据操作。
  5. 内存效率: 即使处理大型数据集,DuckDB 也能高效地利用系统内存。
  6. 广泛的数据格式支持: 可以直接查询 CSV、Parquet、JSON 等多种文件格式,而无需提前导入。
  7. 与 Python 等语言深度集成: 提供强大的 API,与 Python 的 Pandas 等数据科学库无缝协作。

安装

DuckDB 的安装非常简单,这里我们主要介绍 Python 和命令行工具(CLI)的安装方法。

1. Python 环境安装

如果你在 Python 环境中工作,安装 DuckDB 就像安装其他 Python 库一样简单:

bash
pip install duckdb

安装完成后,你就可以在 Python 脚本中导入并使用它了。

2. 命令行工具(CLI)安装

对于需要直接在终端进行操作的用户,DuckDB 也提供了独立的命令行工具。

  1. 下载预编译二进制文件:
    访问 DuckDB 官方下载页面,根据你的操作系统(Windows, macOS, Linux)下载对应的预编译二进制文件。

  2. 解压并添加路径:
    将下载的压缩包解压,把 duckdb (或 duckdb.exe 在 Windows 上) 可执行文件放到一个你希望的位置,并将其所在目录添加到系统的 PATH 环境变量中,以便你可以在任何地方运行 duckdb 命令。

  3. 验证安装:
    打开终端,输入:

    bash
    duckdb

    如果成功,你将看到 DuckDB 的 CLI 提示符,表示安装成功。

    v0.x.x
    Enter .help for usage hints.
    Connected to a transient in-memory database.
    Use .open FILENAME to connect to a persistent database.
    D>

基本使用

接下来,我们将通过一些简单的例子来演示 DuckDB 的基本用法。

1. 连接到数据库

你可以选择连接到内存数据库(数据不会持久化)或持久化数据库(数据存储在文件中)。

Python 示例:

“`python
import duckdb

连接到内存数据库

数据在会话结束后会丢失

con_memory = duckdb.connect(database=’:memory:’, read_only=False)
print(“Connected to in-memory database.”)

连接到持久化数据库

数据会存储在 ‘my_database.duckdb’ 文件中

con_persistent = duckdb.connect(database=’my_database.duckdb’, read_only=False)
print(“Connected to persistent database ‘my_database.duckdb’.”)

关闭连接 (重要!)

con_memory.close()
con_persistent.close()
“`

CLI 示例:

  • 内存数据库:
    直接运行 duckdb 命令就会连接到内存数据库。

    bash
    duckdb
    D>

  • 持久化数据库:
    使用 .open 命令连接或创建一个文件数据库。

    bash
    duckdb
    D> .open my_database.duckdb
    D>

    或者直接在启动时指定:
    bash
    duckdb my_database.duckdb
    D>

2. 创建表和插入数据

无论是 Python API 还是 CLI,SQL 语法都是通用的。

Python 示例:

“`python
import duckdb

con = duckdb.connect(database=’:memory:’)

创建表

con.execute(“””
CREATE TABLE employees (
id INTEGER,
name VARCHAR,
department VARCHAR,
salary DOUBLE
);
“””)
print(“Table ’employees’ created.”)

插入数据

con.execute(“””
INSERT INTO employees VALUES
(1, ‘Alice’, ‘Sales’, 60000),
(2, ‘Bob’, ‘Marketing’, 55000),
(3, ‘Charlie’, ‘Sales’, 70000),
(4, ‘David’, ‘Engineering’, 80000),
(5, ‘Eve’, ‘Marketing’, 62000);
“””)
print(“Data inserted into ’employees’.”)

con.close()
“`

CLI 示例:

“`sql
— 连接到内存数据库
— D> (默认)

— 创建表
CREATE TABLE employees (
id INTEGER,
name VARCHAR,
department VARCHAR,
salary DOUBLE
);

— 插入数据
INSERT INTO employees VALUES
(1, ‘Alice’, ‘Sales’, 60000),
(2, ‘Bob’, ‘Marketing’, 55000),
(3, ‘Charlie’, ‘Sales’, 70000),
(4, ‘David’, ‘Engineering’, 80000),
(5, ‘Eve’, ‘Marketing’, 62000);
“`

3. 查询数据

使用标准的 SELECT 语句进行数据查询。

Python 示例:

“`python
import duckdb

con = duckdb.connect(database=’:memory:’)

假设表和数据已创建(同上一步)

con.execute(“””
CREATE TABLE employees (
id INTEGER,
name VARCHAR,
department VARCHAR,
salary DOUBLE
);
“””)
con.execute(“””
INSERT INTO employees VALUES
(1, ‘Alice’, ‘Sales’, 60000),
(2, ‘Bob’, ‘Marketing’, 55000),
(3, ‘Charlie’, ‘Sales’, 70000),
(4, ‘David’, ‘Engineering’, 80000),
(5, ‘Eve’, ‘Marketing’, 62000);
“””)

查询所有员工

print(“All employees:”)
result = con.execute(“SELECT * FROM employees;”).fetchdf()
print(result)

查询销售部门的员工

print(“\nSales department employees:”)
result = con.execute(“SELECT name, salary FROM employees WHERE department = ‘Sales’;”).fetchdf()
print(result)

按部门计算平均工资

print(“\nAverage salary by department:”)
result = con.execute(“SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department;”).fetchdf()
print(result)

con.close()
“`

CLI 示例:

“`sql
— 查询所有员工
SELECT * FROM employees;

— 查询销售部门的员工
SELECT name, salary FROM employees WHERE department = ‘Sales’;

— 按部门计算平均工资
SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department;
“`

4. 读取外部文件

DuckDB 的一个强大功能是能够直接查询外部文件,而无需预先加载到数据库中。

Python 示例:

假设你有一个 data.csv 文件:
csv
product,price,quantity
Laptop,1200,5
Mouse,25,20
Keyboard,75,10
Monitor,300,3

你可以这样查询它:

“`python
import duckdb
import pandas as pd # 用于创建示例文件

创建一个示例 CSV 文件

data = {
‘product’: [‘Laptop’, ‘Mouse’, ‘Keyboard’, ‘Monitor’],
‘price’: [1200, 25, 75, 300],
‘quantity’: [5, 20, 10, 3]
}
df_sample = pd.DataFrame(data)
df_sample.to_csv(‘data.csv’, index=False)
print(“Created ‘data.csv’ for demonstration.”)

con = duckdb.connect(database=’:memory:’)

直接查询 CSV 文件

print(“\nQuerying ‘data.csv’:”)
result_csv = con.execute(“SELECT product, price * quantity AS total_value FROM ‘data.csv’ WHERE quantity > 5;”).fetchdf()
print(result_csv)

假设你有一个 Parquet 文件 (Python中通常通过pandas创建)

df_sample.to_parquet(‘data.parquet’, index=False)

result_parquet = con.execute(“SELECT * FROM ‘data.parquet’;”).fetchdf()

print(result_parquet)

con.close()
“`

CLI 示例:

“`sql
— 直接查询 CSV 文件 (假设 data.csv 存在于当前目录)
SELECT product, price * quantity AS total_value FROM ‘data.csv’ WHERE quantity > 5;

— 查询 Parquet 文件
— SELECT * FROM ‘data.parquet’;
“`

5. 与 Pandas DataFrame 交互 (Python 特有)

DuckDB 可以非常方便地与 Pandas DataFrame 进行交互,你可以直接在 SQL 查询中引用 DataFrame 对象。

“`python
import duckdb
import pandas as pd

con = duckdb.connect(database=’:memory:’)

创建一个 Pandas DataFrame

df_sales = pd.DataFrame({
‘region’: [‘East’, ‘West’, ‘East’, ‘North’, ‘West’],
‘product’: [‘A’, ‘B’, ‘A’, ‘C’, ‘A’],
‘revenue’: [100, 150, 120, 200, 110]
})
print(“Original Pandas DataFrame:”)
print(df_sales)

直接从 DataFrame 进行 SQL 查询

DuckDB 会自动将 DataFrame 识别为表

print(“\nQuerying DataFrame with DuckDB:”)
result_df_query = con.sql(“SELECT region, SUM(revenue) AS total_revenue FROM df_sales GROUP BY region ORDER BY total_revenue DESC;”).fetchdf()
print(result_df_query)

con.close()
“`

结论

DuckDB 以其卓越的性能、极简的安装和使用方式,以及对现代数据分析工作流的深度支持,迅速成为数据专业人员和开发者的利器。无论是进行本地的数据探索、构建嵌入式分析功能,还是作为 ETL/ELT 管道中的一环,DuckDB 都能提供高效且愉悦的体验。

通过本快速启动指南,你现在应该对 DuckDB 的安装和基本操作有了全面的了解。开始利用 DuckDB 的强大功能,让你的数据分析工作更加高效吧!

滚动至顶部