启用Liquid Clustering的Delta表如何增删列?PySpark操作异常处理
解决启用Liquid Clustering的Delta表修改列后聚类配置丢失问题
问题原因
使用write.mode("overwrite").option("overwriteSchema", "true")全量覆盖表时,Spark会重建表结构,原表的Liquid Clustering配置不会被继承,导致clusteringColumns变为空数组。
方法1:ALTER TABLE修改Schema(推荐)
直接修改表结构,不影响原有聚类配置,是最高效的方式。
SQL实现:
ALTER TABLE SAMPLE ADD COLUMN NEW_COL STRING;
PySpark DeltaTable API实现:
from delta.tables import DeltaTable delta_table = DeltaTable.forName(spark, "SAMPLE") delta_table.alter( delta_table.addColumn("NEW_COL", dataType="STRING") )
方法2:Merge操作更新数据与Schema
通过Merge将含新增列的数据写回原表,保留表的元数据(包括聚类配置):
from delta.tables import DeltaTable from pyspark.sql.functions import lit delta_table = DeltaTable.forName(spark, "SAMPLE") source_df = spark.table("SAMPLE").withColumn("NEW_COL", lit("new metric")) delta_table.alias("target") \ .merge( source_df.alias("source"), "target.NAME = source.NAME AND target.TIMESTAMP = source.TIMESTAMP AND target.ZONE_ID = source.ZONE_ID" ) \ .whenMatchedUpdateAll() \ .whenNotMatchedInsertAll() \ .execute()
方法3:全量覆盖时显式指定聚类配置
若必须使用overwrite模式,需在写入时重新指定clusterBy参数,恢复聚类配置:
spark.table("default.SAMPLE") \ .withColumn("NEW_COL", lit('new metric')) \ .write \ .format("delta") \ .mode("overwrite") \ .option("overwriteSchema", "true") \ .clusterBy("TIMESTAMP") \ .saveAsTable("SAMPLE")
内容的提问来源于stack exchange,提问作者Ryan Byoun
相关产品推荐
相关产品推荐

