我有一段代码:
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 contains=[文档1列,文档2列,文档3列]
其中,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台不同的计算机上(因为它是大数据编程),所以,
文件列1在一台计算机上;文档列2在另一台计算机上;文件列3在第3台计算机上
如果它们都在不同的计算机上,你如何计算上面的呢?
我需要用笛卡尔坐标 cm.cartesian(cm)
但我甚至不知道从哪里开始,因为cm在数据集中。我想也许我可以把它转换成一个数组,然后比较索引,但是我以前从来没有处理过数据集,所以我不知道怎么做,或者什么是最好的策略。
请用java spark写下你的答案。
1条答案
按热度按时间wqsoz72f1#
这似乎是minhash算法的理想情况。
此算法允许您接收数据流(例如来自3台不同的计算机),并使用多个哈希函数计算流之间的相似性,即jaccard相似性。
您可以在spark wiki上找到minhash算法的实现:http://spark.apache.org/docs/2.2.3/ml-features.html#minhash-对于jaccard距离