PySpark частичное сопоставление столбца со словарными значениями - PullRequest
1 голос
/ 19 июня 2020

У меня есть словарь:

dict = {key1: "value1", key2: "value2", key3 : "value3"}

и dataframe test_dta с одним столбцом:

   Col
 value1
 value2 
 value3
 wrong_value
 value1value4
 ...

Мои ожидаемые результаты - отфильтровать фрейм данных, где он будет только возвращать строки которые частично совпадают со значением словаря. Т.е.

Colu          
value1      
value2      
value3      
value1value4

Я пробовал такие подходы, как:

test_dta.filter(test_dta.Colu.contains(list(dict.values())))

, но возвращает сообщение об ошибке.

Могу ли я узнать правильный / другие способы достижения этого?

Спасибо!

1 Ответ

3 голосов
/ 19 июня 2020

Contains проверяет наличие подстроки в строке и .isin проверяет, соответствует ли какое-либо значение найдено в списке элементов но ваш случай должен соответствовать строке на основе списка.

Вместо этого используйте .rlike, мы можем сгенерировать условие or(|) и отфильтровать только совпадающие строки.

Example:

df.show()
#+------------+
#|         Col|
#+------------+
#|      value1|
#|      value2|
#|      value3|
#|       wrong|
#|value1value2|
#+------------+
dict = {'key1': "value1", 'key2': "value2", 'key3' : "value3"}

from pyspark.sql.functions import *
#filter using rlike and generate expression dynamically based on dict.values
df.filter(col("Col").rlike("|".join(["(" +l+")" for l in list(dict.values())]))).show()
#+------------+
#|         Col|
#+------------+
#|      value1|
#|      value2|
#|      value3|
#|value1value2|
#+------------+
...