Блоки данных - Как изменить раздел существующей таблицы 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 заключается в замене таблицы.

https://docs.databricks.com/sql/language-manual/sql-ref-syntax-ddl-create-table-using.html#parameters

в искровом 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")
Другие вопросы по тегам