創業公司使用R語言搭建簡單的數據分析系統

ihkm4462 8年前發布 | 40K 次閱讀 數據挖掘

來自: http://blog.csdn.net/a345017062/article/details/50668353


概述

整個系統分為三個服務
一、數據源。這個可以是各種形式的數據庫。當然,你如果有高大上的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

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。

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端輸出結果。

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傳參。

</div>

 本文由用戶 ihkm4462 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!