使用 Glue 连接和 spark scala 覆盖 Mysql 表
Posted
技术标签:
【中文标题】使用 Glue 连接和 spark scala 覆盖 Mysql 表【英文标题】:Overwrite Mysql table using Glue connection and spark scala 【发布时间】:2020-02-08 22:35:03 【问题描述】:是否可以使用预定义的连接在 aws 粘合作业中执行预操作查询? 或者如何使用glueContext.getJDBCSink覆盖mysql表中的数据?
我要执行的代码是
val datasink4 = glueContext.getJDBCSink(
catalogConnection = "xxxxx_mysql",
options = JsonOptions(
""""dbtable": "xxxxx.role_code_se",
"database": "xxxxx",
"preactions": "TRUNCATE TABLE xxxxx.role_code_se;",
"overwrite": "true""""
),
redshiftTmpDir = "", transformationContext = "datasink4"
).writeDynamicFrame(new_dynamic_frame)
但它不起作用。它会忽略覆盖和截断选项并抛出错误
java.sql.BatchUpdateException:重复条目 '31' 用于键 'ix_role_code_se_role_code' 在
【问题讨论】:
在 MySQL 中覆盖数据对你来说是直截了当的,我假设?你真正的问题是如何使用glueContext.getJDBCSink? 【参考方案1】:Glue 只允许使用 redshift 进行 preactions 和 postactions,而不是其他数据库。如果要覆盖表,然后将 dynamicframe 转换为 dataframe,然后使用如下所示:
df.write.option("truncate", "true").jdbc(url=DATABASE_URL, table=DATABASE_TABLE, mode="overwrite", properties=DATABASE_PROPERTIES)
请参阅this 了解有关 spark jdbc 选项的更多信息,参阅this 了解示例。
【讨论】:
以上是关于使用 Glue 连接和 spark scala 覆盖 Mysql 表的主要内容,如果未能解决你的问题,请参考以下文章
Spark/Glue:.count() 或在约 20MM 记录和 1 个工作人员的数据帧上生成字段列表时的性能问题
AWS Glue ETL 作业的 Scala 和 Java 版本是啥?
AWS Glue CDK - 创建作业类型 Spark (Glue 2.0)