使用 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上使用JDBC连接Trino

AWS Glue CDK - 创建作业类型 Spark (Glue 2.0)

如何在 Windows 中使用 Scala 将 Cassandra 与 Spark 连接起来

使用 spark 和 scala 进行连接计数时获得性能的最佳方法