【问题标题】:How to avoid sub folders in snowflake copy statement如何避免雪花复制语句中的子文件夹
【发布时间】:2020-04-12 11:40:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: snowflake-cloud-data-platform snowflake-schema


    【解决方案1】:

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

    假设您的舞台 URL 定义为 s3://bucket1/emp/

    LS @MY_STAGE pattern = '[^abc].*'; 
    
    • 排除以 a、b 或 c 开头的任何内容
    LS @MY_STAGE pattern = '[^a][^b][^c][^\\/].*';  
    
    • 排除以下任何内容:
      • 第一个字符是 a, 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

    【讨论】:

    • 您对顶级文件夹的起始/ 的评论是正确的,但/ 对我来说很好,没有转义。所以我使用top//sub/(使用AWS S3 测试)。
    • 嗨,克里斯,你关于“不起作用:”的第一个声明我测试了这个,没有转义它正在工作。
    • 我的立场是正确的,没有必要逃避正斜杠。
    【解决方案2】:

    使用它来排除前缀模式

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

    【讨论】:

    • 很好,总是想象后瞻和超前是不受支持的。
    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多