news 2026/4/3 4:38:40

进阶指南:在 DWS 中利用 PL/Python 解锁数据库无限可能

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
进阶指南:在 DWS 中利用 PL/Python 解锁数据库无限可能

本文分享自华为云社区《进阶指南:在 DWS 中利用 PL/Python 解锁数据库无限可能》

一、 为什么选择 PL/Python?

本功能适用版本:9.1.1.200及以上

在传统的 SQL 处理中,面对复杂的数学运算、文本解析或机器学习推理时,SQL 语句往往变得臃肿且难以维护。DWS 提供的PL/Python扩展,将 Python 强大的生态系统直接引入数据库内部。

  • 逻辑下沉:直接在数据存储处进行逻辑处理,减少数据在网络和应用层之间的频繁传输。

  • 生态复用:直接使用 Pandas、Numpy 等成熟库,无需重复造轮子。

  • 开发效率:相比存储过程(PL/pgSQL),Python 的语法更简洁,对于熟悉 AI 和大数据开发的工程师几乎零门槛。

二、 核心原理与架构:什么是 Fenced 模式?

在 DWS 中,Python UDF 函数强制要求使用Fenced 模式

补充说明:

  • 隔离安全性:Fenced 模式意味着 Python 解释器运行在数据库核心进程之外的独立守护进程中。即便 Python 代码因为逻辑问题(如内存溢出或调用了不稳定的第三方库)崩溃,也不会影响数据库内核的稳定性。

  • 资源控制:可以更好地监控和限制 Python 进程占用的 CPU 和内存资源。

三、 语法深度解析

1. 参数映射关系

DWS 会自动完成 SQL 类型到 Python 类型的转换。

  • INT/BIGINTint
  • TEXT/VARCHARstr
  • BOOLbool
  • ARRAYlist

2. 空值处理 (STRICT 关键字)

add_int_arr示例中用到了STRICT

  • STRICT:意味着如果输入参数中有任何一个为NULL,函数将直接返回NULL,而不进入 Python 内部逻辑。这能有效避免 Python 抛出TypeError

3. python基本语法规则

Python UDF函数必须严格遵循Python基本语法规则,例如:

  1. 使用缩进表示代码块,默认每层缩进4个空格;

  2. 以冒号开始新代码块,if/for/while/def/class/try/with 等后面跟冒号

  3. 区分大小写:var与VAR表示不同的变量

  4. 合法标识符:变量名开头为字母/数字/下划线,不能以数字开头

四、 实战场景:从基础到高阶

创建示例表temp并插入数据。 CREATE TABLE temp (a INT ,b INT); INSERT INTO temp VALUES (1,2),(2,3),(3,4),(4,5),(5,6);

场景 A:基础数值比较 (pymax 示例)

CREATE OR REPLACE FUNCTION pymax(a INT, b INT) RETURNS INT LANGUAGE plpython3u FENCED AS $$ if a > b: return a; else: return b; $$;

使用函数pymax比较表temp的a列和b列并返回最大值。

SELECT pymax(a, b) FROM temp order by 1; pymax ------- 2 3 4 5 6 (5 rows)

场景 B:科学计算与向量化处理

DWS-PythonUDF通过内置支持的 Numpy、scipy等库, 可以处理复杂的线性代数运算。

库名功能
numpy提供了一个强大的N维数组对象ndarray,以及许多用于数组操作、数学函数、随机数生成等的工具。
pandas用于数据操作和分析。它提供了高效、灵活且易于使用的数据结构,尤其适合处理和分析表格数据(如电子表格、SQL 数据、CSV 文件等)。
scipy提供了基于NumPy的高效数值算法和函数,涵盖了优化、积分、插值、线性代数、统计等多个领域。
scikit-learn提供了简单高效的工具用于数据挖掘和机器学习,支持分类、回归、聚类、降维、模型选择等任务。

创建Python UDF函数add_int_arr使用第三方库numpy,计算a数组和b数组中第一个元素相加的和

CREATE OR REPLACE FUNCTION add_int_arr(a int8[], b int2[]) RETURNS int8[] AS $$ import numpy return [a[0]+b[0]] $$ LANGUAGE plpython3u strict shippable;

您可以尝试查看pg_proc表来确认你的函数是否已经成功注册,并观察fencedmode字段是否为t,sql见附录

使用Python UDF函数add_int_arr,计算出数组第一个元素11和2的和为13。

使用Python UDF函数add_int_arr,计算出数组第一个元素11和2的和为13。 SELECT add_int_arr(ARRAY[11,2,3,4],ARRAY[2,4,5,5]); add_int_arr ------------- {13} (1 row)

场景 C:大模型特征算子

这是 PL/Python 最具应用价值的场景,大模型特征算子以extension形式封装为文件置于DWS系统,通过CREATE EXTENSION命令创建,大模型直接调用封装好的Python UDF函数。(该功能仅9.1.1.200及以上集群版本支持)

用户创建EXTENSION,加载大模型特征算子bq_ops。创建完成后,Python UDF函数自动完成加载,大模型特征算子函数及功能见附录。函数类型均为pythonUDF,返回值类型均为double,反映当前信号的某些特征值。 CREATE EXTENSION bq_ops;

创建表bq_col_table,device_code表示当前设备号,measuring_point_code表示测量点编码,date_time表示信号采集日期,high_array列表示当前接收的信号

CREATE TABLE bq_col_table( device_code varchar, measuring_point_code text, date_time timestamp with time zone, high_array double precision[] ) with (orientation=column, enable_hstore_opt=true);

每过1小时采集10秒钟信号,假设当前入库时数据如下。

INSERT INTO bq_col_table VALUES ('10098819','3a138131-344a-af96-9e9d-da049656d905','2024-07-13 17:59:59+08:00','{0.527995824813842,-0.62188184261322,-0.332374721765518,-0.139671847224235,-0.308928370475769,-0.165734529495239,0.137558653950691,-0.923967480659484,-0.398990541696548,0.620271801948547,0.366085141897201,-0.873452186584472,-1.00577819347381,-0.581831872463226,0.0675214752554893,0.789226412773132,-0.643114387989044,-0.779465496540069,0.913703441619873,1.33372521400451,-0.0830182060599327,0.621579945087432,1.48476803302764}');

调用算子get_rms()计算信号均方根值,当前样本信号的振动信号能量强度。上述样例数据结果为:

SELECT device_code, measuring_point_code, date_time, get_rms(high_array) FROM bq_col_table; device_code | measuring_point_code | date_time | get_rms -------------+--------------------------------------+------------------------+------------------ 10098819 | 3a138131-344a-af96-9e9d-da049656d905 | 2024-07-13 17:59:59+08 | .705324261533061 (1 row)

重复上述步骤,采集10天信号数据为样本,设定rms的正常取值区间,假设为[0.5, 0.8]。 若出现异常信号入库,其rms值约为1.43

INSERT INTO bq_col_table VALUES ('10098828','3a138131-344a-af96-9e9d-da049656d905','2024-07-13 07:59:59+08:00','{0.544054210186004,-0.769003570079803,-1.79972970485687,0.659896433353424,1.65061652660369,-0.221043065190315,-1.83933162689208,-2.58152985572814,-0.627029538154602,2.1537218093872,2.14685225486755,-0.0429693721234798,-1.21243667602539,-1.02749335765838,-0.526543200016021,-0.0408141687512397,1.96406400203704,2.1080584526062,0.257277429103851,-1.36532151699066,-2.31293749809265,-0.803890943527221,1.13646578788757}'); SELECT device_code, measuring_point_code, date_time, get_rms(high_array) FROM bq_col_table; device_code | measuring_point_code | date_time | get_rms -------------+--------------------------------------+------------------------+------------------ 10098819 | 3a138131-344a-af96-9e9d-da049656d905 | 2024-07-13 17:59:59+08 | .705324261533061 …… 10098828 | 3a138131-344a-af96-9e9d-da049656d905 | 2024-07-13 07:59:59+08 | 1.43480152874657

异常值大于rms的正常取值区间[0.5, 0.8],据此,工程师将根据其设备号与入库时间排查此异常场景。

五、 PL/Python 使用限制与避坑指南

  1. 版本要求:必须在 9.1.1.200 及以上集群版本使用。

  2. Fenced 模式强制要求:确保在定义时加上FENCED关键字。

  3. 网络开销:由于 Fenced 模式涉及进程间通信(IPC),对于执行时间极短(纳秒级)的微型函数,频繁调用可能会产生一定开销。建议将复杂逻辑整合在单个 UDF 中处理批量数据。

六、 总结

PL/Python 为 DWS 注入了处理非结构化数据和高级算法的能力。它不仅是一个语法扩展,更是将“数据仓库”升级为“算法中心”的关键桥梁。无论你是想做智能风控、时序分析,还是简单的复杂字符串清洗,PL/Python 都是你的首选利器。


附录

1、查看pymax函数

SELECT * FROM pg_proc where proname='pymax'; -[ RECORD 1 ]----+-------------- proname | pymax pronamespace | 2200 proowner | 10 prolang | 16616 procost | 100 prorows | 0 provariadic | 0 protransform | - proisagg | f proiswindow | f prosecdef | f proleakproof | f proisstrict | f proretset | f provolatile | v pronargs | 2 pronargdefaults | 0 prorettype | 23 proargtypes | 23 23 proallargtypes | proargmodes | proargnames | {a,b} proargdefaults | prosrc | | if a > b: | return a; | else: | return b; | probin | proconfig | proacl | prodefaultargpos | fencedmode | t proshippable | f propackage | f prokind | f

表1 函数列表 - 基础时域特征指标

函数名参数算子功能
get_mean_square(signal double precision[])均方值:反映振动信号在时间域内的平均能量水平
get_rms(signal double precision[])均方根值(有效值):一般表征振动信号能量或强度
get_var(signal double precision[])方差值:反映信号幅值相对于其平均值的离散程度
get_pk_pk(signal double precision[])峰峰值:表征振动信号幅值波动范围的重要指标
get_shape_factor(signal double precision[])波形指标:RMS与绝对平均值的比值,反映波形与正弦波的偏离程度
get_crest(signal double precision[])峰值因数:峰值与有效值的比例,描述信号的冲击特性
get_impulse(signal double precision[])脉冲因数:峰值与平均值的比例,评估瞬时能量集中程度
get_clearance(signal double precision[])裕度:峰值与方根幅值比值,对严重局部故障产生的剧烈冲击敏感
get_skewness(signal double precision[])偏斜度:反映信号幅值分布相对于平均值的偏斜方向和程度
get_kurt(signal double precision[])峭度:反映幅值分布尖锐程度,常用于检测异常冲击事件
get_kurt_aver(signal double precision[])平均峭度:多组信号峭度的平均值,评估长期冲击特性变化
get_gini(signal double precision[])基尼指数:表征信号能量分布均匀性或集中程度
get_env_rms(signal double precision[])包络谱均方根:反映信号中调制成分(如故障特征频率)的强度
get_ehr(signal double precision[])谐波率:评估信号中谐波成分强度,反映周期性或非线性特征
  • 频域及声学特征指标

函数名参数算子功能
get_sharpness(signal[], fs int)尖锐度:反映中高频成分多少,数值越大听起来越尖锐
get_roughness(signal[], fs int)粗糙度:感知粗糙程度指标,描述声音时间上的快速波动
get_spec_ctrd(signal[], fs int)重心频率:信号功率谱的质量中心,反映能量集中位置
get_spec_ms(signal[],fs int)均方频率:各频率分量平方的加权平均,反映能量频率分布
get_spec_rms(signal[],fs int)均方根频率:描述信号频谱的总体分布情况
get_spec_var_ctrd(signal[], fs int)频谱方差:反映信号频率成分的分散程度
get_spec_std_ctrd(signal[], fs int)频谱标准差:频率方差的平方根,描述频谱分布离散程度
get_pse(signal[], fs int)谱熵:基于信息熵概念,表征频域能量分布的复杂度或无序度
get_mpf(signal[], fs int)转速:单位时间内的旋转次数,通常以 RPM 表示
  • 带通滤波分段指标 (BPF)

    函数名频率范围计算指标描述
    get_bpf_0_500_rms0-500Hz有效值(RMS)描述低频信号的能量强度
    get_bpf_500_2000_rms500-2000Hz有效值(RMS)描述中频信号的能量强度
    get_bpf_2000_inf_rms2000Hz-fs/2有效值(RMS)描述高频信号的能量强度
    get_bpf_0_500_kurt0-500Hz峭度描述低频信号中冲击性的强弱
    get_bpf_500_2000_kurt500-2000Hz峭度描述中频信号中冲击性的强弱
    get_bpf_2000_inf_kurt2000Hz-fs/2峭度描述高频信号中冲击性的强弱
    get_bpf_0_500_ehr0-500Hz谐波率描述低频谐噪比
    get_bpf_500_2000_ehr500-2000Hz谐波率描述中频谐噪比
    get_bpf_2000_inf_ehr2000Hz-fs/2谐波率描述高频谐噪比
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 0:03:21

应对安全合规压力:国产DevOps系统选型中全流程安全管控能力评估框架

在数字化转型加速与合规要求日益严苛的背景下,DevOps 平台的全流程安全管控能力已成为企业选型的核心底线。一套科学的评估框架需覆盖 “事前预防、事中管控、事后追溯” 全流程,结合技术架构、功能落地、合规适配、实践验证四大维度,全面衡量…

作者头像 李华
网站建设 2026/3/24 23:50:34

基于随机函数链接神经网络模型的锂电池健康状态SOH预测附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

作者头像 李华
网站建设 2026/3/27 9:56:00

基于MATLAB的塞曼效应与F - P干涉仪模拟之旅

基于MATLAB的塞曼效应及法布里-珀罗干涉仪( F-P )标准具的模拟系统 实现生成平面波和球面波分布子函数 根据平行平板多光束干涉原理实现F-P干涉仪数值模拟 塞曼效应数值模拟及F-P标准具数值计算显示其结果附带文档 只成品,不代做。在光学研究…

作者头像 李华
网站建设 2026/3/28 7:05:57

Comsol 磁流变弹性体仿真:探索磁力耦合与磁场分布的奇妙世界

Comsol 磁流变弹性体仿真,磁力耦合,磁力球,基底橡胶材料,在不同磁场外部应力作用下磁场分布在材料科学与电磁学的交叉领域,磁流变弹性体(MRE)一直是个令人着迷的研究对象。今天咱们就借着Comsol…

作者头像 李华
网站建设 2026/3/14 0:26:05

探索Matlab/simulink中双馈风机在风电并网调频的奥秘

Matlab/simulink 双馈风机超速减载变桨调频,DFIG调频,一次调频,超速减载,变桨下垂控制,IEEE9节点系统,风电并网,三机九节点系统,对比了转子动能,下垂控制和虚拟惯性控制&…

作者头像 李华