【问题标题】:How to write into Microsoft SQL Server table even if table exist using PySpark即使使用 PySpark 存在表,如何写入 Microsoft SQL Server 表
【发布时间】:2015-10-11 13:52:56
【问题描述】:

我有一个 PySpark 代码,它可以像这样写入 SQL Server 数据库

 df.write.jdbc(url=url, table="AdventureWorks2012.dbo.people", properties=properties)

但是问题是,即使表存在,我也想继续在表中写入人员,并且我在 Spark 文档中看到可能存在选项错误、追加、覆盖和忽略模式,并且所有这些都会引发错误,如果表已存在于数据库中,则对象已存在。

Spark throw 跟随错误 py4j.protocol.Py4JJavaError: 调用 o43.jdbc 时出错。 com.microsoft.sqlserver.jdbc.SQLServerException:数据库中已经有一个名为“people”的对象

即使表已经退出,有没有办法将数据写入表中? 请让我知道您需要更多解释

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    对我来说,问题在于 Spark 1.5.2。它检查表是否存在 (here) 的方法是运行SELECT 1 FROM $table LIMIT 1。如果查询失败,则表不存在。即使表在那里,该查询也会失败。

    这在 1.6.0 (here) 中更改为 SELECT * FROM $table WHERE 1=0

    【讨论】:

      【解决方案2】:

      所以appendoverwrite 模式在表已经存在时不会抛出错误。从 spark 文档(http://spark.apache.org/docs/latest/sql-programming-guide.html#save-modesSaveMode.Append 中将“将 DataFrame 保存到数据源时,如果数据/表已经存在,则 DataFrame 的内容应附加到现有数据中。”和SaveMode.Overwrite 将“覆盖模式意味着当将DataFrame保存到数据源时,如果数据/表已经存在,现有数据预计会被DataFrame的内容覆盖。”根据您希望如何处理现有表,这两个中的一个应该可以满足您的需求。

      【讨论】:

      • @Holden 我正在加载这样的数据df.write.jdbc(url=url, table="AdventureWorks2012.dbo.people", mode="overwrite", properties=properties) 有什么问题,因为它仍然给出: com.microsoft.sqlserver.jdbc.SQLServerException: There is already an object named 'people' in the database 的错误吗?我正在使用火花 1.5
      • 在span class="comcopy">在save模式下覆盖Spark会删除表,如果存在的话,运行查询的用户是否有删除表的权限?
      • @Holden 是的,用户有权删除表。我甚至通过使用我用来连接的相同用户名删除表来测试权限..
      猜你喜欢
      • 2019-10-04
      • 2015-05-29
      • 1970-01-01
      • 2020-10-04
      • 2013-10-16
      • 2011-04-05
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多