Блоки данных - Как изменить раздел существующей таблицы Delta?
У меня есть таблица в дельте Databricks, которая разделена на transaction_date
, Я хочу изменить столбец раздела на view_date
, Я попытался удалить таблицу, а затем создать ее с новым столбцом раздела, используя PARTITIONED BY (view_date)
,
Однако моя попытка не удалась, поскольку фактические файлы находятся в S3, и даже если я удаляю таблицу кустов, разделы остаются прежними. Есть ли способ изменить раздел существующей таблицы Delta? Или единственное решение - сбросить фактические данные и загрузить их вновь указанным столбцом раздела?
3 ответа
Там на самом деле нет необходимости удалять таблицы или удалять файлы. Все, что вам нужно сделать, это прочитать текущую таблицу, перезаписать содержимое и схему и изменить столбец раздела:
val input = spark.read.table("mytable")
input.write.format("delta")
.mode("overwrite")
.option("overwriteSchema", "true")
.partitionBy("colB") // different column
.saveAsTable("mytable")
Просто предупреждение о том, что в настоящее время это не поддерживает перемещение во времени, если вы хотите прочитать предыдущие версии таблицы с другим разделением.
Как заметил Сильвио, нет необходимости бросать стол. На самом деле настоятельно рекомендуемый подход Databricks заключается в замене таблицы.
в искровом SQL это можно легко сделать с помощью
REPLACE TABLE <tablename>
USING DELTA
PARTITIONED BY (view_date)
AS
SELECT * FROM <tablename>
Модифицированный пример из:
https://docs.databricks.com/delta/best-practices.html#replace-the-content-or-schema-of-a-table
Решение для Python :
Если вам нужно более одного столбца в разделе
partitionBy(столбец, столбец_2, ...)
def change_partition_of(table_name, column):
df = spark.read.table(tn)
df.write.format("delta").mode("overwrite").option("overwriteSchema", "true").partitionBy(column).saveAsTable(table_name)
change_partition_of("i.love_python", "column_a")