14

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

ALTER TABLE main.metrics_table 
DROP COLUMN metric_1;

我正在查看有关 DELETE 的 Databricks文档,但它仅涵盖DELETE the rows that match a predicate.

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

4

3 回答 3

12

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

请记住,与关系数据库不同,您的存储中有物理 parquet 文件,您的“表”只是已应用于它们的模式。

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

从技术上讲,parquet 可以处理模式演变(请参阅parquet 格式的模式演变)。但是 Delta 的 Databricks 实现没有。它可能太复杂了,不值得。

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

于 2019-01-31T10:07:56.103 回答
6

我想出的一种方法是首先删除表,然后使用overwriteSchema选项从数据框中重新创建表 to true。您还需要使用选项,mode = overwrite以便它使用数据框包含的新模式重新创建物理文件。

分解步骤:

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

上述步骤将帮助您重新创建同一个表,并删除额外的列。希望它可以帮助面临类似问题的人。

于 2020-09-30T15:03:57.830 回答
6

使用下面的代码:

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>")
于 2020-11-10T20:11:39.280 回答