在写入数据帧pyspark之前从表中删除记录



在将数据从数据帧写入表之前,我正在尝试从表中删除记录。这对我不起作用。。。我做错了什么?

Goal: "delete from xx_files_tbl" before writing new dataframe to table.

query = "(delete from xx_files_tbl)"
spark.write.format("jdbc")
.option("url", "jdbc:sqlserver://"+server+":1433;databaseName="+db_name)
.option("driver", driver_name)
.option("dbtable", query)
.option("user", user)
.option("password", password)
.option("truncate", "true")
.save()

谢谢。

您可以直接使用.mode("overwrite"(和.option("truncate",true(写入数据帧,而不是在写入数据帧之前删除sql server表中的数据。

https://learn.microsoft.com/en-us/sql/big-data-cluster/spark-mssql-connector?view=sql-服务器-ver15

Spark文档中说dbtable用于传递应该读取或写入的表。FROM子句只能在使用JDBC连接器读取数据时使用。(资源:https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html)

我的建议是要么使用overwrite写入模式,要么打开一个单独的连接进行数据删除。删除数据和连接MySQL服务器不需要Spark。使用Python MySQL连接器或打开一个单独的jdbc连接就足够了。

这始终是使用pyspark执行DML操作的限制。但我在SQL server中创建了一个简单的存储过程,以接受任何DML操作作为参数。我从pyspark调用该过程以在SQL server中运行dml操作。到目前为止,它对我来说一直很好。

创建PROCEDURE DBO.dml_operations(@query varchar(2500((作为开始设置NOCOUNT;

-- print(@query) if you want to see how this is being passed on to procedure.
exec(@query)
select 0

完转到

声明@query varchar(2500(set@query='update<gt;设置<lt;我的领域>gt;=4.33,其中<lt;char字段>gt;=">

exec DBO.dml_operations@查询

我知道我们使用不同类型的函数来运行pyspark中的存储过程。

如果你想知道如何从pyspark运行存储的proc,请告诉我。

您不能删除数据,因为数据帧是不可变的。您可以进行过滤操作,创建新的数据帧并写入您的位置。我想这样的事情会对你有所帮助。

newdf=spark.sql("从xx_files_tbl WHERE值中选择*"<=1"(

最新更新