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

R语言是大数据分析和挖掘重要的工具,主要用于统计分析、绘图、数据挖掘。

SAP HANA内部集成了R模块,R程序容许以RLANG存储过程的形式嵌入到SAP HANA的SQL代码中。

    SAP HANA与R集成环境主要由三大部分构成:SAP HANA数据库、R环境以及我们的基于SAP HANA与R的应用。


    1.环境准备

        我们除了要准备SAP HANA数据库外,还要额外准备好R环境(并且需要安装好Rserve包)。然后我们需要在SAP HANA indexserver中配置相应的Rserve信息,以让两者可以协调工作。具体安装配置信息可见

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

    2.SAP HANA数据库准备

我们首先创建要用到的SCHEMA、TABLE以及相应的TABLE TYPE。


CREATE SCHEMA RTEST;
SET SCHEMA RTEST;
CREATE TABLE URL(
URL VARCHAR(500)
);
CREATE TABLE URL_CONTENT(
  "URL" VARCHAR(500),
  "CONTENT" NCLOB,
  "LANGU" VARCHAR(5)
);
CREATE TYPE URL_TYPE AS TABLE ( "URL" VARCHAR(500))
CREATE TYPE URL_CONTENT_TYPE AS TABLE (
  "URL" VARCHAR(500),
  "CONTENT" NCLOB,
  "LANGU" VARCHAR(5)
);



    其中表URL(见下图)存储了需要抓取网页内容的URL集合,URL_CONTENT表用于存储URL抓取下来的正文内容。URL_TYPE是表URL对应的表类型,URL_CONTENT_TYPE是URL_CONTENT表对应的表类型。

    3. RLANG爬虫实现

为了使用R抓取网页,我们首先安装RCurl包,即可实现简单的网页抓取任务。主要代码如下所示:


CREATE PROCEDURE CRAWLER_R (IN url URL_TYPE,OUT result URL_CONTENT_TYPE)
language rlang as
begin
setwd("/tmp/")
  --自定义function用于抓取网页内容
    crawler<-function(url){
        tryCatch({
            library("RCurl")
  --调用getURL方法即可抓取网页HTML源码
            html<-getURL(url[1],.encoding="utf-8",.mapUnicode = FALSE)
            return (html)
        },error=function(err){
            return("")
        },finally={
           gc()
        }
      )
    }
    --调用自定义方法crawler,并保存结果
  content<-as.character(Apply(url,1,crawler))
  --抓取结果写回数据库表中
    result <- as.data.frame(cbind(URL=url$URL,CONTENT=content), stringsAsFactors=FALSE)
end;


上面的RProcedure需要传入两个数据库表;第一个表存储了要抓取的URL记录,第二个表用于存储抓取的网页正文内容。代码中crawler是自定义的用于抓取网页的方法。在crawler中我们使用了RCurl包下的getURL方法来实现网页的抓取,该方法可以直接返回网页的HTML源码。然后我们再从HTML源码中提取出网页正文内容。关于提取HTML正文内容的方法有很多,比如可以基于XPATH将HTML解析成XML文档,然后剔除无用的HTML结点,最终保留下正文内容;也可以基于行块分分布函数来抽取正文内容等等。

上述RProcedure的抓取过程是单线程的,无法并发执行,当需要大批量抓取网页内容时速度比较慢。这时我们可以借助R的并发包parallel将上述程序改写成多线程版本的。

RProcedure完成之后我们可以使用下面命令来调用:

    CALL CRAWLER_R(URL,URL_CONTENT) with overview;


       下图显示了最终抓取的网页内容。

  

    本文的测试案例所使用的SAP HANA版本为SAP HANA SP07 Revision 70.00

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