如何修改Snowflake MERGE脚本以从S3 Parquet文件执行Upsert
Parquet文件MERGE插入Null问题的修复方案
你的Parquet脚本出现全Null插入的核心原因是字段引用方式错误:子查询中未为解析的Parquet字段定义别名,后续在关联、更新、插入操作中仍直接使用$1:字段名的写法,导致Snowflake无法正确映射字段值。
具体修改步骤
- 为子查询字段添加别名:在SELECT语句中给每个
$1:xxx字段指定明确别名,建议和目标表字段名保持一致。 - 统一引用别名:在MERGE的ON条件、UPDATE和INSERT语句中,全部使用子查询定义的别名,不再使用
$1:字段名。
修改后的完整脚本
MERGE INTO data_architecture_stage.test ex USING ( SELECT $1:device_attr_hk AS device_attr_hk, $1:applicationruntime_raw AS applicationruntime_raw FROM @dss_prod.test.subscriber_data_solutions/rollup_parquet_expor2t/ (file_format => 'my_parquet_format', PATTERN => '.*\\.parquet') ) ne ON ex.device_attr_hk = ne.device_attr_hk WHEN MATCHED THEN UPDATE SET device_attr_hk = ne.device_attr_hk, applicationruntime_raw = ne.applicationruntime_raw WHEN NOT MATCHED THEN INSERT (device_attr_hk, applicationruntime_raw) VALUES (ne.device_attr_hk, ne.applicationruntime_raw);
额外验证建议
先单独执行子查询部分,确认能读取到非Null的有效数据:
SELECT $1:device_attr_hk AS device_attr_hk, $1:applicationruntime_raw AS applicationruntime_raw FROM @dss_prod.test.subscriber_data_solutions/rollup_parquet_expor2t/ (file_format => 'my_parquet_format', PATTERN => '.*\\.parquet');
如果这一步返回Null,需要检查Parquet文件格式my_parquet_format的配置是否匹配文件实际结构(比如压缩方式、字段大小写匹配等)。
内容的提问来源于stack exchange,提问作者NEERAJ GUPTA
相关产品推荐
相关产品推荐

