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

wtlkbnrh  于 2021-07-13  发布在  Spark
关注(0)|答案(0)|浏览(119)

我想问一下,是否有一种方法可以在pyspark中执行一对多连接并只获得第一个匹配行?
问题是我有两个dataframe(表a和b),而b的连接变量中有一些带星号的记录,当表a中的记录有不匹配的值时,这些记录充当catch all值。表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的行号也带过来。之后,我会过滤掉重复与非最小行号。

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在一对多连接中遇到了一些问题。
有什么方法可以直接执行这个连接吗?
提前谢谢!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题