Python 数据帧上的Pypark余弦相似性
我有一个PySpark数据帧df1,看起来像: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
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。