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

在Jupyter Notebook中调用Scala类方法时出现TypeError: 'JavaPackage' object is not callable错误的求助

解决在PySpark Jupyter Notebook中调用Scala类方法的问题

我来帮你梳理下问题根源,然后一步步给出正确的调用方式:

核心问题分析

你遇到的错误主要来自两个关键点:

  1. 类名大小写不匹配:你的Scala类和object都是全小写的test,但调用时用了大写的Test——Py4J对类名大小写严格敏感,这直接导致它找不到目标类,返回了JavaPackage对象。
  2. 实例方法与静态方法混淆:hello和addInt是实例方法,必须先创建test类的实例才能调用,不能直接通过类名访问。

正确调用步骤

步骤1:创建Scala类的实例

先获取小写的test类引用,再实例化它:

# 获取Scala类的引用,注意类名是小写的test
test_class = sc._jvm.com.ing.wbaa.spark.udf.test
# 创建类的实例
test_instance = test_class()

步骤2:调用hello方法

通过创建好的实例调用hello方法(注意要加括号,Py4J需要显式声明无参方法调用):

test_instance.hello()

执行后就能看到控制台输出hello了。

步骤3:调用addInt方法

同样通过实例调用,传入整数参数即可:

sum_result = test_instance.addInt(1, 1)
print(sum_result)  # 输出:2

步骤4:调用main方法(如果需要)

main是Scala object中的静态方法,要使用小写的test引用,并且需要传入String数组参数:

# 获取Scala object的引用
test_object = sc._jvm.com.ing.wbaa.spark.udf.test
# 创建空的String数组(需要传参时可修改数组内容)
args = sc._jvm.java.lang.String[](0)
# 调用main方法
test_object.main(args)

错误原因复盘

  • 用Test(大写)调用:Py4J找不到对应类,返回JavaPackage对象,因此调用时抛出TypeError: 'JavaPackage' object is not callable。
  • 直接用类名调用hello:hello是实例方法,必须依赖类实例才能执行,直接通过类名访问会返回JavaPackage,调用自然失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:12:27