如何从Databricks Delta表中删除列?

时间:2019-01-31 09:15:52

标签: sql apache-spark apache-spark-sql databricks delta-lake

我最近开始发现Databricks,并遇到需要删除增量表中某一列的情况。当我使用PostgreSQL时,就像

一样容易
ALTER TABLE main.metrics_table 
DROP COLUMN metric_1;

我正在浏览DELETE上的Databricks documentation,但仅涵盖DELETE the rows that match a predicate

我还找到了关于DROP数据库,DROP函数和DROP表的文档,但是关于如何从增量表中删除列的内容却一无所获。我在这里想念什么?有没有一种从增量表中删除列的标准方法?

3 个答案:

答案 0 :(得分:3)

Databricks表上没有下拉列选项:https://docs.databricks.com/spark/latest/spark-sql/language-manual/alter-table-or-view.html#delta-schema-constructs

请记住,与关系数据库不同的是,您的存储中有物理实木复合地板文件,您的“表”只是已应用于它们的架构。

在关系世界中,您可以更新表元数据以轻松删除列,而在大数据环境中,您必须重新编写基础文件。

从技术上讲,实木复合地板可以处理架构演变(请参见Schema evolution in parquet format)。但是Delta的Databricks实现却没有。它可能太复杂了,不值得。

因此,在这种情况下,解决方案是创建一个新表并插入要保留在旧表中的列。

答案 1 :(得分:3)

我想完成该工作的一种方法是先删除表,然后使用overwriteSchema选项将其从数据框中重新创建为true。您还需要使用mode = overwrite选项,以便它使用数据框包含的新架构重新创建物理文件。

分解步骤:

  1. 读取数据框中的表格。
  2. 在最终表中删除不需要的列
  3. 删除从中读取数据的实际表。
  4. 在将列删除为相同的表名之后,现在保存新创建的数据框。
  5. 但是请确保在将数据框另存为表时使用两个选项。( .mode(“ overwrite”)。option(“ overwriteSchema”,“ true”)

以上步骤将帮助您在删除多余的列的情况下重新创建同一表。 希望它能帮助面临类似问题的人。

答案 2 :(得分:0)

使用以下代码:

df = spark.sql("Select * from <DB Name>.<Table Name>")

df1 = df.drop("<Column Name>")

spark.sql("DROP TABLE if exists <DB Name>.<TableName>_OLD")

spark.sql("ALTER TABLE <DB Name>.<TableName> RENAME TO <DB Name>.<Table Name>_OLD ")

df1.write.format("delta").mode("OVERWRITE").option("overwriteSchema", "true").saveAsTable("<DB Name>.<Table Name>")