python-3.x - 如果包含字符串列表,则过滤 pyspark 数据帧
问题描述
假设我们有一个 pyspark 数据框,其中一列 ( column_a
) 包含一些字符串值,并且还有一个字符串列表 ( list_a
)。
数据框:
column_a | count
some_string | 10
another_one | 20
third_string | 30
list_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]
推荐阅读
- javascript - 与 GitHub API 用户名搜索相关的函数出现问题
- python - 如何根据分隔符或短语拆分文本列行并在每次拆分时保留名称?
- typescript - ExpressJS:如何将转译的 .js 文件包含在 HTML 中作为静态资源
- reactjs - Redux 正在为映射数组中的所有元素设置重复值
- android - 是否有任何功能可以检测视频是否使用 webview 完成?
- python - 按日期和类别分组的计数器功能
- android - Android Spinner 下拉菜单在向上/向下滚动期间随机丢失项目
- c - 只能指针保存 NULL 值吗?
- javascript - 使用来自变量的后缀打开 URL - JS/Jquery
- javascript - 带有 React 路由器的后端 API