В моей работе последний шаг - сохранить выполненные данные в таблице Hive с разделением на столбце «дата». Иногда из-за сбоя задания мне нужно заново запускать задание только для определенного раздела. Как уже отмечалось, когда я использую приведенный ниже код, spark переопределяет все разделы при использовании режима перезаписи.
ds.write.partitionBy("date").mode("overwrite").saveAsTable("test.someTable")
Пройдя через несколько блогов и стекопоток, я выполнил следующие шаги, чтобы перезаписать только определенные разделы.
Step 1: Enbable dynamic partition for overwrite mode
spark.conf.set("spark.sql.sources.partitionOverWriteMode", "dynamic")
Step 2: write dataframe to hive table using saveToTable
Seq(("Company1", "A"),
("Company2","B"))
.toDF("company", "id")
.write
.mode(SaveMode.Overwrite)
.partitionBy("id")
.saveAsTable(targetTable)
spark.sql(s"SELECT * FROM ${targetTable}").show(false)
spark.sql(s"show partitions ${targetTable}").show(false)
Seq(("CompanyA3", "A"))
.toDF("company", "id")
.write
.mode(SaveMode.Overwrite)
.insertInto(targetTable)
spark.sql(s"SELECT * FROM ${targetTable}").show(false)
spark.sql(s"show partitions ${targetTable}").show(false)
Тем не менее он перезаписывает все разделы.
Согласно этому блогу, https://www.waitingforcode.com/apache-spark-sql/apache-spark-sql-hive-insertinto-command/read , "insertinto" должен перезаписывать только определенные разделы
Если я сначала создаю таблицу, а затем использую метод "insertinto", она работает нормально
Установите требуемую конфигурацию, Шаг 1: Создать таблицу
Шаг 2: Добавить данные, используя метод insertinto
Шаг 3: Перезаписать разделение
Я хотел бы знать, в чем разница между созданием таблицы кустов с помощью SaveToTable и созданием таблицы вручную? Почему это не работает в первом сценарии? Может ли кто-нибудь помочь мне в этом?