【问题标题】:How to drop a column from a Databricks Delta table?如何从 Databricks Delta 表中删除列?
【发布时间】:2019-06-24 16:57:35
【问题描述】:

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

一样简单
ALTER TABLE main.metrics_table 
DROP COLUMN metric_1;

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 是的,当您尝试添加与已删除列同名的新列时,这很复杂。
    • 现在,从旧表创建新表仍然会将数据保留在数据文件中,对吗?
    【解决方案2】:

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

    分解步骤:

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

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

    【讨论】:

      【解决方案3】:

      使用下面的代码:

      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>")
      

      【讨论】:

      • 尚未删除该列.. 我想您需要物理删除文件/做真空
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 2022-11-05
      • 2021-09-29
      • 1970-01-01
      • 2022-10-05
      • 2019-05-14
      • 2021-12-15
      相关资源
      最近更新 更多