0

我有这段代码:

StructType schema = new StructType(
                new StructField[] { DataTypes.createStructField("file_path", DataTypes.StringType, false),
                        DataTypes.createStructField("file_content",
                                DataTypes.createArrayType(DataTypes.StringType, false), false) });

Dataset<Row> df = spark.createDataFrame(shinglesDocs.map(new Function<Tuple2<String, String[]>, Row>() {
            @Override
            public Row call(Tuple2<String, String[]> record) {
                return RowFactory.create(record._1().substring(record._1().lastIndexOf("/") + 1), record._2());
            }
        }), schema);
        df.show(true);

CountVectorizer vectorizer = new CountVectorizer().setInputCol("file_content").setOutputCol("feature_vector")
                .setBinary(true);
        CountVectorizerModel cvm = vectorizer.fit(df);
        Broadcast<Integer> vocabSize = sc.broadcast(cvm.vocabulary().length);
        System.out.println("vocab size = " + cvm.vocabulary().length;
        for (int i = 0; i < vocabSize.value(); i++) {
            System.out.print(cvm.vocabulary()[i] + "(" + i + ") ");
        }
        System.out.println();

        Dataset<Row> characteristicMatrix = cvm.transform(df);
        characteristicMatrix.show(false);

cm 包含 = [ column-for-document1,column-for-document-2,column-for-document3 ]

其中 column-for-document1 看起来像这样 (1, 0, 1, 1, 0, 0, 1, 1 )

我需要计算 JS=a/(a+b+c)

  • column-for-document1 和 column-for-document2 之间的 Jaccard 相似度 (JS)
  • column-for-document1 和 column-for-document3 之间的 Jaccard 相似度 (JS)
  • column-for-document2 和 column-for-document3 之间的 Jaccard 相似度 (JS)

但是cm是一个大文件,它在 3 台不同的计算机上(因为它是大数据编程),所以,

column-for-document1 在一台计算机上;column-for-document2 在另一台计算机上;column-for-document3 在第三台计算机上

如果它们都在不同的计算机上,您如何计算上述内容?

我需要为此使用笛卡尔

cm.cartesian(cm)

但我什至不确定从哪里开始,因为cm在数据集中。我想也许我可以将它转换成一个数组然后比较索引,但我以前从未使用过数据集,所以我不知道该怎么做或者什么是最好的策略。

请用java spark写下你的答案。

4

1 回答 1

1

这似乎是 MinHash 算法的理想情况。

该算法允许您获取数据流(例如来自 3 台不同计算机的数据)并使用多个哈希函数计算流之间的相似度,即 Jaccard 相似度。

您可以在 spark wiki 上找到 MinHash 算法的实现:http: //spark.apache.org/docs/2.2.3/ml-features.html#minhash-for-jaccard-distance

于 2020-07-06T20:32:46.877 回答