在PySpark中尽可能多地发现匹配的id

问题描述 投票:0回答:3

我有一个 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 代码都值得赞赏。

dataframe apache-spark pyspark
3个回答
0
投票

我看到了一种基于距离度量的匹配算法。 n 维房间中的欧几里德。你只是二维的,所以你可以简单地计算向量 在此输入链接描述

背后的原理是有一个池,计算每个距离,然后从池中删除每个找到的对。所以在这个例子中你不能再次匹配 B1,因为它们已经出局了。

该算法从 Pool 数组计算向量 我发现了这个,只有片段,我认为这是Python:

diffVec[count] = np.power(np.sum(np.power(currentDiff,c)/numBins),1/c)

numpy 模块


0
投票

我找到了一个最简单的方法来做到这一点,但不确定它是否有效。

result = df.orderBy(col("score").desc(), col("id2").asc(), col("id1").asc()) \
.dropDuplicates(["id2", "score"]) \
.drop("score") \
.select('id1', 'id2') \
.dropDuplicates(["id2"]) \
.dropDuplicates(["id1"])

0
投票

我相信这应该有效:

bc=ab.sort('id2','score')
bc=ab.groupby(col("id2")).agg(max("score"),first("id1"))

之后您可以删除分数栏。

© www.soinside.com 2019 - 2024. All rights reserved.