我有这段代码:
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写下你的答案。