我有2个JavaRDD。第一个是
JavaRDD<CustomClass> data
,第二个是
JavaRDD<Vector> features
My Custom类有2个字段,(String)text和(int)标签。 我的JavaRDD数据中有1000个CustomClass实例,JavaRDD功能中有1000个Vector实例。
我通过使用JavaRDD数据并在其上应用地图函数来计算这1000个向量。
现在,我想要一个新的形式为
的JavaRDDJavaRDD<LabeledPoint>
由于LabeledPoint的构造函数需要标签和向量,因此我无法应用将CustomClass和Vector作为参数的map函数,因为它只接受一个参数。
有人可以告诉我如何组合这两个JavaRDD并获得新的
JavaRDD<LabeledPoint>
以下是我写的代码中的一些片段:
Class CustomClass {
String text; int label;
}
JavaRDD<CustomClass> data = getDataFromFile(filename);
final HashingTF hashingTF = new HashingTF();
final IDF idf = new IDF();
final JavaRDD<Vector> td2 = data.map(
new Function<CustomClass, Vector>() {
@Override
public Vector call(CustomClass cd) throws Exception {
Vector v = new DenseVector(hashingTF.transform(Arrays.asList(cd.getText().split(" "))).toArray());
return v;
}
}
);
final JavaRDD<Vector> features = idf.fit(td2).transform(td2);
答案 0 :(得分:4)
您可以使用JavaRDD#zip:
将此RDD与另一个RDD一起使用,返回键值对 每个RDD中的第一个元素,每个RDD中的第二个元素等。假设 这两个RDD具有相同数量的分区且相同 每个分区中的元素数量(例如,一个是通过地图制作的 另一方面)。
JavaPairRDD<CustomClass,Vector> dataAndFeatures = data.zip(features);
// TODO dataAndFeatures.map to LabeledPoint instances
由于您通过td2
的简单map
创建data
,因此文档的突出显示部分成立。然后df
(== features
?)是transform
on IDFModel
instance的结果,这也会使值保持一致。