pyspark中的筛选器值不相等

crcmnpdw  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(706)

我有一张如下的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”时,如何筛选??每个案例的代码是什么?我尝试了这些代码,但它们不返回任何行:

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

它似乎没有捕获空值

0ve6wy6x

0ve6wy6x1#

首先填充空值并进行筛选。

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  |
+---+----+---+
kmb7vmvb

kmb7vmvb2#

我认为问题是它们是空的,空值在某种程度上是特殊的
尝试此操作以筛选 Buy 这不是我的错

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|
+---+----+----+

相关问题