我有一个用例,其中我获得了一个 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());
}
});
关于如何实现这一目标的任何想法?
答案 0 :(得分:0)
据我所知,这里的问题并不是Java的翻译,而是您使用的特定模型。 MLlib提供两种类型的模型 - 本地模型和分布式模型。本地模型可以序列化并在map
内使用。
MatrixFactorizationModel
模型属于第二类。这意味着它在内部使用分布式数据结构进行预测,因此无法从操作或转换中使用。如果你想用它来预测整个RDD,你必须在predict
方法中传递它,如下所示:
model.predict(JavaRDD.toRDD(test))
有关所需的测试数据格式的详细信息,请参阅Collaborative Filtering documentaion中的Java示例。