Synapse Analytics PySpark中filter报错list对象不可调用的解决咨询
问题排查与解决:Synapse Analytics中DataFrame过滤报错及条件列添加
问题原因
你定义了名为col的列表变量col=['col_name'],这和Spark内置的pyspark.sql.functions.col函数重名了。执行df2.filter(col('col_name')=='dob')时,Python会优先调用你自定义的列表col,而非Spark的col函数,因此抛出“TypeError: list object is not callable”错误。
修复方案
方案1:重命名自定义变量
修改自定义列名列表的变量名,避免与Spark内置函数冲突:
df1 = df.columns colName = [] for e in df1: list1 = [e] colName.append(list1) # 重命名变量,规避函数名冲突 col_names = ['col_name'] df2 = spark.createDataFrame(colName, col_names) display(df2) # 现在可正常执行filter操作 display(df2.filter(col('col_name') == 'dob'))
方案2:明确调用Spark的col函数
若不想修改变量名,直接使用完整路径调用Spark内置函数:
display(df2.filter(pyspark.sql.functions.col('col_name') == 'dob'))
原代码简化优化(可选)
你原有的循环逻辑可以简化为一行代码,更高效简洁:
# 直接生成包含原列名的嵌套列表 colName = [[e] for e in df.columns] col_names = ['col_name'] df2 = spark.createDataFrame(colName, col_names)
基于col_name添加条件列示例
修复后,可正常基于col_name列的值添加条件列,比如标记日期类型列:
from pyspark.sql.functions import when df2 = df2.withColumn( 'is_date_column', when(col('col_name').isin('dob', 'register_date'), 1).otherwise(0) ) display(df2)
内容的提问来源于stack exchange,提问作者Mich
相关产品推荐
相关产品推荐

