PostgreSQL 外部数据包装器(FDW)
PostgreSQL FDW 是一种允许 PostgreSQL 访问外部数据源的插件机制。通过 FDW,用户可以在 PostgreSQL 中创建外部表,并对这些表执行 SQL 查询,就像操作本地表一样。FDW 使得跨多个数据源的查询和集成变得简单和高效。
DuckDB 介绍
DuckDB 是一款开源的内存内列存储数据库管理系统,专为分析工作负载设计。它轻量级且嵌入式,能够在本地机器上高效运行。DuckDB 提供了对多种数据格式的支持,其中最引人注目的是对 Parquet 文件的支持。
对parquet 数据文件支持比较完善, 列存储, 支持filter, projection的pushdown. 数据的过滤性能也不错.
国内目前也推出了duckdb_fdw,pg可以通过插件的方式直接外挂duckdb,把ducdb优秀的分析能力,以及性能非常不错的 Parquet reader
Parquet 格式具有许多适用于分析用例的属性:
-
列式表示意味着可以(有效地)读取各个列。无需总是读取整个文件! -
该文件包含每个行组中的每列统计信息(最小值/最大值,以及值的数量 NULL
)。如果不需要,这些统计信息允许读者跳过行组。 -
列压缩显着减小了格式的文件大小,从而降低了数据集的存储需求。这通常可以将大数据转化为中型数据。
DuckDB 的零依赖 Parquet reader 能够直接对 Parquet 文件执行 SQL 查询,无需任何导入或分析步骤。由于 Parquet 的自然列式格式,这非常快!
DuckDB 将以流式方式读取 Parquet 文件,这意味着您可以对不适合常驻内存的大型 Parquet 文件执行查询。
DuckDB 能够自动检测任何给定查询需要哪些列和行。这允许用户分析更大、更复杂的 Parquet 文件,而无需执行手动优化或投入更多硬件。
整体架构如下:
pg -> duckdb_fdw -> oss
把Parquet文件储存到对象储存,可以降低储存成本以及储存无限扩展
环境搭建
-- 需要先从duckdb_fdw 官网下载源码,编译后install到pg扩展库
-- 创建扩展
create extension duckdb_fdw;
-- 创建server
CREATE SERVER duckdb_server
FOREIGN DATA WRAPPER duckdb_fdw
OPTIONS (database '/var/lib/postgresql/duckdb/database.duckdb');
-- 连接s3需要先安装httpfs模块
-- INSTALL httpfs;
SELECT duckdb_execute('duckdb_server','INSTALL httpfs;');
-- LOAD httpfs;
SELECT duckdb_execute('duckdb_server','LOAD httpfs;');
-- 配置s3相关信息
SELECT duckdb_execute('duckdb_server','CREATE SECRET (
TYPE S3,
KEY_ID ''admin'',
SECRET ''admin'',
REGION ''us-east-1'',
ENDPOINT ''119.119.204.194:9000''
);');
-- 读取s3上的parquet
SELECT * FROM read_parquet('s3a://test/duckdb/new_table.parquet');
这里只是做了简单的测试,流程是已经可以实现了
parquet 存在对象储存上,如果是内网网络,parquet文件攒批合理,合理设置分区,利用好数据下推功能,这可以是一个非常轻量化的OLAP型数据库,迷你版greenplum