Spark Dataframe(Pyspark)行之间的成对运算

Sas*_*een 6 cosine-similarity apache-spark pyspark spark-dataframe

我有Spark Dataframe两列:idhash_vector.该id是为一个文件的ID和hash_vector一个SparseVector单词的计数对应于文件(并有大小30000).在...中有大约100000行(每个文档一行)Dataframe.

现在,我想找到每对文档之间的相似之处.为此,我想从列中计算余弦相似度hash_vector.我可能还想尝试其他相似性度量,如Jaccard指数.这样做的好方法是什么?我正在使用PySpark.我有一些想法:

  1. 我可以columnSimilarities用来找到成对点产品.但我读到对于具有size_of_vocabulary >> number_of_documents的语料库来说效率更高(这里不是这种情况)
  2. 我可以循环遍历Dataframe行,对于第i行,将第i行作为列添加new_column到其中Dataframe,然后编写一个udf在两列上找到相似性(余弦或Jaccard):hash_vectornew_column.但我读到循环遍历行打败了使用Spark的所有目的.
  3. 最后,我只存储超过某个阈值的相似性.由于我有很多文档,我可以预期相似的矩阵非常稀疏.

我知道这是一个广泛的问题.但我有兴趣了解专家如何考虑这个问题.我很欣赏任何方向.

Mon*_*tah 0

您是否尝试过表与自身的交叉连接?例如

# 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')))
Run Code Online (Sandbox Code Playgroud)