Snowflake中Copy Into/List的Pattern匹配行为不一致问题
Snowflake外部阶段Pattern匹配差异问题
定义的两个外部阶段
- Stage 1:
- 名称:
prefect.project_name.project_name - URL:
s3://mycompany-data-prod-secret-stuff/
- 名称:
- Stage 2:
- 名称:
prefect.prod_customername.prefect_flows_snowflake_load_customername - URL:
s3://mycompany-data-prod-prefect/flows/snowflake_load_customername/
- 名称:
测试情况(用list验证Pattern匹配,和copy into行为一致)
- 查询1(Stage1):
list @prefect.project_name.project_name/customername/20230915/cleaned/ pattern = 'TLA_Secret_List.*\.csv';→ 匹配正常,返回对象:s3://mycompany-data-prod-secret-stuff/customername/20230915/cleaned/TLA_Secret_List_-_12SEP2023.csv - 查询2(Stage2):
list @prefect.prod_customername.prefect_flows_snowflake_load_customername/output pattern = 'Mycompany.*\.csv';→ 无匹配结果 - 查询3(Stage2):
list @prefect.prod_customername.prefect_flows_snowflake_load_customername/ pattern = 'flows/snowflake_load_customername/output/Mycompany.*\.csv';→ 匹配正常,返回对象:s3://mycompany-data-prod-prefect/flows/snowflake_load_customername/output/Mycompany_SecretThing_202305.csv
疑问
Stage1只需要在Pattern里指定文件名就能匹配,但Stage2必须带上前缀路径才行。为什么查询1、3正常,查询2没结果?猜测是Stage2的URL包含子路径导致Pattern行为变化,但没找到相关文档说明。
原因解释
Snowflake外部阶段的Pattern匹配逻辑是对着对象在存储桶里的完整路径(从桶根到文件名的全路径)来匹配的,不是相对于阶段URL的相对路径:
- Stage1的URL是存储桶根目录,查询1里指定的
/customername/20230915/cleaned/是过滤前缀,目标对象的完整路径是customername/20230915/cleaned/TLA_Secret_List_-_12SEP2023.csv,PatternTLA_Secret_List.*\.csv刚好能匹配这个路径的末尾文件名部分,所以成功。 - Stage2的URL已经包含
/flows/snowflake_load_customername/,查询2里追加了/output,此时Snowflake会过滤出完整路径以flows/snowflake_load_customername/output/开头的对象,但你的PatternMycompany.*\.csv只覆盖了文件名,没包含前面的路径部分,自然匹配不上对象的完整路径flows/snowflake_load_customername/output/Mycompany_SecretThing_202305.csv。 - 查询3用了阶段的根路径,Pattern
flows/snowflake_load_customername/output/Mycompany.*\.csv正好覆盖了对象的完整路径(从桶根到文件名的部分),所以能成功匹配。
简单来说:不管你在list或copy into里加了什么路径前缀,Snowflake的Pattern都是拿对象在存储桶里的全路径来匹配,不是拿相对于阶段URL的相对路径。所以当阶段本身的URL带了子路径时,Pattern里必须包含这部分路径才能找到对应的文件。
内容的提问来源于stack exchange,提问作者ceik
相关产品推荐
相关产品推荐

