使用Java运行带有流的MLlib模型

时间:2015-12-15 11:47:29

标签: java apache-spark spark-streaming apache-spark-mllib

我有一个用例,其中我获得了一个 MLlib 模型和一个流,并希望得到一个数据流得分(预测)。

使用Scala有一些关于此问题的示例和材料,但我无法将其转换为Java。

尝试在地图功能中运行预测(如spark documentation

所示
JavaRDD<Tuple2<Object, Object>> scoreAndLabels = test.map(
  new Function<LabeledPoint, Tuple2<Object, Object>>() {
    public Tuple2<Object, Object> call(LabeledPoint p) {
      Double score = model.predict(p.features());
      return new Tuple2<Object, Object>(score, p.label());
    }
  }
);

导致错误:

invalid because the values transformation and count action cannot be 
performed inside of the rdd1.map transformation

我的输入是一个昏迷分隔的两个整数,我将其映射到:

JavaDStream<Tuple2<Integer, Integer>> pairs

然后我想将其转换为:

JavaPairDStream<Integer, Double> scores

Double是预测结果,Integer是键,所以我可以通过键减少 这种方法需要在现有的DStream中创建一个我没能做到的新DStream。

预测方法可以应用于RDD但是我无法从它创建一个DStream(必须返回void):

    pairs.foreachRDD(new Function<JavaRDD<Tuple2<Object, Object>>, Void >(){
    @Override
    public Void call(JavaRDD<Tuple2<Object, Object>> arg0) throws Exception {
        // TODO Auto-generated method stub

        RDD<Rating> a = sameModel.predict(arg0.rdd());

    }

  });

关于如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:0)

据我所知,这里的问题并不是Java的翻译,而是您使用的特定模型。 MLlib提供两种类型的模型 - 本地模型和分布式模型。本地模型可以序列化并在map内使用。

MatrixFactorizationModel模型属于第二类。这意味着它在内部使用分布式数据结构进行预测,因此无法从操作或转换中使用。如果你想用它来预测整个RDD,你必须在predict方法中传递它,如下所示:

model.predict(JavaRDD.toRDD(test))

有关所需的测试数据格式的详细信息,请参阅Collaborative Filtering documentaion中的Java示例。