Python环境安装delta-spark后无法识别delta数据源及JavaPackage调用报错
报错根因
两个报错均由Delta Lake对应的Java依赖未被Spark正确加载导致,并非Python层缺失依赖:
- 无法识别delta数据源:Spark运行时没有加载Delta的数据源实现类
TypeError: 'JavaPackage' object is not callable:DeltaTable对应的Java类不存在,Python侧调用空对象触发报错
解决步骤
- 第一步先严格匹配pyspark和delta-spark版本,两者大版本必须对应:比如delta-spark 2.4.x对应pyspark 3.4.x,delta-spark 3.0.x对应pyspark 3.5.x,版本不匹配是触发该类问题的高频原因
- 第二步修正初始化代码的笔误:原代码里
spark = spark = configure_spark_with_delta_pip(builder).getOrCreate()多写了一次spark =,会导致变量初始化异常 - 第三步如果不想依赖在线拉包、无需Maven,可提前下载对应版本的两个Jar包到本地:
delta-core_2.12-<你的delta版本号>.jar、delta-storage-<你的delta版本号>.jar,在SparkSession初始化时直接指定本地Jar路径即可完全离线运行
修正后可本地运行的示例代码
import pyspark from delta import * builder = pyspark.sql.SparkSession.builder.appName("MyApp") \ # 离线场景替换为你本地两个delta jar的绝对路径,多个jar用逗号分隔 .config("spark.jars", "/本地路径/delta-core_2.12-3.0.0.jar,/本地路径/delta-storage-3.0.0.jar") \ .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \ .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") # 去掉冗余的重复赋值 spark = configure_spark_with_delta_pip(builder).getOrCreate() # 测试写入 data = spark.range(0, 5) data.write.format("delta").mode("overwrite").save("/tmp/delta-table") # 测试isDeltaTable接口 print(DeltaTable.isDeltaTable(spark, "/tmp/delta-table"))
如果允许临时在线拉取一次包、后续可以离线运行的话,也可以不用手动下载Jar,直接在builder里加配置.config("spark.jars.packages", f"io.delta:delta-core_2.12:{delta版本号},io.delta:delta-storage:{delta版本号}")即可,拉取过一次之后Spark会自动缓存到本地,后续运行不需要再联网。
内容的提问来源于stack exchange,提问作者T.UK
相关产品推荐
相关产品推荐

