咨询Snowpipe COPY INTO命令中正确的文件匹配规则设置方法
你的问题核心在于原正则表达式.*tags.csv.*过于宽泛——它会匹配任何包含tags.csv子串的文件名,自然也会命中changes_tags.csv.12345这类包含该子串的文件。要实现仅加载以tags.csv.开头的目标文件,我们需要调整正则规则,精准锁定文件名的起始特征。
正确的PATTERN匹配规则
根据你的文件路径结构(文件存储在files/目录下,格式为tags.csv.xxx),提供两种匹配方案:
方案1:通用型匹配(适配任意子目录)
这个规则会匹配阶段路径下所有子目录中,文件名以tags.csv.开头的文件:
PATTERN='.*/tags\\.csv\\..*'
- 规则拆解:
.*/:匹配任意层级的目录路径(比如你的files/目录)tags\\.csv\\.:精准匹配tags.csv.(注意正则中.是通配符,必须用\\转义才能匹配真实的点号).*:匹配后续任意字符(比如你文件后缀的数字串)
方案2:严格型匹配(指定目录+纯数字后缀)
如果确定文件都在files/目录下,且后缀是纯数字,可以用更严格的规则避免意外匹配:
PATTERN='^files/tags\\.csv\\.[0-9]+$'
- 规则拆解:
^files/:强制匹配以files/开头的路径tags\\.csv\\.:精准匹配tags.csv.[0-9]+$:强制匹配结尾的1个或多个数字,确保后缀是纯数字格式
修改后的Snowpipe创建语句
以通用型方案为例,调整后的完整命令如下:
create or replace pipe TAGS auto_ingest=true as COPY INTO CHANGE_TAGS(tag_id, tag_name, tag_value, filename, file_rownum ) FROM (select $1,$2,$3,METADATA$FILENAME,METADATA$FILE_ROW_NUMBER from @s3_stage) PATTERN='.*/tags\\.csv\\..*' ON_ERROR = 'CONTINUE' FILE_FORMAT = (TYPE = 'CSV',FIELD_DELIMITER = ',',SKIP_BLANK_LINES = TRUE,FIELD_OPTIONALLY_ENCLOSED_BY = '"');
提前验证规则
在更新Snowpipe前,你可以用以下命令测试正则是否正确匹配目标文件:
LIST @s3_stage PATTERN='.*/tags\\.csv\\..*';
执行后只会列出tags.csv.67587、tags.csv.9987这类目标文件,确认无误后再部署Snowpipe即可。
内容的提问来源于stack exchange,提问作者phenix
相关产品推荐
相关产品推荐

