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;

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

相关推荐
计算机人哪有不疯的11 分钟前
Hadoop的组成,HDFS架构,YARN架构概述
大数据·数据库·hadoop·spark
文牧之18 分钟前
Oracle 通过 ROWID 批量更新表
运维·数据库·oracle
LLLLLindream23 分钟前
Redis——达人探店
数据库·redis·缓存
一只鹿鹿鹿34 分钟前
智慧能源大数据平台建设方案(PPT)
java·大数据·数据库·能源
马志远的生信笔记42 分钟前
质控脚本来喽
linux·数据分析
intcube1 小时前
集中运营、分散决策,寻找最佳财务规划的平衡点
大数据·信息可视化·数据分析·全面预算管理·财务管理·财务规划
时序数据说1 小时前
IoTDB 分段查询语句深度剖析:GROUP BY 与时序语义的完美结合
大数据·数据库·开源·时序数据库·iotdb
luo_guibin1 小时前
DVWA在线靶场-SQL注入部分
数据库·sql·mysql
Bing@DBA1 小时前
Oracle 19c 静默安装
数据库·oracle
IvorySQL1 小时前
探索表访问方法功能:顺序扫描分析
数据库·postgresql·开源数据库