Greenplum的PL/R语言扩展
该章节包含以下信息:
上一个话题: Greenplum数据库参考指南
关于Greenplum数据库的PL/R
PL/R 是一种过程语言。使用Greenplum数据库PL/R扩展,用户可以以R编程语言编写数据库函数,并使用包含R函数和数据集的R包
更多关于支持的PL/R版本的信息,请参阅 Greenplum数据库发布说明。
启用PL/R语言支持
对于需要使用的每个数据库,使用SQL命令 CREATE LANGUAGE 或者实用程序 createlang注册PL/R语言。因为 PL/R是不可信语言,只有超级用户可以使用数据库注册PL/R。例如,作为 gpadmin 系统用户使用数据库 testdb 运行命令注册该语言如下:
$ createlang plr -d testdb
PL/R 被注册为可不信的语言。
例子
接下来是简单的PL/R例子。
例子 1: 对单行操作符使用 PL/R。
此函数使用R函数 rnorm()生成具有正态分布的数字数组。
CREATE OR REPLACE FUNCTION r_norm(n integer, mean float8,
std_dev float8) RETURNS float8[ ] AS
$$
x<-rnorm(n,mean,std_dev)
return(x)
$$
LANGUAGE 'plr';
接下来的 CREATE TABLE 命令使用 r_norm 函数来填充表。该 r_norm 函数创建了10个数的数组。
CREATE TABLE test_norm_var
AS SELECT id, r_norm(10,0,1) as x
FROM (SELECT generate_series(1,30:: bigint) AS ID) foo
DISTRIBUTED BY (id);
示例 2: 以表格的形式返回PL/Rdata.frame
假设用户的PL/R函数返回一个R data.frame 作为输出, 除非使用数组的数组,否则需要一些工作来将PL/R中的 data.frame作为一个简单的SQL表:
创建一个和用户的 data.frame 同样维度的 TYPE 在Greenplum数据库中:
CREATE TYPE t1 AS ...
使用这个 TYPE 定义用户的PL/R函数
... RETURNS SET OF t1 AS ...
下面的列子给出了示例的SQL。
例子 3: 分层回归使用 PL/R
以下的SQL定义了一个类型 TYPE 并且分层回归使用 PL/R:
--Create TYPE to store model results
DROP TYPE IF EXISTS wj_model_results CASCADE;
CREATE TYPE wj_model_results AS (
cs text, coefext float, ci_95_lower float, ci_95_upper float,
ci_90_lower, float, ci_90_upper float, ci_80_lower,
float, ci_80_upper float);
--CreatePL/Rfunction to run model in R
DROP FUNCTION wj.plr.RE(response float [ ], cs text [ ])
RETURNS SETOF wj_model_results AS
$$
library(arm)
y<- log(response)
cs<- cs
d_temp<- data.frame(y,cs)
m0 <- lmer (y ~ 1 + (1 | cs), data=d_temp)
cs_unique<- sort(unique(cs))
n_cs_unique<- length(cs_unique)
temp_m0<- data.frame(matrix0,n_cs_unique, 7))
for (i in 1:n_cs_unique){temp_m0[i,]<-
c(exp(coef(m0)$cs[i,1] + c(0,-1.96,1.96,-1.65,1.65
-1.28,1.28)*se.ranef(m0)$cs[i]))}
names(temp_m0)<- c("Coefest", "CI_95_Lower",
"CI_95_Upper", "CI_90_Lower", "CI_90_Upper",
"CI_80_Lower", "CI_80_Upper")
temp_m0_v2<- data.frames(cs_unique, temp_m0)
return(temp_m0_v2)
$$
LANGUAGE 'plr';
--Run modeling plr function and store model results in a
--table
DROP TABLE IF EXISTS wj_model_results_roi;
CREATE TABLE wj_model_results_roi AS SELECT *
FROM wj.plr_RE((SELECT wj.droi2_array),
(SELECT cs FROM wj.droi2_array));
下载和安装R包
R 包是包含了R语言函数和数据集的模块。用户可以在Greenplum数据库中安装R包来 扩展R和PL/R的功能。
注意: 如果用户扩展Greenplum数据库和增加段主机,用户必须在新主机安装R的时候安装R包。
对于R包,识别所有依赖的R包和每个包的网址。通过以下的导航页面选择给定的包找到信息:
http://cran.r-project.org/web/packages/available_packages_by_name.html
例如,R 包的arm包安装页面指示需要以下R库:Matrix,lattice,lme4,R2WinBUGS,coda,abind,foreign和MASS。
用户也可以尝试安装此包通过 R CMD INSTALL 命令来确定依赖的包。
对于Greenplum数据库PL/R扩展包含的R安装 ,所需的R包和PL/R扩展一起安装。但是 Matrix 包需要较新的版本。
从命令行,可以使用 wget 实用程序将arm包的 tar.gz 文件下载到Greenplum数据库主机:
wget http://cran.r-project.org/src/contrib/Archive/arm/arm_1.5-03.tar.gz
wget http://cran.r-project.org/src/contrib/Archive/Matrix/Matrix_0.9996875-1.tar.gz
使用 gpscp 实用程序和hosts_all 文件去复制 tar.gz 文件到Greenplum数据库集群的所有节点的相同目录。 该 hosts_all 文件包含所有Greenplum 数据库段主机列表。用户需要root权限才能进行以下操作。
gpscp -f hosts_all Matrix_0.9996875-1.tar.gz =:/home/gpadmin
gpscp -f /hosts_all arm_1.5-03.tar.gz =:/home/gpadmin
在交互模式下使用 gpssh 实用程序登录到每个Greenplum数据库段主机 (gpssh -f all_hosts)。从命令提示符下使用 R CMD INSTALL 命令安装该包。注意这需要root权限。例如,这里是R安装命令安装arm包。
$R_HOME/bin/R CMD INSTALL Matrix_0.9996875-1.tar.gz arm_1.5-03.tar.gz
确保每个包都安装在了所有段主机的 $R_HOME/library d目录下 (该 gpssh 可以用来安装包)。例如,该 gpssh 命令列出了R库目录的内容。
gpssh -f all_hosts "ls $R_HOME/library"
测试R包是否可以被加载。
该函数执行了一个简单的测试是否R包可以被加载:
CREATE OR REPLACE FUNCTION R_test_require(fname text)
RETURNS boolean AS
$BODY$
return(require(fname,character.only=T))
$BODY$
LANGUAGE 'plr';
该SQL命令检测是否R包的arm包是否能被加载:
SELECT R_test_require('arm');
显示R库信息
用户可以使用R命令来显示Greenplum数据库主机上已安装的库和函数的信息。用户也可以从R的安装中添加和删除库。要在主机上启动R命令行,需作为 gadmin 用户登录到主机并且从 $GPHOME/ext/R-2.12.0/bin目录中运行R脚本。
该R函数从命令行列出了可用的R包:
> library()
显示某个指定R包的文档信息
> library(help="package_name")
> help(package="package_name")
显示某个R函数的帮助文档:
> help("function_name")
> ?function_name
要看安装了哪些包,可以使用R名命令 installed.packages()。该命令会返回一个矩阵,矩阵的每一行表示一个安装的包。 之后,我们查看该矩阵的前5行。
> installed.packages()
所有没有出现在该矩阵中的安装包必须先安装,然后才能使用包中的函数。
R 包的安装可以使用 install.packages()命令:
> install.packages("package_name")
> install.packages("mypkg", dependencies = TRUE, type="source")
从R命令行加载包。
> library(" package_name ")
R 包的删除可以使用 remove.packages命令
> remove.packages("package_name")
用户可以使用R命令 -e 选项从命令行中运行函数。例如,该命令显示了R包 MASS的帮助信息。
$R-e 'help("MASS")'
参考
http://www.r-project.org/ - R项目主页
https://cran.r-project.org/web/packages/PivotalR/ - PivotalR的主页,PivotalR包提供了操作Greenplum数据库表和视图的R接口 ,类似于R data.frame。PivotalR 也支持从R中直接使用机器学习的包 MADlib
R 文档和Greenplum数据库R包一起安装:
$GPHOME/ext/R-3.3.1/doc