#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")