您的位置:首页 > 其它

创业公司使用R语言搭建简单的数据分析系统

2016-02-15 14:49 661 查看

概述

整个系统分为三个服务

一、数据源。这个可以是各种形式的数据库。当然,你如果有高大上的Hadoop也是可以的。

二、分析引擎。就是R了,这里我们使用Rserve搭建一个服务。

三、分析脚本容器。根据每一个数据分析需求我们都会写成一个R脚本,放到容器中,由容器来做参数分发,脚本调用,结果输出。

数据源

这个就不需要细说了,把公司自己的数据源接过来,向分析引擎开放Read权限就行了。可以是MySQL,也可以是Hadoop,或者其它数据平台。

分析引擎

安装R环境,Rserve库。http://www.rforge.net/Rserve/

启动Rserve。

1、R //命令行启动R

2、library(“RServe”) //加载Rserve库

3、Rserve() //启动Rserve服务

Rserve服务的作用就是接受服务调用方的请求,执行R命令,或加载并执行R脚本,调用本地的R Runtime进行运算,返回执行结果。

输入的形式可以是R脚本文件路径或R命令集合,输出的形式可以有向量、Matrix、data frame、List、PDF、jpg、png、CSV等所有R语言支持的输出类型。

我的数据源是MySQL,所以安装了RMySQL这个library。然后使用以下代码连接数据MySQL

[code]library(RMySQL)//加载RMySQL库
conn <- dbConnect(MySQL(), dbname = "xxx", username="xxx", password="xxx",host="xxx")//连接远程数据库
myData <- dbGetQuery(conn,"select * from persons limit 10")//执行查询操作
dbDisconnect(conn)//关闭远程数据库连接


容器

由于R是个脚本语言,所以给容器带来了先天的冷启动特性。容器要做的主要有三件事:

1、输入参数分析。把服务Client端的参数解析成R可以识别的参数,当然,还有容错处理。

2、脚本调用。根据服务Client端的命令映射到具体的R脚本上,并调用分析引擎服务加载执行R脚本。

我这里做了一个Tomcat下的app。

[code]RConnection rConnection = new RConnection("127.0.0.1");
rConnection.eval("source('xxx.R')");
rConnection.close();//通信完成之后,关闭连接


3、结果输出。根据服务Client端的要求,把结果以Json(向量、矩阵、data frame、List)、二进制文件(PDF、jpg、png、CSV)等类型向Client端输出结果。

[code]REXP rexp = rConnection.parseAndEval("GLOBAL_main()");
String outputType = xxx;
if (output.equals("csv")){
    byte[] csvData = getBytesFromREXP(rexp,response);
    if (csvData != null){
        response.setContentType("text/csv");
        response.setHeader("Content-Disposition","attachment;filename="+target+"_output.csv");
    // 响应输出流
    ServletOutputStream out = response.getOutputStream();
    out.write(csvData);
    out.flush();
    out.close();
}else if (output.equals("jpg")){
    byte[] jpgData = getBytesFromREXP(rexp,response);
    if (jpgData != null){
        response.setContentType("image/jpg");
        // 响应输出流
        ServletOutputStream out = response.getOutputStream();
        out.write(jpgData);
        out.flush();
        out.close();
}else if (output.equals("png")){
    byte[] pngData = getBytesFromREXP(rexp,response);
    if (pngData != null){
        response.setContentType("image/png");
        // 响应输出流
        ServletOutputStream out = response.getOutputStream();
        out.write(pngData);
        out.flush();
        out.close();
}else {
    //其它输出类型,可以使用Json、XML等规范
}


具体到脚本容器app与分析引擎Rserve的交互,使用RServe源码的inst目录下面的REngine.jar和RserveEngine.jar两个文件就可以了。里面包含各种形式的Demo。

容器对外提供服务的形式,可以遵循RESTful,也可以直接使用GET query传参。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: