如何从 Databricks Delta 表中删除列?

新手上路,请多包涵

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

ALTER TABLE main.metrics_table
DROP COLUMN metric_1;

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

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

原文由 samba 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

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

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

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

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

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

原文由 simon_dmorias 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 Delta Lake 1.2 开始,您可以删除列,请参阅最新的 ALTER TABLE 文档

如果您对可以在本地运行的代码段感兴趣,这是一个完整的示例:

 # create a Delta Lake
columns = ["language","speakers"]
data = [("English", "1.5"), ("Mandarin", "1.1"), ("Hindi", "0.6")]
rdd = spark.sparkContext.parallelize(data)
df = rdd.toDF(columns)

df.write.format("delta").saveAsTable("default.my_cool_table")

spark.sql("select * from `my_cool_table`").show()

 +--------+--------+
|language|speakers|
+--------+--------+
|Mandarin|     1.1|
| English|     1.5|
|   Hindi|     0.6|
+--------+--------+

以下是删除 language 列的方法:

 spark.sql("""ALTER TABLE `my_cool_table` SET TBLPROPERTIES (
   'delta.columnMapping.mode' = 'name',
   'delta.minReaderVersion' = '2',
   'delta.minWriterVersion' = '5')""")

spark.sql("alter table `my_cool_table` drop column language")

验证 language 列不再包含在表中:

 spark.sql("select * from `my_cool_table`").show()

+--------+
|speakers|
+--------+
|     1.1|
|     1.5|
|     0.6|
+--------+

原文由 Powers 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏