首页 > 解决方案 > 雪花:在 MERGE 或 COPY 命令(来自外部阶段)中,我可以指定只合并/复制最新的 csv 文件吗?

问题描述

现在,我们的 MERGE/COPY 命令指向一个 s3 文件夹。只要 S3 文件夹中有多个 csv 文件,Snowflake 就会引发“重复行”错误。我每天早上手动移动 s3 文件,以便 s3 文件夹中只有一个文件。如何告诉雪花只合并/复制文件夹中最新的 csv 文件?(注意:日期/时间是我们对这些 csv 文件的命名约定的一部分)

标签: amazon-s3snowflake-cloud-data-platformboomi

解决方案


假设您使用 Dell Boomi 执行您的 COPY INTO 命令,多个文件是在同一负载中进入您的 S3 存储桶还是增量加载?

如果它们正在增量加载,我会在您的 COPY INTO 语句中设置 PURGE = TRUE ,这样一旦文件被正确复制,它就会从您的 S3 存储桶中删除,并且当下一个文件进入时,复制到您的阶段表时不会发生冲突. PURGE = TRUE 要求您确保正确设置权限以允许 Snowflake 从您的 S3 中删除。

https://docs.snowflake.com/en/sql-reference/sql/copy-into-table.html#purging-files-after-loading

如果您想尝试变得非常聪明,也可以查询尝试执行以下操作:

COPY INTO YourTable
    (
    RAW_FILE_NAME
    , RAW_FILE_ROW_NUMBER
    , ColPK
    , ColVal
    , ColVal2
    )
  FROM (WITH CTE AS (SELECT ROW_NUMBER() OVER(ORDER BY metadata$filename DESC) AS rnk, metadata$filename, metadata$file_row_number, t.$1,t.$2,t.$3
        FROM @YourStage/YourDirectory/
        AS t) SELECT metadata$filename, metadata$file_row_number, $1,$2,$3 FROM CTE WHERE rnk = 1);

推荐阅读