Удаление записей из таблицы перед записью фрейма данных — pyspark

#sql-server #pyspark #apache-spark-sql #pyspark-dataframes #aws-glue-spark

#sql-сервер #apache-spark-sql #pyspark #aws-glue-spark

Вопрос:

Я пытаюсь удалить записи из своей таблицы перед записью в нее данных из фрейма данных. У меня это не работает… Что я делаю не так?

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

Спасибо.

Комментарии:

1. может кто-нибудь, пожалуйста, помогите .. застрял на этом в течение нескольких часов.

Ответ №1:

Вместо удаления данных в таблице sql server перед записью фрейма данных вы можете напрямую записать свой фрейм данных с помощью .mode(«перезаписать») и .option(«усечь», true).

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

Ответ №2:

В документации Spark говорится, что dbtable это используется для передачи таблицы, которая должна быть прочитана или записана. FROM предложение можно использовать только при чтении данных с помощью JDBC connector. (ресурс: https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html )

Я бы предложил либо использовать overwrite режим записи, либо открыть отдельное соединение для удаления данных. Spark не требуется для удаления данных и подключения к серверу MySQL. Достаточно будет использовать Python MySQL connector или открыть отдельное соединение jdbc.

Комментарии:

1. Привет, Алекс — Спасибо за отзыв. Поскольку это работа с клеем, все придирчивы к работе с библиотеками python. есть ли способ сделать это, поскольку я использую MS SQL Server… есть ли у вас какие-либо примеры того, как открыть отдельное соединение jdbc для sql server

Ответ №3:

Вы не можете удалить данные, поскольку фреймы данных неизменяемы. Вы можете выполнить операцию фильтрации, создать новый фрейм данных и записать его в свое местоположение.Я думаю, вам поможет что-то подобное.

newdf=spark.sql(«выберите * из xx_files_tbl, ГДЕ значение <= 1»)

Комментарии:

1. Он хочет удалить данные не из df, а из целевой таблицы.