Databricks中使用ALTER TABLE为Array(Struct)列新增字段方案问询
嵌套在ArrayType中的StructType新增字段解决方案
适用Delta 2.0+ / Databricks Runtime 10.4 LTS及以上版本的方案
直接执行以下SQL即可,属于元数据级操作,无需修改现有数据,历史数据的新增字段默认返回null:
spark.sql(f"ALTER TABLE {db}.ads ADD COLUMNS (response.element.monkey boolean AFTER dq_conveyed)")
语法说明
- 对于嵌套在
ArrayType内的StructType,需要通过.element关键字定位数组内部的元素结构,你之前使用的response.monkey语法仅适用于顶层为StructType的列 - 新增字段的位置可以通过
AFTER关键字指定在原有dq_conveyed字段之后,和你预期的效果一致
低版本兼容方案
如果运行环境版本较低不支持上述ALTER语法,可以通过显式指定Schema覆写元数据的方式实现,同样不需要备份、重建表或迁移数据:
from pyspark.sql.functions import col # 读取原表 df = spark.table(f"{db}.ads") # 为response数组列的Struct新增monkey字段,保留所有原有字段 new_response_schema = "array<struct<encounter_uid:string,patient_uid:string,call_sign:string,time_resource_allocated:string,time_resource_arrived_at_receiving_location:string,time_of_patient_handover:string,time_clear:string,response_type:string,time_resource_mobilised:string,time_resource_arrived_on_scene:string,time_stood_down:string,time_resource_left_scene:string,highest_skill_level_on_vehicle:string,responding_organisation_type:string,dq_conveyed:boolean,monkey:boolean>>" df = df.withColumn("response", col("response").cast(new_response_schema)) # 仅覆写表Schema,不修改现有数据 df.write.format("delta").mode("overwrite").option("overwriteSchema", "true").saveAsTable(f"{db}.ads")
内容的提问来源于stack exchange,提问作者Lester Drake
相关产品推荐
相关产品推荐

