列名含特殊字符,如何通过Scala API设置Delta表TBLProperties?
解决Delta表特殊列名写入的TBLProperties设置问题
可以通过Scala API设置目标TBLProperties,但你当前的写法有误,普通.option()无法直接设置表级属性,以下是两种有效方案:
方案一:通过带前缀的Option设置表属性
使用delta.tblproperties.作为前缀,将属性传递为表级TBLProperties:
myDf.write .mode("Overwrite") .format("delta") .option("delta.tblproperties.delta.minReaderVersion", "2") .option("delta.tblproperties.delta.minWriterVersion", "5") .option("delta.tblproperties.delta.columnMapping.mode", "name") .saveAsTable("testDB.employees")
方案二:先通过DDL创建带属性的表,再写入数据
先执行Spark SQL创建包含目标属性的表(需替换为你的实际表结构),再写入数据:
// 创建表 spark.sql(""" CREATE TABLE IF NOT EXISTS testDB.employees ( `col-with-special-chars` STRING, id INT, name STRING ) USING delta TBLPROPERTIES ( 'delta.minReaderVersion' = '2', 'delta.minWriterVersion' = '5', 'delta.columnMapping.mode' = 'name' ) """) // 写入数据 myDf.write.mode("Overwrite").format("delta").saveAsTable("testDB.employees")
原代码不生效的原因
你之前使用的.option("delta.minReaderVersion", "2")属于Delta Lake的单次写入配置参数,并非表级的TBLProperties。这些参数仅作用于当前写入操作,不会被持久化为表的固定属性,因此无法解决特殊列名的映射问题。只有将这些属性设置为表的TBLProperties,才能让Delta Lake在后续所有读写操作中应用列映射规则。
内容的提问来源于stack exchange,提问作者ConfusedDeveloper
相关产品推荐
相关产品推荐

