Skip to Content

1 R语言介绍

       R语言是基于S语言的一个GNU计划项目,可以当成是S语言的一种实现,最初是由新西兰奥克兰大学的Ross IhakaRobert Gentleman开发,主要用于统计分析,绘图,数据挖掘.

SAP HANA SP5版本发布以来,将SAP HANA的内存计算和R丰富的统计功能进行了完美的结合,使得在SAP HANA数据库中可以使用R语言作为存储过程的开发语言,调用R中的统计函数.

  SAP HANAR之间的交互使用了一种高效数据交换机制,使得中间过程表与R中基于列的数据结构之间传输数据很快.RSAP HANA之间的通信过程如下图所示:

/wp-content/uploads/2014/02/1_384773.png

为了在SAP HANA中执行R代码,R代码将以RLANG存储过程的形式嵌入,并由外部的Rserve负责执行.为了支持R操作符,SAP HANA的计算引擎进行了扩展,对给定的输入对象,经过计算,输出一张结果表.与本地数据库操作符不同的是,R操作符可以利用R函数对数据进行处理.当计算引擎识别出R操作符,便由R Client发出一个请求到Rserve,并发送相关的参数,触发执行,执行完毕之后,结果数据框被发送至计算引擎.

使用限制:

  • 1. RLang中,参数只支持table类型,所以如果需要传标量(scalar)类型,需要封装到table中,这点需要注意.如果需要传送R中的lists, matrixesSAP HANA,需要转换成data frame.
  • 2. Procedure中的变量名不能包含大写字母.
  • 3. 嵌入式R函数必须有至少一个结果,data frame的形式.

 2 R语言安装

windows平台下的安装相对比较简单,只需要在官网下载对应的安装包然后双击执行安装程序即可.下面主要介绍在linux平台下的安装.安装之前先确保以下软件包存在:

xorg-x11-develX window支持

gcc-fortran:编译环境需要

readline-devel:使用R作为独立程序时需要

libgfortran46:SLES 11 sp2需要

然后下载R语言源码包(R-2.15.0.tar.gz已经过测试),然后解压缩,执行

./configure –enable-R-shlib

  make

make install

  如果安装成功,在shell中执行R命令,可以直接启动交互式R解释器,如图

/wp-content/uploads/2014/02/2_384774.png


3 实现与SAP HANA的整合

  • (1) 安装Rserve

Rserve是基于TCP/IP的一个R语言服务器端,启动R之后,执行install.packages(“Rserve”),会提示选择镜像,然后自动下载安装.也可以下载Rserve.tar.gz,然后执行install.packages(“/PATH/TO/YOUR/Rserve.tar.gz”, repos = NULL)进行安装.

安装之后编辑/etc/Rserv.conf文件,添加以下内容:

maxinbuf 10000000

maxsendbuf 0

remote enable

         然后启动Rserve,

         /usr/local/lib64/R/bin/Rserve –RS-port 30120   –no-save   –RS-encoding utf8

  • (2) 配置SAP HANA

启动SAP HANA Studio, 选择管理视图,Configuration标签,依次导航至indexserver.ini->calcEngine, 添加如下参数

/wp-content/uploads/2014/02/3_384777.png


4 简单测试demo

以下demo实现将一个只有一列的质数表,求其平方:

CREATE ROW TABLE “WEIYY_TEST”.“PRIME” ( “NUMBER” INT CS_INT );

insert into “WEIYY_TEST”.“PRIME” values(2);

insert into “WEIYY_TEST”.“PRIME” values(3);

insert into “WEIYY_TEST”.“PRIME” values(5);

insert into “WEIYY_TEST”.“PRIME” values(7);

CREATE ROW TABLE “WEIYY_TEST”.“PRIME_SQR” ( “NUMBER” INT CS_INT );

CREATE PROCEDURE MY_F(IN input1 PRIME,OUT result PRIME_SQR)

LANGUAGE RLANG AS

BEGIN

      result<-as.data.frame(input1$NUMBER^2);

      names(result)<-c(“NUMBER”);

END;


执行此procedure,结果如下:

/wp-content/uploads/2014/02/4_384788.png

5 技巧


 RLANG编写的procedure中,参数是不能为标量类型,但往往很多时候需要传递标量作为输入参数.这个时候,利用SAP HANAselect  from dummy语句生成一张临时结果表是一个很好的解决办法.


CREATE PROCEDURE WAPPER_WEIBOSOHU(IN keyword NVARCHAR, IN crawltime INTEGER,OUT result WEIBOSOHU_TYPE)

LANGUAGE SQLSCRIPT

AS BEGIN

      inputinfo=select :keyword AS “keyword”,:crawltime as “crawltime” from DUMMY;

      CALL fetch_weibosohu(:inputinfo, :result);

END;

例如上面的procedure中,外层WAPPER_WEIBOSOHU过程是SQLSCRIPT,调用的fetch_weibosohu是一个RLANG procedure,利用select from dummy语句生成临时表,传入内层procedure.


[:本文的测试案例所使用的SAP HANA版本为SAP HANA SPS7 Revision 70.00]

[参考资料]

1.http://zh.wikipedia.org/wiki/R%E8%AF%AD%E8%A8%80

. http://help.sap.com/hana/SAP_HANA_R_Integration_Guide_en.pdf


想获取更多SAP HANA学习资料或有任何疑问,请关注新浪微博@HANAGeek!我们欢迎你的加入!


To report this post you need to login first.

3 Comments

You must be Logged on to comment or reply to a post.

  1. Martin Xu

    Hi,请问Hana Procedure里面调 R function必须在Suse下吗?Windows下试过吗?我windows下试验了下,貌似HANA studio里面有问题~~,如果你知道,望指导~~ 🙂

    (0) 
    1. Whisly Wei Post author

      官方文档上面是说推荐SUSE.没有说一定在SUSE下面. windows平台上我自己没试过,以前我有个同事试过,Windows下面装好Rserve, 他说HANA也连过去了.从原理上分析, 应该是可以的. 检查一下你的HANA server到你的windows Rserve之间的通信,telnet一下Rserve打开的端口试试

      (0) 

Leave a Reply