Apache Sedona Python API调用报错:'JavaPackage'对象不可调用
核心原因
你遇到的TypeError: 'JavaPackage' object is not callable是因为Sedona Shaded包版本与PySpark版本不兼容。当前你使用的sedona-spark-shaded-3.0_2.12:1.5.3是针对PySpark 3.0.x系列的,而你的PySpark版本为3.3.2,版本不匹配导致Python API无法找到对应的Java实现类。
SQL功能正常是因为Spark SQL扩展已注册Sedona的SQL函数,无需直接调用底层Java类;但Python API需要直接绑定对应的Java UDF,版本不匹配就会出现找不到类的问题。
解决方案
1. 替换兼容的Sedona Shaded包
修改spark.jars.packages配置,将Sedona包换成适配PySpark 3.3.x的版本:
.set('spark.jars.packages', 'org.apache.sedona:sedona-spark-shaded-3.3_2.12:1.5.3,org.datasyslab:geotools-wrapper:1.5.3-28.2')\
注意:Sedona Shaded包命名规则为sedona-spark-shaded-{spark主版本号}_{scala版本号}:{sedona版本号},PySpark 3.3.x对应后缀3.3,你的环境scala版本2.12匹配无误。
2. 正确初始化Sedona上下文
创建SparkSession后,必须通过Sedona的初始化方法加载Python API所需的Java绑定:
from sedona.spark import SedonaContext # 构建SparkSession(保留你的原有配置) spark = SparkSession.builder \ .appName("SedonaTest") \ .set('spark.jars.packages', 'org.apache.sedona:sedona-spark-shaded-3.3_2.12:1.5.3,org.datasyslab:geotools-wrapper:1.5.3-28.2') \ .set('spark.jars.repositories', 'https://artifacts.unidata.ucar.edu/repository/unidata-all') \ .set("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,org.apache.sedona.viz.sql.SedonaVizExtensions,org.apache.sedona.sql.SedonaSqlExtensions") \ .getOrCreate() # 初始化Sedona上下文 spark = SedonaContext.create(spark)
3. 测试Python API
修改配置后重新运行你的Python函数代码:
from sedona.sql import st_constructors as stc # 创建测试DataFrame df = spark.sql("SELECT array(0.0, 1.0, 2.0) AS values") # 使用Python API创建Point df = df.select(stc.ST_Point(1.0, 3.0).alias("point")) df.show()
此时应能正常运行,不再出现JavaPackage相关错误。
版本兼容性验证
Sedona 1.5.3支持的PySpark版本包括3.0、3.1、3.2、3.3,对应Shaded包的后缀分别为3.0、3.1、3.2、3.3,需严格匹配你的PySpark主版本号。
内容的提问来源于stack exchange,提问作者Alexander Arlievsky

