我想使用spark执行更新和插入操作 请找到现有表格的图片参考
在这里,我正在更新id:101的位置和插入时间,并插入另外2条记录
并使用模式覆盖写入目标
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()
执行上述命令后,我的数据已损坏,已插入数据库表
数据框中的数据
请让我知道您的发现和解决方案
答案 0 :(得分:1)
Spark JDBC编写器支持以下模式:
错误(默认情况):如果数据已经存在,则引发异常
https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html
由于您使用的是“覆盖”模式,因此如果您希望自己的表定义先创建表并使用“追加”模式,则会按照列长重新创建表
答案 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()
当我直接使用数据帧进行写入时,我仍然无法理解其失败的逻辑