如何避免雪花复制语句中的子文件夹

时间:2019-12-19 21:30:54

标签: snowflake-data-warehouse snowflake-schema

我需要从前缀中排除某些文件夹并处理雪花中的数据(复制语句)

在下面的示例中,我需要处理emp /下的文件,并从abc /中排除文件

输入:

s3:// bucket1 / emp /

E1.CSV
E2.CSV
/abc/E11.csv

s3:// bucket1 / emp / abc /-E11.csv

输出:

s3:// bucket1 / emp /

E1.CSV
E2.CSV

围绕模式是否有任何建议可以解决这个问题?

2 个答案:

答案 0 :(得分:2)

使用pattern关键字,您可以尝试排除某些文件。但是,当使用与NOT语法匹配的模式时,您将排除任何包含 any 个字符的文件。

假设您的阶段URL被定义为s3://bucket1/emp/

LS @MY_STAGE pattern = '[^abc].*'; 
  • 排除以a,b或c开头的任何内容
LS @MY_STAGE pattern = '[^a][^b][^c][^\\/].*';  
  • 不包括以下任何内容:
    • 第一个字符是OR,或者
    • 第二个字符是b,或
    • 第三个字符是c,或
    • 第四个字符是正斜杠/

编辑

使用Sharvan的示例进行测试之后。这是我发现的东西:

不起作用: ls @my_stage PATTERN='^((?!/abc/).)*$';,因为第一个正斜杠是作为阶段URL的一部分重复的(如果不存在,则会自动附加到阶段URL上)

作品: ls @my_stage PATTERN='^((?!abc/).)*$';,因为第一个正斜杠已删除

  

已更新,因为不需要转义正斜杠

Snowflake不支持反向引用(根据他们的文档),但是没有提及我认为不支持的超前或后退。

https://docs.snowflake.net/manuals/sql-reference/functions-regexp.html#backreferences

答案 1 :(得分:1)

使用此选项排除前缀模式

ls @stage PATTERN='^((?!/abc/).)*$'