如何在 PySpark 中使用 .contains() 按单个或多个子字符串进行过滤?

2023-11-30

这是一个简单的问题(我认为),但我不确定回答它的最佳方法。

我需要根据 Spark Dataframe 中包含字符串的列中是否存在“子字符串”进行过滤。

目前我正在执行以下操作(使用过滤.contains):

data = [[1, "ABC"], [2, "DEF"], [3, "DEF"], [4, "JFKLMN"], [5, "JFKOPQ"], [6, "MNO"]]

df = pd.DataFrame(data, columns=["Item", "String"])
sdf = spark.createDataFrame(df)

但我想概括这一点,以便我可以过滤到一个或多个字符串,如下所示:

filtered_sdf = sdf.filter(
    spark_fns.col("String").contains("JFK") | spark_fns.col("String").contains("ABC")
) 

or

filtered_sdf = sdf.filter(
    spark_fns.col("String").contains("ABC")
)

where ideally, the .contains()部分是包含 1+ 个子字符串的预设参数。

有谁知道最好的方法是什么?或者其他方法?

我尝试过使用.isin(substring_list)但它不起作用,因为我们正在搜索子字符串的存在。


您可以创建适合所有所需模式的正则表达式模式:

list_desired_patterns = ["ABC", "JFK"]
regex_pattern = "|".join(list_desired_patterns)

然后应用类似的 Column 方法:

filtered_sdf = sdf.filter(
    spark_fns.col("String").rlike(regex_pattern)
)

这将过滤any匹配所需模式的列表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 PySpark 中使用 .contains() 按单个或多个子字符串进行过滤? 的相关文章

随机推荐