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表对应的表类型。
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!我们欢迎你的加入!