在写入数据框之前从表中删除记录-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://docs.microsoft.com/en-us/sql/big-data-cluster/spark-mssql-connector?view=sql-server-ver15

,

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

newdf = spark.sql(“从xx_files_tbl的WHERE值

,

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

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