如何从 Databricks Delta 表中删除一列?

sam*_*mba 10 sql apache-spark apache-spark-sql databricks delta-lake

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

ALTER TABLE main.metrics_table 
DROP COLUMN metric_1;
Run Code Online (Sandbox Code Playgroud)

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

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

Ard*_*oli 14

使用下面的代码:

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>")
Run Code Online (Sandbox Code Playgroud)


sim*_*ias 10

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

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

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

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

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


Tag*_*gar 10

如果启用列映射模式,Databricks Runtime 10.2+ 支持删除列

ALTER TABLE <table_name> SET TBLPROPERTIES (
  'delta.minReaderVersion' = '2',
  'delta.minWriterVersion' = '5',
  'delta.columnMapping.mode' = 'name'
)
Run Code Online (Sandbox Code Playgroud)

然后滴水就会起作用——

ALTER TABLE table_name DROP COLUMN col_name
ALTER TABLE table_name DROP COLUMNS (col_name_1, col_name_2, ...)

Run Code Online (Sandbox Code Playgroud)


Nik*_*iya 5

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

分解步骤:

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

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