【问题标题】:Dynamic file paths for Snowflake stagesSnowflake 阶段的动态文件路径
【发布时间】:2020-12-21 13:35:05
【问题描述】:

我正在将数据从 Snowflake 表复制到 S3 外部阶段:

COPY INTO '@my_stage/my_folder/my_file.csv.gz' FROM (
    SELECT *
    FROM my_table
)

但是,此代码每天运行,我不想覆盖 my_file.csv.gz,而是保留所有历史版本。但是我还没有找到创建动态路径的方法:

SET stage_name=CONCAT('@my_stage/my_folder/my_file', '_date.csv.gz');

COPY INTO $stage_name FROM (
    SELECT *
    FROM my_table
);

COPY INTO IDENTIFIER($stage_name) FROM (
    SELECT *
    FROM my_table
);

后面的 2 个查询都不起作用! 我的问题:如何在 Snowflake 中创建动态舞台路径?谢谢

【问题讨论】:

  • 我相信你只能通过存储过程来做到这一点:Dynamic paths

标签: snowflake-cloud-data-platform


【解决方案1】:

这是一个您可以使用和修改的存储过程。请注意,用于修改您的 copy into 语句的注释行使用反引号而不是单引号或双引号。在 JavaScript 中,允许在字符串中使用单引号或双引号、多行常量和 ${variable_name}

形式的替换标记
create or replace procedure COPY_TO_STAGE(PATH string)
returns variant
language javascript
as
$$

class Query{
    constructor(statement){
        this.statement = statement;
    }
}

// Start of main function

var out = {};

// Change your copy into statement here. 
var q = getQuery(`copy into '${PATH}' from (select * from my_table);`);

if (q.resultSet.next()) {
    out["rows_unloaded"] = q.resultSet.getColumnValue("rows_unloaded");
    out["input_bytes"] = q.resultSet.getColumnValue("input_bytes");
    out["output_bytes"] = q.resultSet.getColumnValue("output_bytes");
} else {
    out["Error"] = "Unknown error";
}

return out;

// End of main function

function getQuery(sql){
    cmd1 = {sqlText: sql};
    var query = new Query(snowflake.createStatement(cmd1));
    query.resultSet = query.statement.execute();
    return query;
}
$$;

一旦你定义了它,你可以根据需要使用 SQL 变量作为输入:

SET stage_name=CONCAT('@my_stage/my_folder/my_file', '_date.csv.gz');

call copy_to_stage($stage_name);

【讨论】:

  • 谢谢格雷格! ? 这也是我最终确定的,一个用 Javascript 编写的基本存储过程。但是我真的很惊讶 Snowflake 不支持这样的基本功能! ?
【解决方案2】:

这行不通。不幸的是,使用变量作为标识符不适用于阶段。您可能需要使用动态 SQL 创建存储过程: https://docs.snowflake.com/en/sql-reference/stored-procedures-usage.html#label-example-of-dynamic-sql-in-stored-procedure

所以你可以每天调用这个过程,或者生成一个带有多个参数的 SP,用于路径(Stage)、将要执行的查询和目标文件名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-10
    • 2020-08-28
    • 2021-06-24
    • 2018-02-09
    • 2021-06-28
    • 2011-07-05
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多