Databricks Notebook中调用PySpark SQL函数hour时出现'int' object is not callable错误的排查求助
问题排查与解决:
'int' object is not callable 错误分析 首先得明确这个错误的本质:当你调用hour()时,Python把hour当成了一个整数而非PySpark的函数——就像你试图把数字5当函数调用一样,自然会报错。
为啥独立单元格正常,方法里就报错?
看你提供的代码,独立单元格里明确写了from pyspark.sql.functions import hour,这时候hour指向的是PySpark的内置函数。但你的write_data方法里没有导入这个函数,而且如果代码上下文(比如类的其他部分、全局变量)里刚好有个叫hour的整数变量(比如之前定义过hour = 8这类代码),就会直接覆盖PySpark的函数引用,导致调用时出错。
具体解决办法
1. 显式导入所需函数
最简单的方式,在方法内部或者类的顶部,把所有用到的PySpark函数都导入进来,确保作用域正确:
# 可以放在类的最顶部,或者write_data方法内部 from pyspark.sql.functions import col, lit, hour, to_timestamp def write_data(self,env,dt,file_list): status= True try: spark = SparkSession.builder.getOrCreate() read_hourly_file = spark.read.parquet(*file_list) partitionDF = read_hourly_file.withColumn("dt",lit(dt)).withColumn("env",lit(env)) new_df = partitionDF.withColumn("hour", hour(to_timestamp(col("cloud_timestamp")))) return new_df except : print("error",sys.exc_info()) return False return status
2. 用全限定名避免命名冲突
如果担心不小心和变量重名,直接用PySpark函数的全限定路径调用,不用单独导入:
def write_data(self,env,dt,file_list): status= True try: spark = SparkSession.builder.getOrCreate() read_hourly_file = spark.read.parquet(*file_list) partitionDF = read_hourly_file.withColumn("dt",lit(dt)).withColumn("env",lit(env)) # 直接通过spark.sql.functions调用,彻底避免命名冲突 new_df = partitionDF.withColumn( "hour", spark.sql.functions.hour(spark.sql.functions.to_timestamp(spark.sql.functions.col("cloud_timestamp"))) ) return new_df except : print("error",sys.exc_info()) return False return status
3. 检查是否存在同名变量
排查你的代码,看看在write_data方法之外,有没有定义过叫hour的整数变量,比如:
# 错误示例:这个变量会直接覆盖PySpark的hour函数 hour = 12 class YourDataProcessor: def write_data(self, env, dt, file_list): # 这里的hour已经是上面的整数12,调用时必然报错
如果有这种情况,要么把变量名改成别的(比如target_hour),要么把导入PySpark函数的语句放在这个变量定义之后。
调试小技巧
可以在write_data方法的try块开头加一行代码,确认hour的类型:
print(type(hour))
如果输出是<class 'int'>,那肯定是变量覆盖了函数;如果是<class 'function'>,再检查to_timestamp或col有没有同样的命名冲突问题。
内容的提问来源于stack exchange,提问作者K-mln
相关产品推荐
相关产品推荐

