Snowflake Stage中COPY INTO语句的PATTERN匹配异常问题
问题根源与解决方案
问题原因
Snowflake的PATTERN参数匹配的是文件的完整相对路径(相对于Stage根目录),而非仅文件名。如果你的用户私有Stage(@~)的路径中包含user字符串(例如用户名是xxx_user,Stage完整路径会包含该用户名),那么.*user.*这种宽泛的正则会匹配到路径中的user,导致该路径下所有文件(包括manager文件)都被选中。而.*manager.*仅能匹配文件名中的manager,因此只会选中目标文件,不会出现误匹配。
修正后的查询语句
要避免误匹配,需要让正则仅针对文件名部分进行匹配,以下两种方案都可行:
方案1:精确匹配文件名前缀与后缀
COPY INTO sch_stg_support.test_user FROM ( SELECT METADATA$FILENAME, METADATA$FILE_ROW_NUMBER, METADATA$FILE_LAST_MODIFIED::TIMESTAMP_LTZ, $1 FROM '@~/SCH_DTM_TEST/TEST/' ) PATTERN => '.*\/microsoft_graph_api_user.*\.json.gz$' FILE_FORMAT = (TYPE=JSON STRIP_OUTER_ARRAY= TRUE);
.*\/:匹配路径中最后一个/之前的所有内容microsoft_graph_api_user.*:匹配文件名中包含目标前缀的部分\.json.gz$:匹配文件后缀,确保仅选中目标格式的文件
方案2:仅匹配文件名中的user
COPY INTO sch_stg_support.test_user FROM ( SELECT METADATA$FILENAME, METADATA$FILE_ROW_NUMBER, METADATA$FILE_LAST_MODIFIED::TIMESTAMP_LTZ, $1 FROM '@~/SCH_DTM_TEST/TEST/' (PATTERN => '[^\/]*user[^\/]*\.json.gz$') ) FILE_FORMAT = (TYPE=JSON STRIP_OUTER_ARRAY= TRUE);
[^\/]*:匹配任意不含/的字符(即仅针对文件名部分)user:精准匹配文件名中的目标字符串\.json.gz$:限定文件后缀
内容的提问来源于stack exchange,提问作者gauthier
相关产品推荐
相关产品推荐

