Snowflake中COPY INTO如何用正则过滤文件排除Snapshot子文件夹
问题根因
Snowflake的COPY INTO命令默认会递归遍历指定存储路径下的所有文件,包括全部子文件夹内的文件。当前加载路径指定为account目录时,Snapshot子文件夹里的快照文件会被一并扫描加载,最终导致数据重复。
解决方法
在COPY INTO语句中添加PATTERN参数,通过正则规则仅匹配account根目录下符合YYYY-MM.csv命名格式的文件,自动排除子文件夹内的文件,修改后的完整语句如下:
copy into BINGO_DWH_DEV.LANDING.CRM_ACCOUNT_TEMP from 'azure://abc.blob.core.windows.net/abc-abc/account' credentials=(azure_sas_token= 'abc') ON_ERROR='CONTINUE' FILE_FORMAT=(type=csv field_delimiter=',' FIELD_OPTIONALLY_ENCLOSED_BY='"') PATTERN = '^[0-9]{4}-[0-9]{2}\.csv$';
规则说明
PATTERN参数会对指定account路径下所有文件的相对路径做正则匹配,只有完全匹配规则的文件才会被加载- 所用正则的匹配逻辑:
^标记匹配从相对路径的起始位置开始[0-9]{4}-[0-9]{2}匹配4位年份数字+横杠+2位月份数字的文件名前缀\.csv$标记匹配.csv后缀到相对路径的结束位置
- 过滤效果:
- Snapshot子文件夹下的文件相对路径以
Snapshot/开头,不符合路径起始为4位数字的规则,且文件名带_时间戳后缀,也不满足以.csv直接结尾的要求,会被全部过滤 - 后续account目录下新增其他子文件夹时,该规则也会自动排除所有子目录内的文件,无需额外调整
- Snapshot子文件夹下的文件相对路径以
注意:Snowflake的PATTERN参数使用RE2正则语法,不要使用PCRE特性的正则语法避免匹配失效
内容的提问来源于stack exchange,提问作者Madhu Pasham
相关产品推荐
相关产品推荐

