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

使用Java运行具有流的MLlib模型,java,apache-spark,spark-streaming,apache-spark-mllib,Java,Apache Spark,Spark Streaming,Apache Spark Mllib,我有一个用例,在这个用例中,我得到一个MLlib模型和一个流,并希望得到一个数据流的分数(预测) 关于这个问题,有一些使用Scala的例子和资料,但我无法将其翻译成Java 尝试在map函数中运行predict(如中所示) 我的输入是一个由两个整数分隔的coma,我将其映射为: JavaDStream<Tuple2<Integer, Integer>> pairs JavaDStream对 然后我想把它转换成: JavaPairDStream<Integer,

我有一个用例,在这个用例中,我得到一个MLlib模型和一个流,并希望得到一个数据流的分数(预测)

关于这个问题,有一些使用Scala的例子和资料,但我无法将其翻译成Java

尝试在map函数中运行predict(如中所示)

我的输入是一个由两个整数分隔的coma,我将其映射为:

JavaDStream<Tuple2<Integer, Integer>> pairs
JavaDStream对
然后我想把它转换成:

JavaPairDStream<Integer, Double> scores
JavaPairDStream分数
其中Double是预测结果,Integer是一个键,因此我可以按键进行缩减。
这种方法导致需要在现有的数据流中创建一个新的数据流,但我没有做到这一点

predict方法可以应用于RDD,但我无法从中创建数据流(必须返回void):

pairs.foreachRDD(新函数(){
@凌驾
公共Void调用(JavaRDD arg0)引发异常{
//TODO自动生成的方法存根
rdda=sameModel.predict(arg0.RDD());
}
});

关于如何实现这一点有什么想法吗?

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

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

model.predict(JavaRDD.toRDD(test))

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

DStream表示时间批处理的RDD。我更感兴趣的是,通过将其重新转换为DStream而不是RDD,您可以实现什么。
JavaPairDStream<Integer, Double> scores
    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());

    }

  });
model.predict(JavaRDD.toRDD(test))