Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
Former Member
0 Kudos

1 R语言介绍

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

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

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

为了在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解释器,如图


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, 添加如下参数


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,结果如下:

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!我们欢迎你的加入!


3 Comments