如何在数仓入库脚本中并行加载多表且避免重复,无需使用overwrite
多表并行无重复插入实现方案
可以使用INSERT ALL实现你需要的同查询并行加载多张表、无重复数据、无需overwrite的需求,你之前写法的问题在于多表插入时不需要给每个INTO单独加SELECT子句,同时可以通过CTE提前计算所有表的主键存在性,避开WHEN子句不能使用子查询的限制。
核心实现逻辑
- 用CTE仅扫描一次源文件,提前计算所有待插入表的主键是否已存在的标志位,所有去重逻辑在这一步批量完成
- 在INSERT ALL后依次声明每个表的插入规则,用提前计算好的标志位做插入判断,无需在WHEN中写子查询
- 所有表的插入操作在同一个查询任务中并行执行,源文件仅加载一次,性能优于单表分次插入
示例代码
假设你需要插入TEMP、TABLE2、TABLE3、TABLE4四张表,参考写法如下:
WITH stg_data AS ( SELECT -- 提取源文件字段 $1 AS id, $2 AS title_name, $3 AS table2_col, $4 AS table3_col, -- 提前计算各表主键是否不存在(返回布尔值用于后续插入判断) NOT EXISTS(SELECT 1 FROM TEMP WHERE PKEY = $1) AS temp_pkey_not_exists, NOT EXISTS(SELECT 1 FROM TABLE2 WHERE T2_PKEY = $1) AS t2_pkey_not_exists, NOT EXISTS(SELECT 1 FROM TABLE3 WHERE T3_PKEY = $1) AS t3_pkey_not_exists, NOT EXISTS(SELECT 1 FROM TABLE4 WHERE T4_PKEY = $1) AS t4_pkey_not_exists FROM @azure_stg/mti_test.csv (FILE_FORMAT=>'CSV') ) INSERT ALL -- 每张表的插入规则,用提前算好的标志位判断是否插入 WHEN temp_pkey_not_exists THEN INTO TEMP (PKEY, TITLE) VALUES (id, title_name) WHEN t2_pkey_not_exists THEN INTO TABLE2 (T2_PKEY, COLUMN2) VALUES (id, table2_col) WHEN t3_pkey_not_exists THEN INTO TABLE3 (T3_PKEY, COLUMN3) VALUES (id, table3_col) WHEN t4_pkey_not_exists THEN INTO TABLE4 (T4_PKEY, COLUMN4) VALUES (id, title_name) SELECT * FROM stg_data;
注意事项
- 如果同一条源数据需要插入所有符合条件的表,使用
INSERT ALL即可;如果要求每条源数据仅匹配第一个符合的WHEN条件插入对应表,将开头的INSERT ALL替换为INSERT FIRST - 如果不同表的主键字段不是同一个,仅需调整CTE中
NOT EXISTS的关联条件即可 - 该方案全程是追加写入逻辑,不需要使用overwrite,也不会产生重复数据
内容的提问来源于stack exchange,提问作者alim1990
相关产品推荐
相关产品推荐

