查找列不匹配的行

问题描述 投票:0回答:2

如何找到两列不相等的行(就像使用 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"))
pyspark filter apache-spark-sql
2个回答
0
投票

您可以尝试以下。

df_filtered = df.filter("nvl(first, '') <> nvl(last, '')")
+-----+----+
|first|last|
+-----+----+
|John |Doe |
|NULL |Doe |
|John |NULL|
+-----+----+

0
投票

有多种方法可以在 PySpark 中获得预期输出,如下所示:

  1. 使用
    equal_null
    df.filter(~equal_null(col("first"), col("last")))
    
  2. 使用
    nvl
    df.filter(nvl(col("first"), lit("")) != nvl(col("last"), lit("")))
    
  3. 使用
    ifnull
    df.filter(ifnull(col("first"), lit("")) != ifnull(col("last"), lit("")))
    

您可以通过许多其他方式来做到这一点,就像 @s.polam 在他们的答案中所做的那样,也可以使用

expr
或仅使用 SparkSQL。对我来说,最简洁的方法是使用
equal_null
的方法,因为它完全符合您的要求,并且不需要像其他方法那样任何额外的文字(空字符串)。

© www.soinside.com 2019 - 2024. All rights reserved.