将JavaPairDStream转换为RDD
我使用Spark流和Spark MLlib来评估一个朴素的bayes模型。实际上,我已经到了无法继续的地步,因为我无法将JavaPairDStream的对象转换为RDD来计算精度。预测结果和标签存储在这个JavaPairDStream中,但我想逐一检查它们并进行比较以计算准确度 我将发布我的代码以使我的问题更清楚,代码在计算精度的部分引发了一个异常(运算符/对于参数类型JavaDStream,double是未定义的)(因为这种方法仅适用于javapairdd,而不是),我需要帮助来计算JavaPairDStream的精度 编辑:我编辑了代码,现在的问题是如何读取精度值,即JavaDStream,然后为每批数据累积该值,以计算所有数据的精度将JavaPairDStream转换为RDD,java,apache-spark,machine-learning,spark-streaming,apache-spark-mllib,Java,Apache Spark,Machine Learning,Spark Streaming,Apache Spark Mllib,我使用Spark流和Spark MLlib来评估一个朴素的bayes模型。实际上,我已经到了无法继续的地步,因为我无法将JavaPairDStream的对象转换为RDD来计算精度。预测结果和标签存储在这个JavaPairDStream中,但我想逐一检查它们并进行比较以计算准确度 我将发布我的代码以使我的问题更清楚,代码在计算精度的部分引发了一个异常(运算符/对于参数类型JavaDStream,double是未定义的)(因为这种方法仅适用于javapairdd,而不是),我需要帮助来计算JavaP
public static JSONArray testSparkStreaming(){
SparkConf sparkConf = new SparkConf().setAppName("My app").setMaster("local[2]").set("spark.driver.allowMultipleContexts", "true");
JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, Durations.milliseconds(500));
String savePath = "path to saved model";
final NaiveBayesModel savedModel = NaiveBayesModel.load(jssc.sparkContext().sc(), savePath);
JavaDStream<String> data = jssc.textFileStream("path to CSV file");
JavaDStream<LabeledPoint> testData = data.map(new Function<String, LabeledPoint>() {
public LabeledPoint call(String line) throws Exception {
List<String> featureList = Arrays.asList(line.trim().split(","));
double[] points = new double[featureList.size()-1];
double classLabel = Double.parseDouble(featureList.get(featureList.size() - 1));
for (int i = 0; i < featureList.size()-1; i++){
points[i] = Double.parseDouble(featureList.get(i));
}
return new LabeledPoint(classLabel, Vectors.dense(points));
}
});
JavaPairDStream<Double, Double> predictionAndLabel = testData.mapToPair(new PairFunction<LabeledPoint, Double, Double>() {
public Tuple2<Double, Double> call(LabeledPoint p) {
return new Tuple2<Double, Double>(savedModel.predict(p.features()), p.label());
}
});
JavaDStream<Long> accuracy = predictionAndLabel.filter(new Function<Tuple2<Double, Double>, Boolean>() {
public Boolean call(Tuple2<Double, Double> pl) throws JSONException {
return pl._1().equals(pl._2());
}
}).count();
jssc.start();
jssc.awaitTermination();
System.out.println("*************");
JSONArray jsonArray = new JSONArray();
JSONObject obj = new JSONObject();
jsonArray.put(obj);
obj = new JSONObject();
obj.put("Accuracy", accuracy*100 + "%");
jsonArray.put(obj);
return jsonArray;
}
publicstaticjsonarray testSparkStreaming(){
SparkConf SparkConf=new SparkConf().setAppName(“我的应用”).setMaster(“本地[2]”).set(“spark.driver.allowMultipleContexts”,“true”);
JavaStreamingContext jssc=新的JavaStreamingContext(sparkConf,Durations.millizes(500));
String savePath=“保存模型的路径”;
final NaiveBayesModel savedModel=NaiveBayesModel.load(jssc.sparkContext().sc(),savePath);
JavaDStream data=jssc.textFileStream(“CSV文件的路径”);
JavaDStream testData=data.map(新函数(){
公共标签点调用(字符串行)引发异常{
List featureList=Arrays.asList(line.trim().split(“,”);
double[]points=新的double[featureList.size()-1];
double classLabel=double.parseDouble(featureList.get(featureList.size()-1));
对于(int i=0;i
数据流中的“transform”方法允许您对数据流中的每个RDD应用函数@rhernando,我更新了代码,您知道如何读取精度值(即JavaDStream),然后对每批数据累积该值以计算所有数据的精度。如果您想累积结果,仅使用蓄能器:蓄能器accum=sc蓄能器(0);不要计数,而是执行“过滤…foreach(累计添加(1))”。顺便说一句:你应该把jssc.start放在程序的末尾是的,我想累积结果以计算模型的准确性,但是如果我理解正确,你是说在predictionAndLabel上使用累加器,即JavaPairDStream???,我还有两个问题,第一个问题:当我启动jssc时,如何在流式传输文件中存在的所有记录之后停止jssc?第二个问题:流媒体是否可以正确地处理csv文件,或者我必须将其转换为hdfs或任何其他格式???---谢谢如果您只处理一个文件,为什么要使用流媒体?我认为批处理(使用sc.textFile)更合适