Skip to Content

SAP HANA碰上R——第一次接吻[翻译后转载]

原文链接: http://scn.sap.com/community/developer-center/hana/blog/2012/05/21/when-sap-hana-met-r–first-kiss

如果你关注我的博客(我希望你这么做 😡 ),那么你知道我真的喜欢R程序语言,但是我也喜欢SAP HANA, 😘 过去我处理过把这两个结合起来:

HANA遇上R

R遇上HANA

RSAP HANA里的数据消毒

但是……那些结合没有用SAP的方式……这意味着它们不被SAP支持或合法化……

高兴的是……至今,有一种SAP官方的方法可以做到! 😎

首先,我们需要阅读并遵循伟大的Juergen Schmerder所写的在亚马逊网络服务上得到你自己的SAP HANA数据库服务器中所有指令。(相信我!我只花了10分钟不到就在我的笔记本上运行了SAP HANA……真是……小菜一碟)。

SAP HANA实例建立好并运行之后,我们可以投身到有趣的部分……#R部分 😉

来到你的AWS管理控制台,在Amazon EC2下面启动一个新的实例……

  /wp-content/uploads/2012/12/susu_linux_103729.png                 

你必须选择SUSE Linux企业版32位。我试过64位的,但是那不好玩……它没有生效而且浪费了我很多时间……32位胜出!

关于安装,你可以跟着该链接执行SAP HANA 数据库开发指导——与R程序语言整合。而至少在我的情况里,我需要处理很多困难,高兴地是我在本博客里会写下来,所以你不用再处理它们 😆

       第一, 我们需要一个编译器,因为我们要从源代码编译#R

获取一个编译器……
sudo zypper install gcc gcc-c++ gcc-fortran

  然后我们需要获取并提取#R源代码。

得到源代码,提取并编

wget http://cran.r-project.org/src/base/R-2/R-2.13.0.tar.gz

tar zxf R-2.13.0.tar.gz && cd R-2.13.0

./configure –enable-R-shlib –with-readline=no –with-x=no

make clean

make

make install

代码,提取并编译

这一步真是需要很长时间……所以你最好同时做一些其他更有产能的事情……

#R最后安装好了,我们需要下载并安装Rserve包。


现在,我们必须登录到R并且安装……

安装和测试Rserve

R

  1. install.packages(“/PATH_TO_FILE/Rserve.tar.gz”, repos = NULL)

library(“Rserve”) #To test the installation. If there’s no output, then it’s working fine

q()

如果你得到一个关于个人库的错误……只要选“是的”。

一旦Rserve安装好了,我们需要创建一个配置文件。

Rserv.conf

vi /etc/Rserv.conf

maxinbuf 10000000

Maxsendbuf 0

remote enable

#Press ESC key

:w

#Press ESC key

:q!


现在,我们必须创建一个用户来运行
Rserve,因此我们可以从SAP HANA连接它。

创建有密码的新用户

useradd -m login_name

passwd login_name


由于一些原因,亚马逊没有提供根用户的密码……但是我们可能最后需要它……所以这么做……毕竟,如果是你的用户而且你在为它付钱。

修改根密码

sudo passwd root

#Assign a password

太好了,我们现在准备好启动我们的服务器!(你需要以前一步创建的新用户登陆)。

启动Rserve服务器
R CMD Rserve –RS-port 6311 –no-save –RS-encoding “utf8”

现在……我们准备移到我们的SAP HANA服务器继续配置。 😏

配置 SAP HANA

Right click on your system node at the navigator tab

Select Administration

Select on the right hand side the Configuration tab

Select the indexserver.ini

Select the calcengine

#Add the following parameters…

cer_timeout – 300

cer_rserve_addresses – Our R Amazon server:6311

cer_rserve_maxsendsize – 0

还有一点,我们准备启动……来到你的AWS管理控制台EC2,然后选择安全组。 我们的R服务器将被分配给“快速启动-1”。只要选中它,并来到Inbound。添加端口“6311”。

/wp-content/uploads/2012/12/security_group_103776.png


那是所有的……我们按规定准备启动了!

SAP HANA上,创建一个表,称之为TICKETS_BY_YEAR,用以下的结构:

/wp-content/uploads/2012/12/hana_r_kiss_001_103791.png


打开SQL编辑器,把下面的代码复制进去……

填充 TICKETS_BY_YEAR

insert into “SYSTEM”.”TICKETS_BY_YEAR” values(‘20110101’,4195);

insert into “SYSTEM”.”TICKETS_BY_YEAR” values(‘20110201’,4245);

insert into “SYSTEM”.”TICKETS_BY_YEAR” values(‘20110301’,4971);

insert into “SYSTEM”.”TICKETS_BY_YEAR” values(‘20110401’,4469);

insert into “SYSTEM”.”TICKETS_BY_YEAR” values(‘20110501’,4257);

insert into “SYSTEM”.”TICKETS_BY_YEAR” values(‘20110601’,4973);

insert into “SYSTEM”.”TICKETS_BY_YEAR” values(‘20110701’,4470);

insert into “SYSTEM”.”TICKETS_BY_YEAR” values(‘20110801’,4981);

insert into “SYSTEM”.”TICKETS_BY_YEAR” values(‘20110901’,4530);

insert into “SYSTEM”.”TICKETS_BY_YEAR” values(‘20111001’,4167);

insert into “SYSTEM”.”TICKETS_BY_YEAR” values(‘20111101’,4059);

insert into “SYSTEM”.”TICKETS_BY_YEAR” values(‘20111201’,1483);


这个表应该存的是一个已知公司在
2011年每个月销售的票子。我们这里要做的是决定或预测我们的2012年销售情况。对此我们将用#R创建以下脚本并命名为“Predict_Tickets”。该脚本将包括两个存储过程,叫做Prediction_ModelGet_Tickets

Predict_Tickets

CREATE TYPE T_PREDICTION_TICKETS AS TABLE (

PERIOD VARCHAR(8),

TICKETS INTEGER

);

DROP PROCEDURE Prediction_Model;

DROP PROCEDURE Get_Tickets;

CREATE PROCEDURE Prediction_Model(IN tickets_year TICKETS_BY_YEAR,OUT result T_PREDICTION_TICKETS)

LANGUAGE RLANG AS

BEGIN

period=as.integer(tickets_year$PERIOD)

tickets=as.integer(tickets_year$TICKETS)

var_year=as.integer(substr(period[1],1,4))

var_year=var_year+1

new_period=gsub(“^\\d{4}”,var_year,period)

next_year=data.frame(year=new_period)

  1. prt.lm<-lm(tickets ~ period)

pred=round(predict(prt.lm,next_year,interval=”none”))

result<-data.frame(PERIOD=new_period,TICKETS=pred)

END;

CREATE PROCEDURE Get_Tickets()

LANGUAGE SQLSCRIPT AS

BEGIN

Tickets = SELECT * FROM TICKETS_BY_YEAR;

CALL Prediction_Model(:Tickets,T_PREDICTION_TICKETS);

INSERT INTO “TICKETS_BY_YEAR” SELECT * FROM :T_PREDICTION_TICKETS;

END;

CALL Get_Tickets();

SELECT * FROM “TICKETS_BY_YEAR”;

Prediction_Model调用存储过程Get_Tickets,它从表TICKETS_BY_YEAR中取数,然后调用Prediction_Model来最后把数据插回SAP HANA你可以看到,我们第一个叫做Prediction_Model的存储过程,我们使用RLANG作为脚本语言……意味着我们将嵌入R代码,它将从SAP HANA运行到R服务器,并且把修改过的信息返还。

在我们的脚本最后,我们调用Get_Tickets并且从TICKETS_BY_YEAR取数来检验我们的脚本有效。

/wp-content/uploads/2012/12/hana_r_kiss_002_103792.png

 

成功!我们的SAP HANAR的整合运行的很有魅力!我们从没有离开过SAP HANA Studio,但是我们的代码跑到R服务器并带回来改过的信息……所有这些只花了829毫秒……考虑到两个服务器都在云端确实很快……

现在都搞定了……我将尽快带回更多关于SAP HANAR的信息……还有很多有待发现和测试 😎

To report this post you need to login first.

Be the first to leave a comment

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

Leave a Reply