Databricks SQL向按天分区表增量插入数据的最佳实践咨询
解决方案
你遇到的问题是默认的INSERT OVERWRITE为静态分区覆盖模式,会清空全表后插入新数据,而INSERT INTO仅做追加,无法覆盖已有分区数据,以下是两种可直接落地的实现方式:
方式1:动态分区覆盖(性能最优,适合整分区替换场景)
该方式仅覆盖增量表中存在的对应分区,完全不改动历史分区数据,适合你的增量数据是整分区完整数据的场景:
- 先开启当前会话的动态分区覆盖参数:
SET spark.sql.sources.partitionOverwriteMode = DYNAMIC;
- 执行覆盖插入操作,注意分区列
day要放在SELECT字段的最后一位:
INSERT OVERWRITE tbl1 PARTITION (day) SELECT sales, day FROM tbl2;
方式2:MERGE INTO 语法(更灵活,支持部分行更新场景)
如果后续有单分区内部分数据更新的需求,可使用MERGE语法,不需要额外调整参数:
MERGE INTO tbl1 AS target USING tbl2 AS source -- 按分区键匹配,可命中分区裁剪,性能不受影响 ON target.day = source.day -- 匹配到的分区数据全量更新 WHEN MATCHED THEN UPDATE SET * -- 未匹配到的新分区数据直接插入 WHEN NOT MATCHED THEN INSERT *
效果验证
两种方式执行后,tbl1的2021-01-04分区会被替换为tbl2中的25,2021-01-05分区新增,其余历史分区数据保持不变,完全符合你预期的输出结果。
内容的提问来源于stack exchange,提问作者Larry
相关产品推荐
相关产品推荐

