1. 程式人生 > >以Java呼叫R,並進行畫圖

以Java呼叫R,並進行畫圖

上程式碼

package com.fandatsys.dams.core.profiling.types;

import com.fandatsys.dams.core.profiling.DatasetColumnChartingProfileType;
import com.fandatsys.dams.core.profiling.ProfilingType;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.types.DataType;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.DecimalType;
import org.rosuda.JRI.Rengine;

import java.util.List;

/**
 * Data Length Frequency Distribution.
 */
@ProfilingType(name = "Hist")
public class ProfileTypeHist implements DatasetColumnChartingProfileType {

    @Override
    public void readMysql(Dataset<Row> dataset, String columnName) {

        JavaSparkContext sparkContext = new JavaSparkContext(new SparkConf().setAppName("ProfileTypePie"));
        SQLContext sqlContext = new SQLContext(sparkContext);
        Rengine engine = new Rengine(null, false, null);

        dataset.registerTempTable("dataset");
        Dataset<Row> sqlhist = sqlContext.sql("select " + columnName + " from dataset");
        List<Row> countList = sqlhist.collectAsList();

        Object[] arrayCount1 = countList.toArray();
        double[] arrayCount2 = new double[arrayCount1.length];

        for (int i = 0; i < arrayCount1.length; i++) {
            arrayCount2[i] = Double.parseDouble(arrayCount1[i].toString());
        }

        engine.assign(columnName, arrayCount2);
        // Chart path
        engine.eval("jpeg('/Charting/Hist.jpg')");
        engine.eval("hist(" + columnName + ")");
        engine.eval("dev.off()");
        engine.end();
    }
}

首先傳遞兩個引數dataset和columnName,dataset是Sparksql中Dataset的例項化物件,columnName是我要操作的資料庫表的某一列列名,首先我們需要匯入JRI.jar包,該包中提供了Java呼叫R的方法,我們只需要做到將結果以字串或者陣列的形式作為引數提供給R,作為源資料
engine.assign(columnName, arrayCount2);
這一步是將陣列通過傳參的方式賦值給一個變數,可以所以起一個名字,我將名字起成了columnName,就是欄位名,方便傳參
engine.eval(“jpeg(’/Charting/Hist.jpg’)”);
這一步是為了將圖片以jpg的形式儲存到一個目錄下
engine.eval(“hist(” + columnName + “)”);
這一步是進行畫圖,我畫的是一個頻數直方圖
engine.eval(“dev.off()”);
engine.end();
最後關閉,退出啦