我想问一下,是否有办法在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在一对多连接中遇到了一些问题
是否有直接执行此联接的方法
提前谢谢
目前没有回答
相关问题 更多 >
编程相关推荐