如何将DataFrame保存到Databricks数据库表?遇字段缺失报错
解决Databricks保存MS SQL表的错误问题
核心问题
你当前的操作多了不必要的Pandas中转步骤,这既导致Spark列元数据紊乱(引发IllegalStateException列找不到错误),还触发了Pandas API弃用警告。直接用Spark原生操作就能解决所有问题。
正确操作步骤
跳过Pandas中转,直接用Spark DataFrame保存
从MS SQL读取后得到的remote_table本身就是Spark DataFrame,无需转成Pandas再转回Spark,直接调用保存方法即可:driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver" database_host = "myservername" database_port = "1433" # 非默认端口请修改 database_name = "mydbname" table = "mytablename" user = "username" password = "password" url = f"jdbc:sqlserver://{database_host}:{database_port};database={database_name}" # 读取MS SQL数据到Spark DataFrame remote_table = (spark.read .format("jdbc") .option("driver", driver) .option("url", url) .option("dbtable", table) .option("user", user) .option("password", password) .load() ) display(remote_table) # 直接保存到Databricks表,无需经过Pandas # mode参数可选:overwrite(覆盖已有表)、append(追加)、ignore(存在则跳过)、error(默认,存在报错) remote_table.write.mode("overwrite").saveAsTable("edl_dev_app_ent_deat_src.test")检查查询的表名一致性
你最后执行SQL查询的是edl_dev_app_ent_deat_src.test2,但保存的表是edl_dev_app_ent_deat_src.test,确认表名是否正确,避免因笔误导致的找不到表/列错误。解决FutureWarning(可选)
如果你确实需要用到Pandas转换,升级PySpark到3.3及以上版本即可——新版本已经修复了iteritems的弃用问题,改用items调用。但更推荐直接用Spark原生操作,性能更高且避免额外问题。
额外注意事项
- 确保
edl_dev_app_ent_deat_src数据库已存在,若不存在先执行CREATE DATABASE IF NOT EXISTS edl_dev_app_ent_deat_src; - 如果需要指定表的存储格式(比如Delta),可以在保存时加上
.format("delta"),Databricks默认就是Delta格式,无需额外指定。
内容的提问来源于stack exchange,提问作者김서연
相关产品推荐
相关产品推荐

