创业公司使用R语言搭建简单的数据分析系统
2016-02-15 14:49
661 查看
概述
整个系统分为三个服务一、数据源。这个可以是各种形式的数据库。当然,你如果有高大上的Hadoop也是可以的。
二、分析引擎。就是R了,这里我们使用Rserve搭建一个服务。
三、分析脚本容器。根据每一个数据分析需求我们都会写成一个R脚本,放到容器中,由容器来做参数分发,脚本调用,结果输出。
数据源
这个就不需要细说了,把公司自己的数据源接过来,向分析引擎开放Read权限就行了。可以是MySQL,也可以是Hadoop,或者其它数据平台。分析引擎
安装R环境,Rserve库。http://www.rforge.net/Rserve/
启动Rserve。
1、R //命令行启动R2、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传参。
相关文章推荐
- iOS 整型转换警告"NSInteger' should not be used as format arguments; add an explicit cast to 'long' inste"
- RP2836 板卡信息标识
- Core Data线程安全及BUG解决
- CSS格式化之段落排版
- TCP/IP协议
- JavaWeb实现文件上传与下载实例详解
- TCP的推送比特PSH(Push)
- zookeeper学习-3(如何使用zookeeper进行集群管理-java版本)
- Jquery&JS简单选项卡
- 如何正确获取Android控件的高度
- Linux系统移植001: 编译AT91Bootstrap基于AT91SAM9X35EK
- 栅格系统
- ios开发证书变成证 “此证书的签发者无效了”
- 动态代理的几种方式
- Linux学习笔记:Shell基础正则表达式
- 优化linux内核参数
- Sql Server 2008 分页思路
- Android 布局优化
- TextView 点击字体颜色改变
- 重拾c语言——链表