pyspark 中的过滤值不相等

Filter values not equal in pyspark

我有一个 table 如下所示:

+---+----+----+
| id|Sell| Buy|
+---+----+----+
|  A|null|null|
|  B|   Y|   Y|
|  C|null|   Y|
|  D|   Y|null|
|  E|null|null|
+---+----+----+

当值等于“Y”时,我可以轻松过滤单个或两个列。例如,当两列均为“Y”时,以下过滤器:

df.filter((df["Buy"] == "Y") & (df["Sell"] == "Y"))

但是,当单列或两列不等于“Y”时,我该如何过滤??每个案例的代码是什么?我试过这些代码,但它们 return 没有行:

df.filter((df["Buy"] != "Y") & (df["Sell"] != "Y"))
df.filter(~((df["Buy"] == "Y") | (df["Sell"] == "Y")))

它似乎没有捕获空值

我认为问题在于它们是 null,null 值有些特殊

试试这个来筛选 Buy 不是 Y

的值
df.filter((df["Buy"] != "Y") | (df["Buy"].isNull()))

因此,如果您想按照您尝试过的方式过滤买卖不在 'Y' 的地方,您需要这样做:

 df.filter((df["Buy"] != "Y") | (df["Buy"].isNull()) & (df["Sell"] != "Y") | (df["Sell"].isNull()))

快速示例:

输入

+---+----+----+
| id|Sell| Buy|
+---+----+----+
|  A|null|null|
|  B|   Y|   Y|
|  C|   Y|null|
|  D|   Y|null|
|  E|null|null|
+---+----+----+

输出

>>> df.filter((df["Buy"] != "Y") | (df["Buy"].isNull())).show(10)
+---+----+----+
| id|Sell| Buy|
+---+----+----+
|  A|null|null|
|  C|   Y|null|
|  D|   Y|null|
|  E|null|null|
+---+----+----+

>>> df.filter((df["Buy"] != "Y") | (df["Buy"].isNull()) & (df["Sell"] != "Y") | (df["Sell"].isNull())).show(10)
+---+----+----+
| id|Sell| Buy|
+---+----+----+
|  A|null|null|
|  E|null|null|
+---+----+----+

先填空值再做过滤

df.na.fill('N') \
  .filter("Sell != 'Y' or Buy != 'Y'") \
  .show(10, False)

df.na.fill('N') \
  .filter("Sell != 'Y' and Buy != 'Y'") \
  .show(10, False)

+---+----+---+
|id |Sell|Buy|
+---+----+---+
|A  |N   |N  |
|C  |N   |Y  |
|D  |Y   |N  |
|E  |N   |N  |
+---+----+---+

+---+----+---+
|id |Sell|Buy|
+---+----+---+
|A  |N   |N  |
|E  |N   |N  |
+---+----+---+

简单易行的解决方法是使用 null 安全运算符

df.filter(~((df["Buy"].eqNullSafe("Y")) | (df["Sell"].eqNullSafe("Y"))))