【问题标题】:How to avoid copying data from subfolders using COPY INTO in Snowflake如何避免在 Snowflake 中使用 COPY INTO 从子文件夹中复制数据
【发布时间】:2021-01-17 02:51:59
【问题描述】:

我们正在尝试使用 COPY INTO 将数据从 S3 存储桶加载到 Snowflake。 完美运行.. 但是子文件夹中的数据也被复制了,这不应该发生。

遵循硬编码模式 REGEX 完美运行

copy into TARGETTABLE
from @SOURCESTAGE
pattern='^(?!.*subfolder/).*$'

但我们不想硬编码文件夹名称。当我只保留“/”时,它不再起作用了..(当我转义斜线 \/ 时也会发生同样的情况)

copy into TARGETTABLE
from @SOURCESTAGE
pattern='^(?!.*/).*$'

有人知道使用哪个 REGEX 以动态方式跳过 COP INTO 中的任何子文件夹吗? (文件夹名称没有硬编码)

@test_stage/folder_include
@test_stage/folder_include/file_that_has_to_be_loaded.csv
@test_stage/folder_include/folder_exclude/file_that_cannot_be_loaded.csv

所以只有folder_include 中的文件可以被copy into 语句拾取。需要跳过较低级别的所有内容。 最重要的是:没有对文件夹名称进行硬编码。 folder_include 中的任何文件夹都必须被忽略。

谢谢!

【问题讨论】:

  • 我想这可能已经在这里得到了回答:How to avoid sub folders in snowflake copy statement
  • 您好,尼克,感谢您的回答。事实上并非如此。此解决方案提供硬代码修复。不是动态的。该解决方案显示了如何按名称跳过子文件夹。我需要一个更通用的解决方案。
  • 您要保留的模式是否只包含一个斜线字符(即子文件夹包含 2 个或更多斜线)?如果是这样,这可能会有所帮助(显然将 % 更改为 /):stackoverflow.com/questions/16762492/…
  • 源阶段中的任何文件夹都将包含至少 1 个 '/' 。我试过了,但没有帮助。谢谢。
  • 如果顶级文件夹(您要从中加载的文件夹)包含 1 个“/”,那么子文件夹是否必须包含超过 1 个“/”?如果是这种情况,那么为什么对单个“/”进行过滤不起作用?

标签: copy snowflake-cloud-data-platform stage


【解决方案1】:

如果 STAGE 中包含的 PATH 是静态的,您可以将其包含在您的模式中。

list @SOURCESTAGE PATTERN = 'full_path_to_folder_include/[^/]*'

即使您的路径包含特定于环境的文件夹(例如 DEV、PROD),您也可以考虑到这一点:

list @SOURCESTAGE PATTERN = 'static_path/[^/]+/path_to_folder/[^/]*'
or
list @SOURCESTAGE PATTERN = 'static_path/(dev|test|prod)/path_to_folder/[^/]*'

【讨论】:

    【解决方案2】:

    这里(如 cmets 中提到的)是跳过硬编码文件夹名称的解决方案:How to avoid sub folders in snowflake copy statement

    在我看来,将硬编码部分替换为 .* 使其具有通用性。

    亲切的问候:)

    【讨论】:

    • 嗨,马塞尔,这行不通。我认为 PATTERN 正则表达式将始终检查整个 PATH。包括在后端的您的 STAGE 中定义的所有内容。将其替换为 '.*' 还将在路径中的所有其他斜杠上测试为阳性.. 结果将是没有任何通过。
    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    相关资源
    最近更新 更多