以Java呼叫R,並進行畫圖
阿新 • • 發佈:2019-01-29
上程式碼
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();
最後關閉,退出啦