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
相关产品推荐
相关产品推荐

