火花jdbc的writemode覆盖无法正常工作

时间:2020-05-10 01:31:57

标签: apache-spark pyspark apache-spark-sql aws-glue

我想使用spark执行更新和插入操作 请找到现有表格的图片参考

![ ] 1

在这里,我正在更新id:101的位置和插入时间,并插入另外2条记录

enter image description here

并使用模式覆盖写入目标

df.write.format("jdbc")
  .option("url",  "jdbc:mysql://localhost/test")
  .option("driver","com.mysql.jdbc.Driver")
  .option("dbtable","temptgtUpdate")
  .option("user", "root")
  .option("password", "root")
  .option("truncate","true")
  .mode("overwrite")
  .save()

执行上述命令后,我的数据已损坏,已插入数据库表

enter image description here

数据框中的数据

enter image description here

请让我知道您的发现和解决方案

5 个答案:

答案 0 :(得分:1)

Spark JDBC编写器支持以下模式:

由于您使用的是“覆盖”模式,因此如果您希望自己的表定义先创建表并使用“追加”模式,则会按照列长重新创建表

答案 1 :(得分:1)

我想使用spark进行更新和插入操作

Spark SQL没有与SQL UPDATE语句等效的语句。 Spark SQL也没有等效的SQL DELETE WHERE语句。相反,您将必须删除Spark外部需要更新的行,然后使用append模式将包含新记录和更新记录的Spark数据帧写入表中(以保留表中剩余的现有行)。

答案 2 :(得分:1)

如果您需要在pyspark代码中执行UPSERT / DELETE操作,我建议您使用pymysql libary,并执行您的upsert / delete操作。请检查此帖子以获取更多信息,并提供代码示例以供参考:Error while using INSERT INTO table ON DUPLICATE KEY, using a for loop array

请根据您的需要修改代码示例。

答案 3 :(得分:0)

我不建议TRUNCATE,因为它实际上会删除表并创建新表。在执行此操作时,该表可能会丢失先前设置的列级属性...因此,在使用TRUNCATE时要小心,并确保删除表/重新创建表是否可以。

答案 4 :(得分:-1)

执行以下步骤时,upsert逻辑工作正常

df.coalesce(1).write.format(“ csv”).save(“ file:/// C:/ Users / test / Desktop / temp1”,header = True) df = spark.read.format(“ csv”).load(“ file:/// C:/Users/test/Desktop/temp1/temp1.csv”,header = True,delimiter =',')

然后做

df.write.format(“ jdbc”)。option(“ url”,“ jdbc:mysql:// localhost / test”).option(“ driver”,“ com.mysql.jdbc.Driver”)。 option(“ dbtable”,“ temptgtUpdate”)。option(“ user”,“ root”)。option(“ password”,“ root”)。option(“ truncate”,“ true”)。mode(“ overwrite”) .save()

当我直接使用数据帧进行写入时,我仍然无法理解其失败的逻辑