PySpark部分匹配列与字典值

时间:2020-06-19 03:52:59

标签: python apache-spark pyspark

我有字典:

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

和带有单个列的数据框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 个答案:

答案 0 :(得分:3)

Contains 检查字符串中的子字符串是否存在,并且.isin检查在< em>项目列表,但您的情况是根据列表匹配字符串。

代替使用 .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|
#+------------+