Python 数据帧上的Pypark余弦相似性

Python 数据帧上的Pypark余弦相似性,python,apache-spark,pyspark,user-defined-functions,Python,Apache Spark,Pyspark,User Defined Functions,我有一个PySpark数据帧df1,看起来像: Customer1 Customer2 v_cust1 v_cust2 1 2 0.9 0.1 1 3 0.3 0.4 1 4 0.2 0.9 2 1 0.8 0.8 我想计算两个数据帧的余弦相似性。吃点类似的东西 Customer1

我有一个PySpark数据帧df1,看起来像:

Customer1  Customer2  v_cust1   v_cust2
   1           2         0.9      0.1
   1           3         0.3      0.4
   1           4         0.2      0.9
   2           1         0.8      0.8
我想计算两个数据帧的余弦相似性。吃点类似的东西

Customer1  Customer2  v_cust1   v_cust2  cosine_sim
   1           2         0.9      0.1       0.1
   1           3         0.3      0.4       0.9
   1           4         0.2      0.9       0.15
   2           1         0.8      0.8       1
我有一个python函数,它接收数字/数字数组,如下所示:

def cos_sim(a, b):
    return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))
如何使用udf在数据帧中创建余弦sim列?
我可以将几列而不是一列传递给udf cosine_sim函数吗?

如果您愿意使用

它在矢量化操作方面的性能优于spark UDF:

从pyspark.sql.functions导入PandasUDFType,pandasuudf 导入pyspark.sql.F函数 列名 a、 b=v_cust1,v_cust2 余弦sim\u col=余弦sim 创建一个保留列,以填充自udf约束以来的值 输入模式和输出模式必须保持不变。 df=df.with columnCosine_sim,F.lit1.0.0 @pandas_udfdf.schema,PandasUDFType.GROUPED_MAP def cos_simdf: df[cosine\u sim\u col]=floatnp.dotdf[a],df[b]/np.linalg.normdf[a]*np.linalg.normdf[b] 返回df 假设您希望按Customer1和Customer2对数组进行分组 df2=df.groupby[Customer1,Customer2].applycos\u sim 但是,如果要发送整个列,请使用相同的 所有行中的值并按其分组。例如: df3=df.withColumngroup,F.litgroup\u a.groupbygroup.applycos\u sim
你需要的是一个pandas_udf,而不是pyspark udfOkey谢谢,abd如果我想得到多个列之间的cos_sim,而不是一个列呢:那么你可以用这种方式概括pandas_udf。