添加条件过滤子句

Adding a conditional filter clause

这是我的数据框和过滤器:

df = spark.range(3)

filter1 = (F.col('id') == 1)
filter2 = (F.col('id') == 2)
flag = False

我想让 filter2 依赖于 flagflag = True时,我希望filter2生效,flag = False时不生效。

我知道我能做到

filt = filter1
if flag:
    filt = filt | filter2
df = df.filter(filt)

我想知道这是否可以在一行中实现,例如利用条件表达式/三元运算符等

这没有用:

df = df.filter(filter1 | filter2 if flag else False)

flag = False 时的期望结果:

+---+
| id|
+---+
|  1|
+---+

flag = True 时的期望结果:

+---+
| id|
+---+
|  1|
|  2|
+---+

我试图将它嵌套在一个 when-otherwise 块中,令人惊讶的是它以某种方式工作 -

数据准备

sparkDF = sql.range(3)

sparkDF.show()
+---+
| id|
+---+
|  0|
|  1|
|  2|
+---+

真标志 - 过滤器 - 何时 - 否则

filter1 = (F.col('id') == 1)
filter2 = (F.col('id') == 2)
flag = True

sparkDF.filter(F.when(F.lit(flag),filter1).otherwise(filter2)).show()
+---+
| id|
+---+
|  1|
+---+

假标志 - 过滤器 - 何时 - 否则

filter1 = (F.col('id') == 1)
filter2 = (F.col('id') == 2)
flag = False

sparkDF.filter(F.when(F.lit(flag),filter1).otherwise(filter2)).show()
+---+
| id|
+---+
|  2|
+---+

但是我怀疑,如果过滤条件将添加多个列进行过滤,这会中断。

在这种情况下,也许您可​​以进一步嵌套 when-when-*-otherwise

以下有效。但我仍然欢迎使用 python 的条件表达式/三元运算符的建议。使用它们,条件不会重复 - 可以看出,现在 filter1 重复了两次。

df = df.filter(F.when(F.lit(flag), filter1 | filter2).otherwise(filter1))

您可以在 flag 上使用 filter2 和按位 & 条件。只有当 filter2flag return 都为 True 否则为 False 时,这只会 return True。将其与带有 or 条件的 filter1 一起使用。

output = df.filter(filter1 |(filter2 & F.lit(flag)))