Spark Dataframe 行之间的成对操作(Pyspark)

b4wnujal  于 2023-03-03  发布在  Apache
关注(0)|答案(1)|浏览(109)

我有一个Spark Dataframe,它有两列:idhash_vectorid是文档的ID,hash_vector是与文档对应的字数的SparseVector(大小为30000)。Dataframe中有大约100000行(每个文档一行)。
现在,我想找到每对文档之间的相似性。为此,我想从列hash_vector计算余弦相似性。我可能还想尝试其他相似性度量,如Jaccard索引。什么是做这件事的好方法?我使用的是PySpark。我有几个想法:
1.我可以使用columnSimilarities来查找两两点积,但是I read对于size_of_vocabulary〉〉number_of_documents的语料库更有效(这里不是这种情况)
1.我可以遍历Dataframe行,对于第i行,将第i行作为列new_column添加到Dataframe中,然后写入udf,以查找两列的相似性(余弦或Jaccard):hash_vectornew_column。但是I read通过行循环胜过使用Spark的所有目的。
1.最后,我只存储超过某个阈值的相似性,因为我有很多文档,所以我可以预期相似性矩阵是相当稀疏的。
我知道这是一个宽泛的问题。但我很想知道一个Maven会如何考虑这个问题。我欣赏任何方向。

qni6mghb

qni6mghb1#

您是否尝试过将表与其自身进行交叉连接?例如

# table alias can be used to disambiguate identically named columns
df_a = df_original.alias('a')
df_b = df_original.alias('b')

# list all possible combinations
# then ignore where it's the same line on both sides
# ordered, so we don't process both (A,B) and then (B,A)
df_cross = df_a.crossJoin(df_b).filter('a.id < b.id')

# now apply a udf
df_similar = df_cross.withColumn('similarity', similarity_udf(col('a.hash_vector'), col('b.hash_vector')))

相关问题