#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, а из целевой таблицы.