如何在spark中执行一对多连接并仅返回第一个匹配观察结果?

2024-10-02 14:22:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我想问一下,是否有办法在Pyspark中执行one-to-many-join,并仅获取第一个匹配行

问题是我有两个数据帧(表A和B),B的连接变量中有一些带有星号的记录,当表A中的记录有不匹配的值时,这些记录充当捕获所有值。表B是按顺序排列的,因此这些带星号的记录位于带特定值的记录之后,因此,如果以前的记录匹配,我们希望得到该记录

例如:

表A

Var1_A       Var2_A
A            C1
A            C3
B            C1
B            xsdf
D            C1 
D            C4

表B

nrow    Var1_B      Var2_B      Want
1       A           C1          val1
2       A           C2          val2
3       A           *           val3
4       B           C1          val4
5       B           C3          val5
6       B           *           val6
7       *           C1          val7
8       *           *           other

我想对表a执行左联接,并获得如下结果:

输出

Var1_A       Var2_A        Want
A            C1            val1
A            C3            val3
B            C1            val4
B            xsdf          val6
D            C1            val7
D            C4            other

到目前为止,我想到的是简单地执行一对多联接,并将表B的行数也带到表B中。之后,我将过滤掉具有非最小行号的重复项

Output = Table_A.join(Table_B,(((Table_A.Var1_A == Table_B.Var1_B)|(Table_B.Var1_B=="*")) & 
                               ((Table_A.Var2_A == Table_B.Var2_B)|(Table_B.Var2_B=="*")), how="left")
w = Window.partitionBy('Var1_A', 'Var2_A')
Output=Output.withColumn('minrow', f.min('nrow').over(w)).
                          where(f.col('minrow') == f.col('nrow'))

然而,问题是表A实际上是一个非常大的表,包含更多的联接变量,我希望避免由于联接而增加其大小。我似乎还记得spark在一对多连接中遇到了一些问题

是否有直接执行此联接的方法

提前谢谢


Tags: output记录table星号joinc1wantc3