fbsql

在 SQL 中保持关系闭包的公式化统计建模扩展

概览

扩展包名版本分类许可证语言
fbsql0.1.0FUNCMITSQL
ID扩展名BinLibLoadCreateTrustReloc模式
4695fbsqlfbsql
相关扩展plr pg4ml pgml pg_math weighted_statistics

Requires PL/R 8.4.0 or newer; PIGSTY packages target PostgreSQL 16 through 18.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.1.01817161514fbsqlplr
RPMPIGSTY0.1.01817161514fbsql_$vplr_$v
DEBPIGSTY0.1.01817161514postgresql-$v-fbsqlpostgresql-$v-plr
OS / PGPG18PG17PG16PG15PG14
el8.x86_64N/AN/A
el8.aarch64N/AN/A
el9.x86_64N/AN/A
el9.aarch64N/AN/A
el10.x86_64N/AN/A
el10.aarch64N/AN/A
d12.x86_64N/AN/A
d12.aarch64N/AN/A
d13.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
N/AN/A
d13.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
N/AN/A
u22.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
N/AN/A
u22.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
N/AN/A
u24.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
N/AN/A
u24.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
N/AN/A
u26.x86_64N/AN/A
u26.aarch64N/AN/A

构建

您可以使用 pig build 命令构建 fbsql 扩展的 RPM / DEB 包:

pig build pkg fbsql         # 构建 RPM / DEB 包

安装

您可以直接安装 fbsql 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install fbsql;          # 当前活跃 PG 版本安装
pig ext install -y fbsql -v 18  # PG 18
pig ext install -y fbsql -v 17  # PG 17
pig ext install -y fbsql -v 16  # PG 16
dnf install -y fbsql_18       # PG 18
dnf install -y fbsql_17       # PG 17
dnf install -y fbsql_16       # PG 16
apt install -y postgresql-18-fbsql   # PG 18
apt install -y postgresql-17-fbsql   # PG 17
apt install -y postgresql-16-fbsql   # PG 16

创建扩展

CREATE EXTENSION fbsql CASCADE;  -- 依赖: plr

用法

来源:

fbsql 是一个统计建模 DSL 证明概念,它将关系型 SQL 查询作为输入并返回行数据,同时使用 R 公式语法描述模型。0.1.0 版本通过 PL/R 实现广义线性模型的拟合,并通过纯 PL/pgSQL 进行预测。

前提条件

FbSQL 在 PostgreSQL 16 上开发和测试,并需要 PL/R 8.4.0 或更高版本以及 R。plr 是一个不受信任的语言,因此超级用户必须安装依赖项和扩展。

CREATE EXTENSION fbsql CASCADE;
SELECT fbsql.version();

仅授予常规用户所需的函数访问权限和源数据权限。

核心工作流

拟合二元流失模型并保留返回的关系:

CREATE TEMP TABLE churn_model AS
SELECT *
FROM fbsql.fit_glm(
  relation => $$
    SELECT churn_flag, age, gender
    FROM customer
    WHERE created_at >= DATE '2025-01-01'
      AND created_at <  DATE '2026-01-01'
  $$,
  formula => 'churn_flag ~ age + gender',
  family => 'binomial'
);

预测接受新行的查询以及保存模型的查询。由于它返回 SETOF record,因此在调用时提供输出列:

SELECT customer_id, churn_flag_predicted
FROM fbsql.predict_glm(
  relation => $$SELECT customer_id, age, gender FROM customer_2026$$,
  model    => $$SELECT * FROM churn_model$$
) AS p(
  customer_id bigint,
  age integer,
  gender text,
  churn_flag_predicted double precision
);

重要对象

  • fbsql.fit_glm(relation, formula, family) 返回每个模型项的一行、重复拟合统计信息以及包含预测所需信息的 metadata jsonb
  • fbsql.predict_glm(relation, model, on_new_levels)<response>_predicted 添加到输入行。默认情况下,on_new_levelserror 或者设置为 na 以在未见过的因子水平上生成空预测。
  • fbsql.version() 报告扩展版本。

支持的功能和注意事项

0.1.0 版支持带有恒等连接的高斯模型以及带有对数几率连接的二项式模型,使用数值和因子预测变量。拟合应用完整案例分析并报告已用和丢弃的行数;预测在预测变量为空时返回 NULL。预测使用存储的系数和元数据,并不会在运行时调用 R。

交互、自定义对比度、偏移量、权重、预测区间、其他家庭和连接以及分布式拟合均不支持。relationmodel 参数包含 SQL 代码:从可信的 SQL 构造它们,而不是未经清理的用户输入,并审查执行角色的权限。