Как использовать .contains() в PySpark для фильтрации по одной или нескольким подстрокам?

#python #apache-spark #pyspark #apache-spark-sql

Вопрос:

Это простой вопрос (я думаю), но я не уверен, что это лучший способ ответить на него.

Мне нужно фильтровать на основе наличия «подстрок» в столбце, содержащем строки в фрейме данных Spark.

В настоящее время я выполняю следующее (фильтрация с использованием .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") )   

или

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

где в идеале .contains() часть представляет собой предварительно заданный параметр, содержащий 1 подстрок.

Кто-нибудь знает, как лучше всего это сделать? Или альтернативный метод?

Я пробовал использовать .isin(substring_list) , но это не работает, потому что мы ищем наличие подстрок.

Ответ №1:

Использование сопоставления регулярных выражений решает проблему!

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