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
相关产品推荐
相关产品推荐

