如何删除ADLS中Parquet格式Delta Table的指定列?
解决路径式Delta表删除列的问题
前提:升级Delta表版本并开启列映射
你遇到的错误说明当前Delta表不支持列删除,必须先升级表版本并开启name列映射模式,以下是针对路径式Delta表(未注册到元数据的ADLS路径存储)的操作方法:
方法1:使用Scala API设置属性
import io.delta.tables.DeltaTable val deltaTable = DeltaTable.forPath("abfss://CONTAINER@STORAGEACCOUNT.dfs.core.windows.net/path/to/data/folder/") // 设置所需表属性 deltaTable.alter(_.setTableProperties( Map( "delta.columnMapping.mode" -> "name", "delta.minReaderVersion" -> "2", "delta.minWriterVersion" -> "5" ) ))
方法2:使用Spark SQL设置属性
直接用路径代替表名,在SQL中操作:
ALTER TABLE delta.`abfss://CONTAINER@STORAGEACCOUNT.dfs.core.windows.net/path/to/data/folder/` SET TBLPROPERTIES ( 'delta.columnMapping.mode' = 'name', 'delta.minReaderVersion' = '2', 'delta.minWriterVersion' = '5' )
删除指定列
完成属性设置后,即可删除目标列:
方法1:Scala API删除列
// 复用之前定义的deltaTable实例 deltaTable.alter(_.dropColumns("ABC"))
方法2:Spark SQL删除列
ALTER TABLE delta.`abfss://CONTAINER@STORAGEACCOUNT.dfs.core.windows.net/path/to/data/folder/` DROP COLUMN ABC
验证操作结果
执行以下代码确认列已删除:
deltaTable.toDF.printSchema() // 或用SQL查看表结构 DESCRIBE TABLE delta.`abfss://CONTAINER@STORAGEACCOUNT.dfs.core.windows.net/path/to/data/folder/`
说明:路径式Delta表无需注册到元数据,直接通过delta.路径``的格式即可在SQL中引用,操作会直接作用于ADLS路径下的Delta表数据,无需额外写回步骤(Delta的操作是事务性的,自动同步到路径)。
内容的提问来源于stack exchange,提问作者ROODAY
相关产品推荐
相关产品推荐

