暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
Vertica通过用户自定义函数和UDx实现正态分布功能.docx
75
3页
0次
2025-01-08
免费下载
Vertica 通过用户自定义函数和 UDx
现正态分布功能
Vertica 和其他数据库一样提供了 RANDOM()函数,该函数返回 0 1 之间均匀分
布的随机浮点数。但是许多物理或社会现象是按照高斯(正态)分布的,比如:人的
身高或体重、IQ 分数、雪花的大小、理想气体中分子的速度等等都是按照正态分布的。
本文主要通过正态分布函数这个例子,给大家介绍如何在 Vertica 中实现用户自定
义函数,下面我们将介绍两种比较常见的方法实现正态分布函数:用户自定义的 SQL
函数和用户自定义扩展(UDx)
正态分布:用户自定义 SQL 函数
我们可以参照 Box-Muller transform 方法创建正态分布函数:首先得到符合均匀分
布的随机数(使用 RANDOM 函数)然后转成符合正态分布的随机数。在 Vertica 中只
要少量的代码就可以实现该功能:
CREATE OR REPLACE FUNCTION snorm ( mean FLOAT, stdv FLOAT )
RETURN FLOAT
AS
BEGIN
RETURN mean +
stdv * sqrt ( -2.0 * ln(random()) ) *
cos ( 2.0 * pi() * random() ) ;
END
;
我们可以像其他内置函数一样使用用户自定义函数 snorm():
SELECT snorm(0,1) ;
其中第一个参数是均值,第二参数是正态分布的标准差。
正态分布:UDx
Vertica 中可以通过 C++JavaRPython 实现比较复杂的功能,下面让我们通过
状态分布这个简单 UDx 介绍如何实现 R-UDx
mrnorm <- function(x, y)
{
pmean <- if(!is.null(y[['mean']])) as.numeric(y[['mean']]) else 0
pstdv <- if(!is.null(y[['stdv']])) as.numeric(y[['stdv']]) else 1
rnorm ( x[,1] , mean = pmean , sd = pstdv )
}
rnormParameters <- function()
{
data.frame(
datatype = c("float", "float"),
length = c(NA, NA),
scale = c(NA, NA),
name = c("mean", "stdv")
)
}
rnormFactory <- function()
{
list ( name = mrnorm,
udxtype = c("transform"),
intype = c("int"),
outtype = c("float"),
outnames = c("rnorm"),
parametertypecallback = rnormParameters
)
}
mrnorm()说明:
如果 mean 变量未定义,则赋值 0
如果 stdy 变量未定义,则赋值 1
通过 R 标准函数 rnorm()实现正态分布
上述是正态分布的核心功能,只需要三行代码就可以实现。
第二个函数 (rnormParameters) 用来定义可选参数的名称 (“mean” and “std”) 以及他
们的类型(float)。如果没有参数,可忽略这个函数。
第三个函数 (rnormFactory)提供了 UDx Vertica 间输入和输出参数的数据类型定
义。
可以通过下面的 SQL R-UDx 部署到 Vertica:
CREATE OR REPLACE LIBRARY librnorm AS '/tmp/rnorm.R' LANGUAGE 'R';
CREATE OR REPLACE TRANSFORM FUNCTION rnorm AS LANGUAGE 'R'
NAME 'rnormFactory' LIBRARY librnorm;
of 3
免费下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜