如何在 Spark 中合并两个 RDD?
How to combine two RDDs in Spark?
我有 2 个 JavaRDD。第一个是
JavaRDD<CustomClass> data
第二个是
JavaRDD<Vector> features
我的自定义 class 有 2 个字段,(String) 文本和 (int) 标签。
我的 JavaRDD 数据中有 1000 个 CustomClass 实例,JavaRDD 特性中有 1000 个 Vector 实例。
我通过使用 JavaRDD 数据并在其上应用映射函数计算了这 1000 个向量。
现在,我想要一个
形式的新 JavaRDD
JavaRDD<LabeledPoint>
由于 LabeledPoint 的构造函数需要一个标签和一个向量,我无法将同时具有 CustomClass 和 Vector 作为参数的映射函数应用于调用函数,因为它只接受一个参数。
谁能告诉我如何组合这两个 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);
您可以使用 JavaRDD#zip:
Zips this RDD with another one, returning key-value pairs with the
first element in each RDD, second element in each RDD, etc. Assumes
that the two RDDs have the same number of partitions and the same
number of elements in each partition (e.g. one was made through a map
on the other).
JavaPairRDD<CustomClass,Vector> dataAndFeatures = data.zip(features);
// TODO dataAndFeatures.map to LabeledPoint instances
文档中突出显示的部分成立,因为您通过 data
的简单 map
创建了 td2
。然后 df
(==features
?) 是 transform
on IDFModel
instance 的结果,这也使值保持一致。
我有 2 个 JavaRDD。第一个是
JavaRDD<CustomClass> data
第二个是
JavaRDD<Vector> features
我的自定义 class 有 2 个字段,(String) 文本和 (int) 标签。 我的 JavaRDD 数据中有 1000 个 CustomClass 实例,JavaRDD 特性中有 1000 个 Vector 实例。
我通过使用 JavaRDD 数据并在其上应用映射函数计算了这 1000 个向量。
现在,我想要一个
形式的新 JavaRDDJavaRDD<LabeledPoint>
由于 LabeledPoint 的构造函数需要一个标签和一个向量,我无法将同时具有 CustomClass 和 Vector 作为参数的映射函数应用于调用函数,因为它只接受一个参数。
谁能告诉我如何组合这两个 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);
您可以使用 JavaRDD#zip:
Zips this RDD with another one, returning key-value pairs with the first element in each RDD, second element in each RDD, etc. Assumes that the two RDDs have the same number of partitions and the same number of elements in each partition (e.g. one was made through a map on the other).
JavaPairRDD<CustomClass,Vector> dataAndFeatures = data.zip(features);
// TODO dataAndFeatures.map to LabeledPoint instances
文档中突出显示的部分成立,因为您通过 data
的简单 map
创建了 td2
。然后 df
(==features
?) 是 transform
on IDFModel
instance 的结果,这也使值保持一致。