0

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

在下面的示例中,我需要处理 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

有没有关于模式的建议来处理这个问题?

4

2 回答 2

2

使用pattern关键字,您可以尝试排除某些文件。但是,当使用具有 NOT 语法的模式匹配时,您会排除具有任何字符的任何文件。

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

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

编辑

在用 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

于 2019-12-19T21:58:58.803 回答
1

使用它来排除前缀模式

ls @stage PATTERN='^((?!/abc/).)*$'
于 2019-12-19T23:52:51.500 回答