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)
我想出的一种方法是首先删除表,然后使用overwriteSchema选项从数据框中重新创建表true. 您还需要使用 选项,mode = overwrite以便它使用数据帧包含的新模式重新创建物理文件。
分解步骤:
上述步骤将帮助您重新创建删除额外列的同一个表。希望它可以帮助面临类似问题的人。
| 归档时间: |
|
| 查看次数: |
13688 次 |
| 最近记录: |