我最近开始发现Databricks,并遇到需要删除增量表中某一列的情况。当我使用PostgreSQL时,就像
一样容易ALTER TABLE main.metrics_table
DROP COLUMN metric_1;
我正在浏览DELETE上的Databricks documentation,但仅涵盖DELETE the rows that match a predicate
。
我还找到了关于DROP数据库,DROP函数和DROP表的文档,但是关于如何从增量表中删除列的内容却一无所获。我在这里想念什么?有没有一种从增量表中删除列的标准方法?
答案 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选项,以便它使用数据框包含的新架构重新创建物理文件。
分解步骤:
以上步骤将帮助您在删除多余的列的情况下重新创建同一表。 希望它能帮助面临类似问题的人。
答案 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>")