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

AWS Glue ETL作业JDBC写入MSSQL临时表大文件报错的解决方法

修复AWS Glue写入MSSQL全局临时表时的Invalid object name错误

错误原因

MSSQL的全局临时表(##temptable)仅在创建它的JDBC会话中可见。处理大文件时,Spark会将数据拆分到多个分区,每个分区由不同Executor独立建立JDBC连接执行写入:第一个Executor的会话创建了全局临时表,但其他Executor的新会话无法识别该表,因此抛出Invalid object name错误。小文件仅需单个分区处理,单一会话完成创建+写入流程,因此无异常。

修复方案

方案1:使用普通中间表替代全局临时表(推荐)

将全局临时表替换为普通中间表,所有Executor的JDBC连接均可访问该表。完成写入后,可按需将数据迁移至全局临时表或直接使用。

修改后的代码:

jdbc_url = "jdbc:sqlserver://{host}:{port};database={databaseName};user={username};password={password}".format(
    host=args[host],
    port=args[port], 
    databaseName=args[name],
    username= args[username],
    password=args[password]
)

# 写入普通中间表
file_data.write.jdbc(url=jdbc_url, table="temp_intermediate", mode="overwrite")

# 可选:将中间表数据导入全局临时表
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
spark.sql("CREATE TABLE ##temptable AS SELECT * FROM temp_intermediate")

# 可选:清理中间表
spark.sql("DROP TABLE temp_intermediate")

方案2:强制单分区写入(仅适用于中小数据量)

通过coalesce(1)将DataFrame合并为单个分区,确保仅使用一个JDBC会话完成创建和写入。此方法会牺牲并行处理能力,不建议用于超大文件。

修改后的代码:

jdbc_url = "jdbc:sqlserver://{host}:{port};database={databaseName};user={username};password={password}".format(
    host=args[host],
    port=args[port], 
    databaseName=args[name],
    username= args[username],
    password=args[password]
)

# 合并为单分区后写入全局临时表
file_data.coalesce(1).write.jdbc(url=jdbc_url, table="##temptable", mode="overwrite")

方案3:预创建全局临时表并保持连接

在Spark主会话中预先创建全局临时表,通过JDBC连接保持选项确保分区写入时复用会话,从而访问已创建的全局临时表。需提前明确表结构。

修改后的代码:

jdbc_url = "jdbc:sqlserver://{host}:{port};database={databaseName};user={username};password={password}".format(
    host=args[host],
    port=args[port], 
    databaseName=args[name],
    username= args[username],
    password=args[password]
)

# 预先在主会话创建全局临时表(替换为实际表结构)
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
spark.read.jdbc(url=jdbc_url, query="CREATE TABLE ##temptable (col1 INT, col2 VARCHAR(50), col3 DATE)")

# 写入时启用连接保持,使用append模式避免重复建表
file_data.write.jdbc(
    url=jdbc_url,
    table="##temptable",
    mode="append",
    properties={"keepAliveConnection": "true"}
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 02:35:19