PySpark Filter中OR运算符的正确使用(加州城市数组过滤)
Spark数组字段多值筛选的正确OR用法
你之前报错是因为在Python代码里误用了SQL的||运算符,Python环境下Spark DataFrame API的逻辑或需要用|(Column对象重载的位运算符),或者or_()函数,以下是几种可行的写法:
方法1:直接用|连接多个array_contains
注意每个条件要加括号(避免运算符优先级问题):
from pyspark.sql.functions import col, array_contains raw_df_2 = raw_df_1.filter( (array_contains(col("country.state.city"), 'San Diego')) | (array_contains(col("country.state.city"), 'Sacramento')) | (array_contains(col("country.state.city"), 'Los Angeles')) )
方法2:用reduce简化多条件拼接
当目标城市数量较多时,用functools.reduce批量生成OR条件:
from functools import reduce from pyspark.sql.functions import col, array_contains target_cities = ['San Diego', 'Sacramento', 'Los Angeles'] # 逐个拼接array_contains条件,用|连接 condition = reduce( lambda acc, city: acc | array_contains(col("country.state.city"), city), target_cities[1:], array_contains(col("country.state.city"), target_cities[0]) ) raw_df_2 = raw_df_1.filter(condition)
方法3:用exists函数更优雅
利用exists检查数组中是否有元素在目标列表内:
from pyspark.sql.functions import col, exists target_cities = ['San Diego', 'Sacramento', 'Los Angeles'] raw_df_2 = raw_df_1.filter( exists(col("country.state.city"), lambda city: city.isin(target_cities)) )
方法4:用SQL表达式风格
如果习惯SQL语法,可通过expr函数直接写SQL逻辑:
from pyspark.sql.functions import expr raw_df_2 = raw_df_1.filter( expr(""" array_contains(country.state.city, 'San Diego') OR array_contains(country.state.city, 'Sacramento') OR array_contains(country.state.city, 'Los Angeles') """) )
内容的提问来源于stack exchange,提问作者Alyssa
相关产品推荐
相关产品推荐

