Pyspark:提取值包含字符串的数据帧的行

Posted

技术标签:

【中文标题】Pyspark:提取值包含字符串的数据帧的行【英文标题】:Pyspark: Extracting rows of a dataframe where value contains a string of characters 【发布时间】:2020-11-28 07:46:44 【问题描述】:

我正在使用 pyspark,我有一个大数据框,其中只有一列值,其中每一行都是一长串字符:

col1
-------
'2020-11-20;id09;150.09,-20.02'
'2020-11-20;id44;151.78,-25.14'
'2020-11-20;id78;148.24,-22.67'
'2020-11-20;id55;149.77,-27.89'
...
...
...

我正在尝试提取“idxx”匹配字符串列表的数据帧行,例如 [“id01”、“id02”、“id22”、“id77”、...]。目前,我从数据框中提取行的方式是:

df.filter(df.col1.contains("id01") | df.col1.contains("id02") | df.col1.contains("id22") | ... )

有没有一种方法可以提高效率,而不必将每个字符串项都硬编码到过滤器函数中?

【问题讨论】:

【参考方案1】:

尝试在 pyspark 中使用 .rlike 运算符。

Example:

df.show(10,False)
#+-----------------------------+
#|col1                         |
#+-----------------------------+
#|2020-11-20;id09;150.09,-20.02|
#|2020-11-20;id44;151.78,-25.14|
#|2020-11-20;id78;148.24,-22.67|
#+-----------------------------+

#(id09|id78) match either id09 or id78
#for your case use this df.filter(col("col1").rlike('(id01|id02|id22)')).show(10,False)

df.filter(col("col1").rlike('(id09|id78)')).show(10,False)
#+-----------------------------+
#|col1                         |
#+-----------------------------+
#|2020-11-20;id09;150.09,-20.02|
#|2020-11-20;id78;148.24,-22.67|
#+-----------------------------+

【讨论】:

【参考方案2】:
from functools import reduce
from operator import or_

str_list = ["id01", "id02", "id22", "id77"]
df.filter(reduce(or_, [df.col1.contains(s) for s in str_list]))

【讨论】:

以上是关于Pyspark:提取值包含字符串的数据帧的行的主要内容,如果未能解决你的问题,请参考以下文章

randomSplit pyspark 更改数据帧的值

Pyspark数据帧:根据另一列的值提取列

应用模型后Pyspark提取转换数据帧的概率[重复]

从 PySpark 中的复杂列中提取值

Pyspark - 如何将多个数据帧的列连接成一个数据帧的列

如何使用具有不同列号pyspark的两个数据帧的并集