如何安排雪花数据库中的 sql 脚本每天运行,并将输出文件名设置为包含当前日期。例如,如果代码今天运行,那么文件名应该是20200906*****.csv.gz
,明天类似20200907******.csv.gz
。
问问题
3749 次
1 回答
4
您可以使用 Snowflake TASKS来安排 SQL 语句的执行。任务可以执行单个 SQL 语句,包括对存储过程的调用。任务根据指定的执行配置运行,使用设置间隔的任意组合和/或使用熟悉的 cron 实用程序语法的子集的灵活计划。
为了您的目标,我将创建一个存储过程(以便您可以使用变量来管理更改的文件名和任何更复杂的事情)。
SF 文档:https ://docs.snowflake.com/en/sql-reference/sql/create-task.html
--create a new task that executes a single SQL statement based on CRON definition
CREATE TASK mytask_hour
WAREHOUSE = mywh
SCHEDULE = 'USING CRON 0 9-17 * * SUN America/Los_Angeles'
TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24'
AS
INSERT INTO mytable(ts) VALUES(CURRENT_TIMESTAMP);
--create a new task that executes a Stored Procedure every hour
create task my_copy_task
warehouse = mywh
schedule = '60 minute'
as
call my_unload_sp();
创建任务后,您必须执行ALTER TASK ... RESUME才能启用它。
使用SHOW TASKS检查任务的定义/配置,然后查询TASK_HISTORY以检查执行情况。
您的 Snowflake JS 存储过程可能是这样的:
create or replace procedure SP_TASK_EXPORT()
RETURNS VARCHAR(256) NOT NULL
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
as $$
function getToday_yyyymmdd()
{
var v_out_Today;
rs = snowflake.execute ( { sqlText: `SELECT to_char(current_date,'yyyymmdd');` } );
if( rs.next())
{
v_out_Today = rs.getColumnValue(1); // get current date as yyyymmdd
}
return v_out_Today;
}
var result = new String('Successfully Executed');
var v_Today = getToday_yyyymmdd();
try {
var sql_command = `copy into @unload_gcs/LH_TBL_FIRST` + v_Today + `.csv.gz from ........`;
var stmt = snowflake.createStatement({sqlText: sql_command});
var res = stmt.execute();
}
catch (err) {
result = "Failed: Code: " + err.code + " | State: " + err.state;
result += "\n Message: " + err.message;
result += "\nStack Trace:\n" + err.stackTraceTxt;
}
return result;
$$;
在创建任务并安排它之前,测试调用它的存储过程:
调用 SP_TASK_EXPORT();
于 2020-09-06T07:30:19.637 回答