在写入dataframe之前从表中删除记录 - pyspark

3

我想在从数据帧写入数据表之前删除其中的记录,但这个方法对我不起作用……我做错了什么?

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()

感谢您的选择。
谢谢。

有人能帮忙吗?我已经卡在这个问题上好几个小时了。 - AJR
4个回答

1

0

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

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


嗨,Alex - 感谢您的反馈。由于这是一个粘合作业,它对使用Python库非常挑剔。既然我正在使用MS SQL Server,有没有办法做到这一点...您有没有关于如何为SQL Server打开单独的JDBC连接的示例? - AJR

0

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

CREATE PROCEDURE DBO.dml_operations (@query varchar(2500)) AS BEGIN SET NOCOUNT ON;

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

END GO

声明 @query varchar(2500) set @query = 'update <> set << my field >> = 4.33 where << char field >> = ''Something'''

exec DBO.dml_operations @query

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

如果您想知道如何从 pyspark 运行存储过程,请告诉我。


-2

你无法删除数据,因为数据帧是不可变的。你可以进行筛选操作并创建新的数据帧,然后将其写入到指定位置。我认为类似这样的方法会对你有所帮助。

newdf = spark.sql("select * from xx_files_tbl WHERE value <= 1")


2
他想要从目标表中删除数据,而不是从一个数据框中删除。 - Aleksejs R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接