Apache spark Spark jdbc覆盖模式未按预期工作
我想使用spark执行更新和插入操作 请查找现有表的图像引用 在这里,我正在更新id:101 location和inserttime,并插入另外两条记录: 并以覆盖模式写入目标Apache spark Spark jdbc覆盖模式未按预期工作,apache-spark,pyspark,apache-spark-sql,aws-glue,Apache Spark,Pyspark,Apache Spark Sql,Aws Glue,我想使用spark执行更新和插入操作 请查找现有表的图像引用 在这里,我正在更新id:101 location和inserttime,并插入另外两条记录: 并以覆盖模式写入目标 df.write.format("jdbc") .option("url", "jdbc:mysql://localhost/test") .option("driver","com.mysql.jdbc.Driver
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()
执行上述命令后,我的数据已损坏,并插入到db表中
数据帧中的数据
请告诉我您的观察结果和解决方案,Spark JDBC writer支持以下模式:
- append:将此:类:DataFrame的内容追加到现有数据
- 覆盖:覆盖现有数据
- 忽略:如果数据已经存在,则以静默方式忽略此操作
- 错误(默认情况):如果数据已存在,则引发异常
由于您使用的是“覆盖”模式,因此它会根据列长度重新创建表,如果您希望自己的表定义,请先创建表并使用“附加”模式,Spark JDBC writer支持以下模式:
- append:将此:类:DataFrame的内容追加到现有数据
- 覆盖:覆盖现有数据
- 忽略:如果数据已经存在,则以静默方式忽略此操作
- 错误(默认情况):如果数据已存在,则引发异常
UPDATE
语句中没有与Spark SQL等价的语句。也没有与Spark SQL的SQLDELETE WHERE
语句等价的语句。相反,您必须删除Spark之外需要更新的行,然后使用append
模式将包含新记录和更新记录的Spark数据框写入表中(以保留表中剩余的现有行)
我想使用spark执行更新和插入操作
SQL
UPDATE
语句中没有与Spark SQL等价的语句。也没有与Spark SQL的SQLDELETE WHERE
语句等价的语句。相反,您必须删除Spark之外需要更新的行,然后使用append
模式将包含新记录和更新记录的Spark数据框写入表中(以保留表中剩余的现有行) 执行以下步骤时,Upsert逻辑工作正常
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())
尽管如此,我仍然无法理解当我直接使用数据帧进行写入时,为什么它会失败
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())
尽管如此,我仍然无法理解当我直接使用数据帧进行编写时它失败的逻辑。如果您需要在pyspark代码中执行UPSERT/DELETE操作,我建议您使用pymysql库,并执行UPSERT/DELETE操作。请查看此帖子以了解更多信息,并参考代码示例:
请根据需要修改代码示例。如果您需要在pyspark代码中执行UPSERT/DELETE操作,我建议您使用pymysql库,并执行UPSERT/DELETE操作。请查看此帖子以了解更多信息,并参考代码示例:
请根据需要修改代码示例。我不建议截断,因为它实际上会删除表并创建新表。执行此操作时,表可能会丢失先前设置的列级属性…因此,在使用TRUNCATE时要小心,并确保是否可以删除表/重新创建表。我不建议使用TRUNCATE,因为它实际上会删除表并创建新表。执行此操作时,表可能会丢失先前设置的列级属性…因此在使用TRUNCATE时要小心,并确保,如果可以删除表格/重新创建表格。我希望您检查第一个图像,我已经有一个表格,其中包含数据,我想更新表格中的记录。您是否可以共享问题中的虚拟df以重新创建问题,如果表中已有的数据需要更新,我希望您检查第一个图像,我已经有一个表,其中包含数据,我想更新表中的记录您是否可以在问题中共享虚拟df以重新创建问题,如果表中已有的数据需要更新,那么选项truncate和modeoverwrite的功能是什么。我已经澄清了关于SQL Delete的答案。对于Spark JDBC写入模式,您应该参考文档。文档中似乎没有“truncate”选项。那么选项truncate和模式覆盖的功能是什么。我已经澄清了关于SQL Delete的答案。对于Spark JDBC写入模式,您应该参考文档。文档中似乎没有“truncate”选项。这只是截断表并从数据帧插入行的效果。这里没有更新行为。dbtable需要dbname.tbname这只会截断表并从数据帧插入行。此处没有更新行为。dbtable需要dbname.tbname