Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark jdbc覆盖模式未按预期工作_Apache Spark_Pyspark_Apache Spark Sql_Aws Glue - Fatal编程技术网

Apache spark Spark jdbc覆盖模式未按预期工作

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

我想使用spark执行更新和插入操作 请查找现有表的图像引用

在这里,我正在更新id:101 location和inserttime,并插入另外两条记录:

并以覆盖模式写入目标

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的内容追加到现有数据
  • 覆盖:覆盖现有数据
  • 忽略:如果数据已经存在,则以静默方式忽略此操作
  • 错误(默认情况):如果数据已存在,则引发异常

由于您使用的是“覆盖”模式,所以它会根据列长度重新创建表,如果您希望自己的表定义,请先创建表并使用“附加”模式

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

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

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


SQL
UPDATE
语句中没有与Spark SQL等价的语句。也没有与Spark SQL的SQL
DELETE 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