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

Koalas/Pyspark本地运行报Failed to find data source: delta错误如何解决

报错原因说明

java.lang.ClassNotFoundException: Failed to find data source: delta 报错的根本原因是本地Spark运行环境未加载Delta数据源的依赖包,Koalas的to_delta底层直接调用Spark的Delta写入接口,因此两种调用方式都会触发相同报错。

本地Pyspark引入Delta依赖配置方法

通用运行配置

有两种常用配置方式,二选一即可:

方式1:代码内指定依赖(推荐,无需修改本地Spark环境)

初始化SparkSession时直接配置Delta依赖包及参数,运行时会自动从Maven仓库拉取对应版本的jar包:

from pyspark.sql import SparkSession
import databricks.koalas as ks

# 注意Delta版本必须和本地Spark版本严格匹配:
# Spark 3.3.x → Delta 2.2.x
# Spark 3.4.x → Delta 2.4.x
# Spark 3.5.x → Delta 3.0.x
# 下方示例为Spark3.4对应Delta2.4版本
spark = SparkSession.builder \
    .appName("delta_test") \
    .config("spark.jars.packages", "io.delta:delta-core_2.12:2.4.0") \
    .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \
    .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \
    .getOrCreate()

# 初始化完成后两种写入方式均可正常运行
# 方式1:Koalas直接写
kdf = ks.DataFrame({'eid': [1, 2, 3],
                    'contigName': ['chr1', 'chr2', 'chr3'],
                    'phen1': [0.123, 0.456, 0.789],
                    'phen2': [0.987, 0.654, 0.321]})
kdf.to_delta(path='tmp/test.delta', mode='overwrite')

# 方式2:转Spark DataFrame写(注意必须加.save()方法)
kdf.to_spark().write.format('delta').mode('overwrite').save('tmp/test_spark.delta')

方式2:离线环境手动导入jar包

如果本地环境无法联网,可提前从Maven仓库下载对应版本的delta-core和delta-storagejar包,放入本地Spark安装目录的jars文件夹下即可,无需额外配置。

Pycharm单元测试专项配置

方式1:单测fixture内置Spark配置

在pytest单测的Spark初始化fixture中加入Delta相关配置即可,示例:

import pytest
from pyspark.sql import SparkSession

@pytest.fixture(scope="session")
def spark():
    spark = SparkSession.builder \
        .master("local[1]") \
        .appName("unit_test") \
        .config("spark.jars.packages", "io.delta:delta-core_2.12:2.4.0") \
        .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \
        .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \
        .getOrCreate()
    yield spark
    spark.stop()

所有单测直接调用该fixture获取Spark实例即可正常读写Delta表。

方式2:修改Pycharm运行配置

如果不想修改代码,可在Pycharm的Run/Debug Configurations中找到对应单测的配置项,在Environment variables中添加变量:

SPARK_SUBMIT_ARGS=--packages io.delta:delta-core_2.12:2.4.0 pyspark-shell

保存后运行单测会自动加载Delta依赖。

Koalas与Spark写Delta的差异及迁移注意事项

写入一致性说明

Koalas的to_delta方法底层完全封装Spark的Delta写入接口,只要Spark版本、Delta版本、写入参数完全一致,两种方式写入的Delta表格式、数据内容完全相同,不存在兼容性问题。

差异及注意事项

  • 调用方式差异:Koalas的to_delta直接传入路径参数即可完成写入,Spark写入需要在write调用后追加.save(路径)方法,漏写会导致仅生成写入算子不执行实际写入。
  • 参数默认值完全对齐:Koalas的to_delta所有参数(如mode、partitionBy、overwriteSchema等)和Spark write的Delta参数默认值、含义完全一致,迁移时无需修改参数配置。
  • 存量表迁移注意点:
    • 本地使用的Delta版本不能低于Databricks上创建该Delta表使用的Delta版本,避免低版本写入损坏高版本格式的存量表。
    • 切换写入方式前先在临时路径测试写入、读取流程,比对数据行数、Schema、字段值和原写入结果完全一致后再操作正式存量表。
    • 如果是分区表,需确认两边写入的分区字段顺序、数据类型完全一致,避免分区数据错乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:30:04