databricks перезаписывает всю таблицу вместо добавления нового раздела

#apache-spark #databricks #delta

#apache-spark #databricks #дельта

Вопрос:

У меня есть эта таблица

 CREATE TABLE `db`.`customer_history` (
  `name` STRING,
  `addrress` STRING, 
  `filename` STRING,
  `dt` DATE)
USING delta
PARTITIONED BY (dt)
 

Когда я использую это для загрузки данных раздела в таблицу

       df
    .write
    .partitionBy("dt")
    .mode("overwrite")
    .format("delta")
    .saveAsTable("db.customer_history")
 

По какой-то причине он перезаписывает всю таблицу. Я думал, что режим перезаписи перезаписывает только данные раздела (если они существуют). Правильно ли я понимаю?

Ответ №1:

Delta упрощает обновление определенных разделов диска с помощью этой replaceWhere опции. Вы можете выборочно перезаписывать только те данные, которые соответствуют предикатам, по столбцам разделов следующим образом ,

 dataset.write.repartition(1)
       .format("delta")
       .mode("overwrite")
       .partitionBy('Year','Week')
       .option("replaceWhere", "Year == '2019' AND Week >='01' AND Week <='02'") #to avoid overwriting Week3
       .save("curataeddataset")
 

Примечание: replaceWhere особенно полезен, когда вам нужно запустить дорогостоящий алгоритм, но только для определенных разделов ‘

Вы можете ссылаться: ссылка

Ответ №2:

Чтобы перезаписать один раздел, используйте:

 df
  .write 
  .format("delta") 
  .mode("overwrite") 
  .option("replaceWhere", "dt >= '2021-01-01'") 
  .save("data_path")