Snowflake COPY命令指定精确文件名PATTERN无法匹配文件求助
解决方案
核心原因
Snowflake COPY命令的PATTERN参数基于完整正则表达式匹配,默认匹配的是相对于指定阶段(或子目录)的文件路径:
- 正则中的
.是通配任意字符,必须转义为\\.才能匹配文件名里的实际点号; - 若未用
^(锚定开头)和$(锚定结尾)限制,会导致匹配范围过宽或因路径结构匹配失败。
可行的匹配模式
根据你的精确匹配需求,推荐以下几种正则写法:
1. 精确匹配子目录下的目标文件
如果文件直接存放在@EXTERNAL_STAGE/LANDING目录下,用锚定首尾的正则确保只匹配该文件名:
COPY INTO DATABASE.SCHEMA.LOAD_TABLE (ID, NAME) FROM ( SELECT SRC.$1, SRC.$2 FROM @EXTERNAL_STAGE/LANDING AS SRC ) FILE_FORMAT = 'CSV' PATTERN = '^DS_STORAGE_2024\\.csv$'
^:匹配子目录下文件名的起始位置\\.:转义点号,避免被当作通配符$:匹配文件名的结束位置,防止匹配到DS_STORAGE_2024.csv.tmp这类带额外后缀的文件
2. 匹配任意子目录下的目标文件
如果文件可能在LANDING的子层级目录中,用以下正则匹配所有同名文件:
PATTERN = '.*/DS_STORAGE_2024\\.csv$'
.*/:匹配任意层级的目录路径
3. 不区分大小写的匹配
若存在文件名大小写不一致的情况,添加(?i)开启不区分大小写模式:
PATTERN = '(?i)^DS_STORAGE_2024\\.csv$'
验证技巧
先通过LIST命令测试正则是否能匹配到目标文件,避免反复执行COPY:
LIST @EXTERNAL_STAGE/LANDING PATTERN = '^DS_STORAGE_2024\\.csv$';
如果LIST命令返回目标文件,说明正则有效,再执行COPY即可。
内容的提问来源于stack exchange,提问作者Deepen Gajjar
相关产品推荐
相关产品推荐

