DuckDB:pg_duckdb集成DuckDB和PostgreSQL实现高效数据分析

pg_duckdb是PostgreSQL的扩展,它将DuckDB的列矢量化分析引擎和特性嵌入到PostgreSQL中。本文介绍pg_duckdb插件安装、特点以及如何快速入门使用。

pg_duckdb简介

pg_duckdb扩展将完全能够查询DuckDB中存储在云中的数据,就像它是本地的一样。DuckDB的"双重执行"功能让我们可以无缝地将本地PostgreSQL数据与DuckDB数据连接起来,我们将找出运行查询的最佳位置。作为用户无需关心计算在哪里运行,我们只需要弄清楚如何让它运行得更快。

此外,在分析领域中,通常会将数据从事务数据库迁移到分析存储库中。pg_duckdb扩展和DuckDB可以提供帮助;你可以在PostgreSQL中运行一个查询,从PostgreSQL数据库中提取最近的数据并将其写入DuckDB。你不需要导出和重新导入数据,也不需要设置CDC。

最后,分析程序和事务业务位于相同数据库方案缺点比较明显。从内存和CPU需求的角度来看,分析程序可能会非常耗费资源。一旦数据库规模超过特定限额,直接在生事务型数据库上运行分析程序是不合适的。DuckDB可以帮助将分析程序迁移到云端,这样人们甚至不需要更改正在运行的查询,就能让查询速度更快。

安装pg_duckdb

要构建pg_duckdb,需要下面依赖:

  • PostgreSQL 16或17
  • Linux或MacOS
  • PostgreSQL扩展的标准构建工具集
  • 构建DuckDB所需的构建工具

要构建和安装,运行:

复制代码
make install

在postgresql.conf配置文件中增加pg_duckdb配置:

复制代码
shared_preload_libraries = 'pg_duckdb'

接下来,加载pg_duckdb扩展:

复制代码
CREATE EXTENSION pg_duckdb;

重要提示:一旦加载,你可以通过运行SET duckdb.execution TO true。该选项是可选的,以避免破坏现有的查询。为了避免在每个会话中都这样做,你可以通过执行 ALTER USER my_analytics_user SET duckdb.execution TO true

验证安装结果

以下是几种验证 pg_duckdb 插件是否安装成功的方法:

  • 查看插件列表

连接到你的 PostgreSQL 数据库,可以使用命令行工具如 psql 或其他数据库管理工具。在数据库连接成功后,输入命令 dxSELECT * FROM pg_extension;,这两个命令都可以列出当前数据库中已安装的所有扩展插件。在列出的插件列表中,如果能找到 pg_duckdb,则说明插件安装成功。

  • 执行测试查询

在数据库连接成功后,尝试执行一条使用 pg_duckdb 插件功能的查询语句,例如:SELECT duckdb_version(); 这条语句会返回 DuckDB 的版本信息,如果能够成功执行并返回结果,说明 pg_duckdb 插件安装成功且可以正常工作。

  • 检查日志文件

查看 PostgreSQL 的日志文件,通常位于数据库的数据目录下,具体位置可以在 postgresql.conf 配置文件中找到,一般是 log_directory 配置项指定的目录。在日志文件中搜索与 pg_duckdb 相关的信息,如插件加载时的日志记录等,如果能找到类似 [INFO] Loading pg_duckdb extension 或其他表示插件成功加载的记录,则说明插件安装成功并已被正确加载。

特性介绍

由DuckDB引擎执行的SELECT查询可以直接读取PostgreSQL表

  • 能够读取存在于PostgreSQL和DuckDB中的数据类型。支持以下数据类型:数字、字符、二进制、日期/时间、布尔、uuid、json和数组。
  • 如果DuckDB由于任何原因不能支持查询,执行将返回到PostgreSQL。

从对象存储(AWS S3、Cloudflare R2或谷歌GCS)中读取parquet和CSV文件

  • SELECT n FROM read_parquet('s3://bucket/file.parquet') AS (n int)
  • SELECT n FROM read_csv('s3://bucket/file.csv') AS (n int)
  • 您可以将globs和数组传递给这些函数,就像在DuckDB中一样。

导出数据为parquet格式

  • COPY (SELECT foo, bar FROM baz) TO 's3://...'
  • COPY table TO 's3://...'

读写parquest格式数据

复制代码
COPY (
  SELECT count(*), name
  FROM read_parquet('s3://bucket/file.parquet') AS (name text)
  GROUP BY name
  ORDER BY count DESC
) TO 's3://bucket/results.parquet';

对象存储中数据可以连接PostgreSQL表、视图和物化视图

在PostgreSQL表上创建索引来加速你的DuckDB查询

安装DuckDB扩展语句:SELECT duckdb.install_extension('extension_name')

打开/关闭DuckDB执行设置

  • SET duckdb.execution = true|false

快速开始

最好的入门方法是使用pg_duckdb将PostgreSQL连接到一个新的或现有的对象存储桶(AWS S3, Minio等)。可以通过read_parquet、read_csv和iceberg_scan分别查询Parquet、CSV和Iceberg格式的数据。

  • 增强凭证并启用DuckDB httpfs扩展

    -- Session Token is Optional

    INSERT INTO duckdb.secrets

    (type, id, secret, session_token, region)

    VALUES ('S3', 'access_key_id', 'secret_access_key', 'session_token', 'us-east-1');

  • 拷贝数据至对象存储桶,无需ETL流程

    COPY (SELECT user_id, item_id, price, purchased_at FROM purchases)

    TO 's3://your-bucket/purchases.parquet;

  • 执行数据分析

    SELECT SUM(price) AS total, item_id

    FROM read_parquet('s3://your-bucket/purchases.parquet')

    AS (price float, item_id int)

    GROUP BY item_id

    ORDER BY total DESC

    LIMIT 100;

更多内容读者可以参考官方文档

相关推荐
一只爱撸猫的程序猿1 小时前
构建一个简单的智能文档问答系统实例
数据库·spring boot·aigc
nanzhuhe1 小时前
sql中group by使用场景
数据库·sql·数据挖掘
消失在人海中1 小时前
oracle sql 语句 优化方法
数据库·sql·oracle
Clang's Blog1 小时前
一键搭建 WordPress + MySQL + phpMyAdmin 环境(支持 PHP 版本选择 & 自定义配置)
数据库·mysql·php·wordpr
zzc9211 小时前
MATLAB仿真生成无线通信网络拓扑推理数据集
开发语言·网络·数据库·人工智能·python·深度学习·matlab
未来之窗软件服务2 小时前
JAVASCRIPT 前端数据库-V1--仙盟数据库架构-—-—仙盟创梦IDE
数据库·数据库架构·仙盟创梦ide·东方仙盟数据库
LjQ20402 小时前
网络爬虫一课一得
开发语言·数据库·python·网络爬虫
烙印6012 小时前
MyBatis原理剖析(二)
java·数据库·mybatis
RestCloud2 小时前
如何通过ETLCloud实现跨系统数据同步?
数据库·数据仓库·mysql·etl·数据处理·数据同步·集成平台
你是狒狒吗2 小时前
TM中,return new TransactionManagerImpl(raf, fc);为什么返回是new了一个新的实例
java·开发语言·数据库