如何找到两列不相等的行(就像使用 pandas 一样)?
data = [("John", "Doe"), (None, "Doe"), ("John", None), (None, None)]
df = spark.createDataFrame(data, ["first", "last"])
df
first last
John Doe
null Doe
John null
null null
预期输出:
first last
John Doe
null Doe
John null
我试过了
df_filtered = df.filter(col("first") != col("last"))
您可以尝试以下。
df_filtered = df.filter("nvl(first, '') <> nvl(last, '')")
+-----+----+
|first|last|
+-----+----+
|John |Doe |
|NULL |Doe |
|John |NULL|
+-----+----+
有多种方法可以在 PySpark 中获得预期输出,如下所示:
equal_null
:
df.filter(~equal_null(col("first"), col("last")))
nvl
:
df.filter(nvl(col("first"), lit("")) != nvl(col("last"), lit("")))
ifnull
:
df.filter(ifnull(col("first"), lit("")) != ifnull(col("last"), lit("")))
您可以通过许多其他方式来做到这一点,就像 @s.polam 在他们的答案中所做的那样,也可以使用
expr
或仅使用 SparkSQL。对我来说,最简洁的方法是使用 equal_null
的方法,因为它完全符合您的要求,并且不需要像其他方法那样任何额外的文字(空字符串)。