You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PySpark过滤包含指定文本的数组列?

PySpark字符串数组过滤问题解决方法

你之前用PySpark处理数字数组过滤的代码是这样的:

is_even = lambda x: x % 2 == 0
res = df.withColumn("arr_evens", filter(col("some_arr"), is_even))
res.show()

输出结果:

+---------------+---------+
|       some_arr|arr_evens|
+---------------+---------+
|[1, 2, 3, 5, 7]|      [2]|
|      [2, 4, 9]|   [2, 4]|
+---------------+---------+

现在处理字符串数组时,想过滤出指定列表中的单词,尝试用x.isin(list)报错TypeError: 'function' object is not iterable,问题出在两个地方:

  1. 你可能把目标列表的变量名取成了list,覆盖了Python内置的list函数,导致传入的是函数对象而非可迭代列表;
  2. PySpark的filter中lambda的参数x是Column对象,要调用PySpark Column类的isin()方法,而非Python原生的判断逻辑。

正确的写法如下:

from pyspark.sql import functions as F

# 定义要保留的目标单词(注意不要用list当变量名)
target_words = ["cat", "dog", "fish"]

# 构造测试DataFrame
df = spark.createDataFrame(
    [(["cat", "bird", "dog", "tiger"],), (["elephant", "fish", "rabbit"],)],
    ["str_arr"]
)

# 过滤出数组中属于target_words的元素
res = df.withColumn("filtered_arr", F.filter(F.col("str_arr"), lambda x: x.isin(target_words)))
res.show()

输出结果:

+------------------------+-------------+
|str_arr                 |filtered_arr |
+------------------------+-------------+
|[cat, bird, dog, tiger] |[cat, dog]   |
|[elephant, fish, rabbit]|[fish]       |
+------------------------+-------------+

如果不想用lambda,也可以直接传入目标值:

res = df.withColumn("filtered_arr", F.filter(F.col("str_arr"), lambda x: x.isin("cat", "dog", "fish")))

关键要点:

  • 避免用Python内置关键字/函数名(比如list)作为变量名;
  • 在PySpark的filter函数中,lambda参数是Column类型,必须使用PySpark提供的Column方法来做判断。

内容的提问来源于stack exchange,提问作者Katy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:37:08