如何在Spark中组合两个RDD?

时间:2016-09-15 09:47:37

标签: apache-spark rdd apache-spark-mllib

我有2个JavaRDD。第一个是

JavaRDD<CustomClass> data

,第二个是

JavaRDD<Vector> features

My Custom类有2个字段,(String)text和(int)标签。 我的JavaRDD数据中有1000个CustomClass实例,JavaRDD功能中有1000个Vector实例。

我通过使用JavaRDD数据并在其上应用地图函数来计算这1000个向量。

现在,我想要一个新的形式为

的JavaRDD
JavaRDD<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);

1 个答案:

答案 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的结果,这也会使值保持一致。