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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:30:01