Python 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)

如果至少满足两个条件之一,我想加入两个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)
    ],
    ['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
。见编辑后的答案。