如何在 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 的结果,这也使值保持一致。