如何使用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,问题出在两个地方:
- 你可能把目标列表的变量名取成了
list,覆盖了Python内置的list函数,导致传入的是函数对象而非可迭代列表; - 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
相关产品推荐
相关产品推荐

