Scala:如何将数据框中一列的数据与另一列的数据进行匹配
我有以下数据,希望将数据从df1的ID列匹配到df2 df1: Df2: 代码: 我得到的输出如下:Scala:如何将数据框中一列的数据与另一列的数据进行匹配,scala,apache-spark,Scala,Apache Spark,我有以下数据,希望将数据从df1的ID列匹配到df2 df1: Df2: 代码: 我得到的输出如下: ID key 1 777 1 765 2 708 3 4 5 然而,我期望如下,这里的逻辑是来自df1的,我们有id列值1,在df2中,值1匹配了不止一次,因此我得到了上面的输出。但我不应该匹配第二个事件,因为它匹配第一个事件 预期产出: ID key 1 777 2 708 3 4 5 我不应该匹配第二个事件,因为它匹
ID key
1 777
1 765
2 708
3
4
5
然而,我期望如下,这里的逻辑是来自df1的,我们有id列值1,在df2中,值1匹配了不止一次,因此我得到了上面的输出。但我不应该匹配第二个事件,因为它匹配第一个事件
预期产出:
ID key
1 777
2 708
3
4
5
我不应该匹配第二个事件,因为它匹配第一个事件
我建议您为df2创建一个递增的id,以便在加入df1时识别匹配顺序,以便以后可以轻松地仅在第一个匹配中进行筛选。为此,您可以受益于单调地增加\u id()
然后将数据帧分为匹配数据帧和非匹配数据帧
之后,在匹配df
上,为每个窗口上的每一行生成行号,按ID分组,并按上面提到的递增ID进行排序。然后在第一个匹配行中进行筛选。然后合并到不匹配的数据框中,删除新创建的列,并用空字符填充所有空字符
你应该满足你的要求
+---+---+
|ID |key|
+---+---+
|1 |777|
|2 |708|
|3 | |
|4 | |
|5 | |
+---+---+
ID key
1 777
1 765
2 708
3
4
5
ID key
1 777
2 708
3
4
5
import org.apache.spark.sql.functions._
val finalDF = Df1.join(DF2.withColumnRenamed("key", "key2").withColumn("order", monotonically_increasing_id()), $"ID" === $"first" || $"ID" === $"second" || $"ID" === $"third","left").select($"ID", $"key2".as("key").cast(StringType), $"order")
val notMatchingDF = finalDF.filter($"key".isNull || $"key" === "")
val matchingDF = finalDF.except(notMatchingDF)
import org.apache.spark.sql.expressions._
def windowSpec = Window.partitionBy("ID").orderBy("order")
matchingDF.withColumn("order", row_number().over(windowSpec))
.filter($"order" === 1)
.union(notMatchingDF)
.drop("order")
.na.fill("")
+---+---+
|ID |key|
+---+---+
|1 |777|
|2 |708|
|3 | |
|4 | |
|5 | |
+---+---+