2

如何安排雪花数据库中的 sql 脚本每天运行,并将输出文件名设置为包含当前日期。例如,如果代码今天运行,那么文件名应该是20200906*****.csv.gz,明天类似20200907******.csv.gz

4

1 回答 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 回答