我有一个 Spark DataFrame,比如
id1 | id2 | 分数 |
---|---|---|
A1 | B1 | 9 |
A2 | B1 | 9 |
A2 | B2 | 7 |
A3 | B2 | 5 |
我想在 PySpark 中找到最匹配的 id1/id2 ,输出是
id1 | id2 |
---|---|
A1 | B1 |
A2 | B2 |
挑战在于 Row(A2, B1, 9) 的得分最高 = 9,但 B1 已与 A1 匹配,因此 A2 将与 B2 匹配。匹配尽可能多的 id1 和 id2 对,而不重复使用已经配对的 id2,即使这意味着为某些 id1 选择较低的分数。这更像是一个贪心分配问题。
您知道在 PySpark 代码中执行此操作的方法吗?
任何想法和 PySpark 代码都值得赞赏。
我看到了一种基于距离度量的匹配算法。 n 维房间中的欧几里德。你只是二维的,所以你可以简单地计算向量 在此输入链接描述
背后的原理是有一个池,计算每个距离,然后从池中删除每个找到的对。所以在这个例子中你不能再次匹配 B1,因为它们已经出局了。
该算法从 Pool 数组计算向量 我发现了这个,只有片段,我认为这是Python:
diffVec[count] = np.power(np.sum(np.power(currentDiff,c)/numBins),1/c)
numpy 模块
我找到了一个最简单的方法来做到这一点,但不确定它是否有效。
result = df.orderBy(col("score").desc(), col("id2").asc(), col("id1").asc()) \
.dropDuplicates(["id2", "score"]) \
.drop("score") \
.select('id1', 'id2') \
.dropDuplicates(["id2"]) \
.dropDuplicates(["id1"])
我相信这应该有效:
bc=ab.sort('id2','score')
bc=ab.groupby(col("id2")).agg(max("score"),first("id1"))
之后您可以删除分数栏。