Python pyspark-与或条件连接
如果至少满足两个条件之一,我想加入两个pyspark数据帧 玩具数据:Python pyspark-与或条件连接,python,dataframe,apache-spark,join,pyspark,Python,Dataframe,Apache Spark,Join,Pyspark,如果至少满足两个条件之一,我想加入两个pyspark数据帧 玩具数据: df1 = spark.createDataFrame([ (10, 1, 666), (20, 2, 777), (30, 1, 888), (40, 3, 999), (50, 1, 111), (60, 2, 222), (10, 4, 333), (50, None, 444), (10, 0, 555), (50, 0, 666)
df1 = spark.createDataFrame([
(10, 1, 666),
(20, 2, 777),
(30, 1, 888),
(40, 3, 999),
(50, 1, 111),
(60, 2, 222),
(10, 4, 333),
(50, None, 444),
(10, 0, 555),
(50, 0, 666)
],
['var1', 'var2', 'other_var']
)
df2 = spark.createDataFrame([
(10, 1),
(20, 2),
(30, None),
(30, 0)
],
['var1_', 'var2_']
)
我想维护df1
的所有行,其中var1
存在于df2的不同值中。var1\u
或var2
存在于df2.var2\u
的不同值中(但不在该值为0的情况下)
因此,预期的产出将是
+----+----+---------+-----+-----+
|var1|var2|other_var|var1_|var2_|
+----+----+---------+-----+-----+
| 10| 1| 666| 10| 1| # join on both var1 and var2
| 20| 2| 777| 20| 2| # join on both var1 and var2
| 30| 1| 888| 10| 1| # join on both var1 and var2
| 50| 1| 111| 10| 1| # join on var2
| 60| 2| 222| 20| 2| # join on var2
| 10| 4| 333| 10| 1| # join on var1
| 10| 0| 555| 10| 1| # join on var1
+----+----+---------+-----+-----+
在其他尝试中,我尝试了
cond = [(df1.var1 == (df2.select('var1_').distinct()).var1_) | (df1.var2 == (df2.filter(F.col('var2_') != 0).select('var2_').distinct()).var2_)]
df1\
.join(df2, how='inner', on=cond)\
.show()
+----+----+---------+-----+-----+
|var1|var2|other_var|var1_|var2_|
+----+----+---------+-----+-----+
| 10| 1| 666| 10| 1|
| 20| 2| 777| 20| 2|
| 30| 1| 888| 10| 1|
| 50| 1| 111| 10| 1|
| 30| 1| 888| 30| null|
| 30| 1| 888| 30| 0|
| 60| 2| 222| 20| 2|
| 10| 4| 333| 10| 1|
| 10| 0| 555| 10| 1|
| 10| 0| 555| 30| 0|
| 50| 0| 666| 30| 0|
+----+----+---------+-----+-----+
但是我获得了比预期更多的行,并且var2==0
的行也被保留了下来
我做错了什么
注意:我没有使用
.isin
方法,因为我的实际df2
大约有20k行,并且我已经了解到使用大量ID的此方法可能会有不良性能。请尝试以下条件:
cond = (df2.var2_ != 0) & ((df1.var1 == df2.var1_) | (df1.var2 == df2.var2_))
df1\
.join(df2, how='inner', on=cond)\
.show()
+----+----+---------+-----+-----+
|var1|var2|other_var|var1_|var2_|
+----+----+---------+-----+-----+
| 10| 1| 666| 10| 1|
| 30| 1| 888| 10| 1|
| 20| 2| 777| 20| 2|
| 50| 1| 111| 10| 1|
| 60| 2| 222| 20| 2|
| 10| 4| 333| 10| 1|
| 10| 0| 555| 10| 1|
+----+----+---------+-----+-----+
该条件应仅包括要联接的两个数据帧中的列。如果要删除var2\u0
,可以将其作为联接条件,而不是筛选器
也不需要指定
distinct
,因为它不影响相等条件,而且还添加了不必要的步骤。非常感谢您的回答!不幸的是,我意识到我在所需的输出中有一个重复的行(|30 | 1 | 888 | 30 | null |
),我不希望这样。另外,我不想加入df2.var2
的空值(在我的例子中,它们可以被视为值0)。代码应该如何更改?很抱歉给您带来不便。在这种情况下,代码更简单,您只需使用!=0
。见编辑后的答案。