我想问一下,是否有一种方法可以在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在一对多连接中遇到了一些问题。
有什么方法可以直接执行这个连接吗?
提前谢谢!
暂无答案!
目前还没有任何答案,快来回答吧!