Pyspark:如何根据字符串和前缀的缺失过滤数据帧?

Pyspark:如何根据字符串和前缀的缺失过滤数据帧?,pyspark,apache-spark-sql,pyspark-dataframes,rlike,Pyspark,Apache Spark Sql,Pyspark Dataframes,Rlike,我有一个像这样的pyspark数据框,其中有“zodiac”的行和有“nonzodiac”的行 spark.createDataFrame( [ (1, '1234ESPNnonzodiac'), (2, '1234ESPNzodiac'), (3, '963CNNnonzodiac'), (4, '963CNNzodiac'), ], ['id', 'col1'] ) 我可以得到所有非黄道带行,如下

我有一个像这样的pyspark数据框,其中有“zodiac”的行和有“nonzodiac”的行

spark.createDataFrame(
    [
        (1, '1234ESPNnonzodiac'), 
        (2, '1234ESPNzodiac'),
        (3, '963CNNnonzodiac'), 
        (4, '963CNNzodiac'),
    ],
    ['id', 'col1'] 
)
我可以得到所有非黄道带行,如下所示:

nonzodiac_rows = df.where(f.col("col1").rlike("nonzodiac"))
但是我很难只返回带有“zodiac”的行,因为做类似的操作会同时返回zodiac行和非zodiac行

zodiac_rows = df.where(f.col("col1").rlike("zodiac"))

这是因为非黄道带包含黄道带子串。您需要编写更严格的regexp 例如,再添加一个字符:

zodiac_rows = df.where(f.col("col1").rlike("Nzodiac"))
或者在黄道带之前限制非黄道带

zodiac_rows = df.where(f.col("col1").rlike("(?<!non)zodiac")) 

zodiac_rows=df.where(f.col(“col1”).rlike((?这是因为非zodiac包含zodiac子字符串。您需要编写更严格的regexp
例如,再添加一个字符:

zodiac_rows = df.where(f.col("col1").rlike("Nzodiac"))
或者在黄道带之前限制非黄道带

zodiac_rows = df.where(f.col("col1").rlike("(?<!non)zodiac")) 

zodiac_rows=df.where(f.col(“col1”).rlike((?您可以使用逻辑
not
运算符执行与“non-zodiac”
where
相反的操作

zodiac_rows = df.where(~f.col("col1").rlike("nonzodiac"))
此外,还有
过滤器
功能可以以不同的方式帮助您

zodiac_rows = df.filter(~f.col('col1').contains('nonzodiac')).collect()
              

您可以使用逻辑
not
运算符执行与“非黄道带”相反的
where

zodiac_rows = df.where(~f.col("col1").rlike("nonzodiac"))
此外,还有
过滤器
功能可以以不同的方式帮助您

zodiac_rows = df.filter(~f.col('col1').contains('nonzodiac')).collect()
              

(?!non)zodiac
=
zodiac
因为
zod
不等于
non
@WiktorStribiżew非常感谢,修复了bug
(?!non)zodiac
=
zodiac
因为
zod
不等于
non
@WiktorStribiżew非常感谢,修复了这个bug