Skip to Content
Author's profile photo Former Member

SAP HANA中文文本处理(一):RLANG实现数据实时抓取

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表对应的表类型。

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

    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;


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

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

  

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

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

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.