在Jupyter Notebook中调用Scala类方法时出现TypeError: 'JavaPackage' object is not callable错误的求助
解决在PySpark Jupyter Notebook中调用Scala类方法的问题
我来帮你梳理下问题根源,然后一步步给出正确的调用方式:
核心问题分析
你遇到的错误主要来自两个关键点:
- 类名大小写不匹配:你的Scala类和object都是全小写的
test,但调用时用了大写的Test——Py4J对类名大小写严格敏感,这直接导致它找不到目标类,返回了JavaPackage对象。 - 实例方法与静态方法混淆:
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
相关产品推荐
相关产品推荐

