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

PySpark运行Filter代码报错:'Column'对象不可调用

解决PySpark中TypeError: 'Column' object is not callable错误

问题原因分析

你遇到的这个错误,核心原因有两个,结合你的代码来看,直接触发错误的是方法名拼写错误:

  • PySpark中Column对象的“不匹配模糊查询”方法是notLike()(驼峰命名,L大写),但你写了全小写的notlike(),Python找不到这个方法,就会把Column对象当成函数去调用,从而抛出'Column' object is not callable的错误;
  • 另外你的代码嵌套了过多括号,不仅可读性极差,还很容易出现括号不匹配的问题,这也是这类错误的常见诱因。

修正后的代码

我把你的复杂条件拆分成了多个子条件变量,既提升可读性,也避免括号问题,同时修正了拼写错误:

from pyspark.sql import functions as F

# 桌面端含confirmacion的明确页面条件
desktop_confirm = (
    (F.col('post_v1_web_page_name') == 'escritorio:publica:general:formulario:formulario crm tarjetas bbva:confirmacion') |
    (F.col('post_v1_web_page_name') == 'escritorio:publica:general:formulario:formulario crm tarjetas bbva paca:confirmacion') |
    (F.col('post_v1_web_page_name') == 'escritorio:publica:general:formulario:tarjeta tres meses sin:confirmacion') |
    (F.col('post_v1_web_page_name') == 'escritorio:publica:general:formulario:tarjetas premium:confirmacion') |
    (F.col('post_v1_web_page_name') == 'escritorio:publica:general:formulario:tarjeta repsol credito:confirmacion') |
    (F.col('post_v1_web_page_name') == 'escritorio:publica:personas:tarjeta repsol:credito:tarjetas:confirmacion') |
    (F.col('post_v1_web_page_name') == 'escritorio:privada:particulares:tarjeta credito:3 estudio de la solicitud:1 direccion entrega')
)

# 模糊匹配含confirmacion的页面条件
like_confirm = (
    ((F.col('post_v1_web_page_name').like("%formulario:formulario%")) & 
     (F.col('post_v1_web_page_name').like("%tarjeta%")) & 
     (F.col('post_v1_web_page_name').like("%crm%")) & 
     (F.col('post_v1_web_page_name').like("%confirma%"))) |
    ((F.col('post_v1_web_page_name').like("%escritorio:publica:personas%")) & 
     (F.col('post_v1_web_page_name').like("%tarjetas:credito%")) & 
     (F.col('post_v1_web_page_name').like("%confirmacion%"))) |
    ((F.col('post_v1_web_page_name').like("%responsive-tablet:publica:personas%")) & 
     (F.col('post_v1_web_page_name').like("%tarjetas:credito%")) & 
     (F.col('post_v1_web_page_name').like("%confirmacion%")))
)

# 移动端含finalizado的页面条件(修正了notLike拼写)
mobile_finalized = (
    ((F.col('post_v1_web_page_name').like("%formulario:tarjetas de credito%")) |
     (F.col('post_v1_web_page_name').like("%formulario:tarjetas repsol%")) |
     (F.col('post_v1_web_page_name').like("%web-movil:publica:general:formulario:tarjeta repsol credito%")) |
     (F.col('post_v1_web_page_name').like("%web-movil:tarjetas:tarjeta despues%")) |
     (F.col('post_v1_web_page_name').like("%web-movil:formulario:tarjeta viat bbva%")) |
     (F.col('post_v1_web_page_name').like("%web-movil:publica:particulares:formulario:tarjeta viat%")) |
     (F.col('post_v1_web_page_name').like("%web-movil:formulario:tarjeta refe dorada%")) |
     (F.col('post_v1_web_page_name').like("%web-movil:formulario:tarjetas motor credito bbva%")) |
     (F.col('post_v1_web_page_name').like("%web-movil:formulario:credito tarjeta viajes movil%")) |
     (F.col('post_v1_web_page_name').like("%web-movil:formulario:tarjetas de credito tarjetas bbva")) |
     (F.col('post_v1_web_page_name').like("%web-movil:formulario:tarjetas de credito 3 meses sin%")) |
     (F.col('post_v1_web_page_name') == 'responsive-mobile:publica:personas:tarjetas:credito:tarjeta respsol:finalizado') |
     (F.col('post_v1_web_page_name') == 'responsive:mobile:publica:personas:tarjeta repsol:credito:tarjetas:nombre:finalizado')) &
    (F.col('post_v1_web_page_name').like("%finalizado%")) &
    (F.col('post_v1_web_page_name').notLike("%debito%"))  # 这里修正了拼写错误
)

# 其他含finalizado的页面条件
other_finalized = (
    ((F.col('post_v1_web_page_name') == 'web-movil:formulario:otros:2 finalizado') & 
     (F.col('post_v47_appl_typology_name') == 'TMM')) |
    ((F.col('post_v1_web_page_name').like("%publica:personas%")) & 
     (F.col('post_v1_web_page_name').like("%tarjetas:credito%")) & 
     (F.col('post_v1_web_page_name').like("%finalizado%"))) |
    ((F.col('post_v1_web_page_name').like("%card request form%")) & 
     (F.col('post_v1_web_page_name').like("%confirmation%")))
)

# 组合所有条件并过滤数据
filtered_data = data.filter(desktop_confirm | like_confirm | mobile_finalized | other_finalized)

额外建议

  • 写PySpark条件时,尽量拆分复杂逻辑为多个子变量,这样既能提升代码可读性,也方便排查语法错误;
  • 牢记PySpark的API大多是驼峰命名规则,比如notLike、contains、startswith等,避免拼写错误;
  • 如果不确定方法名,可以在代码中用dir(F.col('xxx'))查看该Column对象的可用方法列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:17:31