在一个数据帧中获得两列之间的Jaccard相似性

时间:2019-09-01 01:05:04

标签: apache-spark pyspark pyspark-sql pyspark-dataframes

我想计算两列的Jaccard相似度,但我认为PySpark中没有类似的功能。我不确定什么是最好的计算方法。

例如,假设我们有1个看起来像这样的数据框:

| str1 | str2 |
===============
|  hi  |   h  |
|  me  |   p  |

这些列都是Stringtype,最终结果应如下所示:

| str1 | str2 | jaccard |
=========================
|  hi  |   h  |    0.5  |
|  me  |   p  |    0    |

我写了这样的udf,但是它不起作用。我对Spark还是很陌生,所以必须打破。我愿意接受任何解决方案,只要它可以在1个数据帧中准确计算2列的Jaccard sim。

jaccard = udf(lambda x, y: len(set(x).intersection(y))/len(set(x).union(y)))
candidates = candidates.withColumn("jaccard", jaccard(col("str1"), col("str2")))

1 个答案:

答案 0 :(得分:0)

我想我调试了自己的问题。以下代码返回了Jaccard的相似性。

jac = f.udf(lambda x, y: float(len(set(x).intersection(y)))/float(len(set(x).union(y))))
myDF = myDF.withColumn("jaccard", jac(myDF["str1"], myDF["str2"]))