添加条件过滤子句
Adding a conditional filter clause
这是我的数据框和过滤器:
df = spark.range(3)
filter1 = (F.col('id') == 1)
filter2 = (F.col('id') == 2)
flag = False
我想让 filter2
依赖于 flag
。 flag = 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
和按位 &
条件。只有当 filter2
和 flag
return 都为 True 否则为 False 时,这只会 return True。将其与带有 or 条件的 filter1 一起使用。
output = df.filter(filter1 |(filter2 & F.lit(flag)))
这是我的数据框和过滤器:
df = spark.range(3)
filter1 = (F.col('id') == 1)
filter2 = (F.col('id') == 2)
flag = False
我想让 filter2
依赖于 flag
。 flag = 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
和按位 &
条件。只有当 filter2
和 flag
return 都为 True 否则为 False 时,这只会 return True。将其与带有 or 条件的 filter1 一起使用。
output = df.filter(filter1 |(filter2 & F.lit(flag)))