gpt4 book ai didi

python-3.x - 如果包含字符串列表,则过滤 pyspark 数据框

转载 作者:行者123 更新时间:2023-12-03 21:18:08 27 4
gpt4 key购买 nike

假设我们有一个 pyspark 数据框,其中一列( column_a )包含一些字符串值,并且还有一个字符串列表( list_a )。

数据框:

column_a      | count
some_string | 10
another_one | 20
third_string | 30

列表_a:
['string', 'third', ...]

如果 column_a 的值包含 list_a 的项目之一,我想过滤此数据框并仅保留行。

这是用于过滤 column_a 的代码基于单个字符串:
df['column_a'].like('%string_value%')

但是,对于字符串列表,我们如何获得相同的结果呢? (保留 column_a 的值为 'string'、'third' 的行,...)

最佳答案

IIUC,要返回column_a所在的行是“像”(在 SQL 意义上)list_a 中的任何值.

一种方法是使用 functools.reduce :

from functools import reduce

list_a = ['string', 'third']

df1 = df.where(
reduce(lambda a, b: a|b, (df['column_a'].like('%'+pat+"%") for pat in list_a))
)
df1.show()
#+------------+-----+
#| column_a|count|
#+------------+-----+
#| some_string| 10|
#|third_string| 30|
#+------------+-----+

本质上,您遍历了 list_a 中所有可能的字符串。比较 like和“或”结果。下面是执行计划:
df1.explain()
#== Physical Plan ==
#*(1) Filter (Contains(column_a#0, string) || Contains(column_a#0, third))
#+- Scan ExistingRDD[column_a#0,count#1]

另一种选择是使用 pyspark.sql.Column.rlike 而不是 like .
df2 = df.where(
df['column_a'].rlike("|".join(["(" + pat + ")" for pat in list_a]))
)

df2.show()
#+------------+-----+
#| column_a|count|
#+------------+-----+
#| some_string| 10|
#|third_string| 30|
#+------------+-----+

其中有对应的执行计划:
df2.explain()
#== Physical Plan ==
#*(1) Filter (isnotnull(column_a#0) && column_a#0 RLIKE (string)|(third))
#+- Scan ExistingRDD[column_a#0,count#1]

关于python-3.x - 如果包含字符串列表,则过滤 pyspark 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58186366/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com