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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:02:27