Databricks - 如何更改现有 Delta 表的分区?

sam*_*mba 9 databricks delta-lake

我在 Databricks delta 中有一个表,它由transaction_date. 我想将分区列更改为view_date. 我尝试删除该表,然后使用PARTITIONED BY (view_date).

然而,我的尝试失败了,因为实际文件驻留在 S3 中,即使我删除了一个 hive 表,分区也保持不变。有没有办法更改现有 Delta 表的分区?或者唯一的解决方案是删除实际数据并使用新指示的分区列重新加载它?

Sil*_*vio 16

实际上没有必要删除表或删除文件。您需要做的就是读取当前表,覆盖内容和架构,并更改分区列:

val input = spark.read.table("mytable")

input.write.format("delta")
  .mode("overwrite")
  .option("overwriteSchema", "true")
  .partitionBy("colB") // different column
  .saveAsTable("mytable")
Run Code Online (Sandbox Code Playgroud)

更新:以前存在时间旅行和分区更改的错误,现在已修复。


小智 11

正如西尔维奥指出的那样,没有必要放弃桌子。事实上, databricks强烈推荐的方法是替换表。

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

在 Spark SQL 中,这可以通过以下方式轻松完成

REPLACE TABLE <tablename>
  USING DELTA
  PARTITIONED BY (view_date)
AS
 SELECT * FROM <tablename>
Run Code Online (Sandbox Code Playgroud)

修改示例来自:
https://docs.databricks.com/delta/best-practices.html#replace-the-content-or-schema-of-a-table