Immersion In Data

Snowflake/Snowflake - The Complete Masterclass

[Snowflake] Scheduling Tasks

sungjunminn 2023. 2. 14. 17:05

1. Understanding tasks

  • task를 사용하여 SQL문을 스케줄링할 수 있음
  • 독립실행형 task와 task 트리

 



2. Creating tasks

  • 일시 데이터베이스 생성
CREATE OR REPLACE TRANSIENT DATABASE TASK_DB;

 

  • 테이블 생성
CREATE OR REPLACE TABLE CUSTOMERS (
    CUSTOMER_ID INT AUTOINCREMENT START = 1 INCREMENT =1,
    FIRST_NAME VARCHAR(40) DEFAULT 'JENNIFER' ,
    CREATE_DATE DATE);

 

  • task 생성 (분 단위로만 설정 가능)
CREATE OR REPLACE TASK CUSTOMER_INSERT
    WAREHOUSE = COMPUTE_WH
    SCHEDULE = '1 MINUTE'
    AS 
    INSERT INTO CUSTOMERS(CREATE_DATE) VALUES(CURRENT_TIMESTAMP);

 

  • task 확인
SHOW TASKS;

 

  • task 시작
ALTER TASK CUSTOMER_INSERT RESUME;

 

  • task 중단
ALTER TASK CUSTOMER_INSERT SUSPEND;

 

  • 테이블 확인
SELECT * FROM CUSTOMERS;

 

 




3. Using CRON

  • task 생성 
CREATE OR REPLACE TASK CUSTOMER_INSERT
    WAREHOUSE = COMPUTE_WH
    SCHEDULE = '60 MINUTE'
    AS 
    INSERT INTO CUSTOMERS(CREATE_DATE) VALUES(CURRENT_TIMESTAMP);


  

  •  USING CRON을 사용하여 task 생성 
CREATE OR REPLACE TASK CUSTOMER_INSERT
    WAREHOUSE = COMPUTE_WH
    SCHEDULE = 'USING CRON 0 7,10 * * 5L UTC'
    AS 
    INSERT INTO CUSTOMERS(CREATE_DATE) VALUES(CURRENT_TIMESTAMP);

 

  • USING CRON 뒤에 *이 의미하는 것
# __________ minute (0-59)
# | ________ hour (0-23)
# | | ______ day of month (1-31, or L)
# | | | ____ month (1-12, JAN-DEC)
# | | | | __ day of week (0-6, SUN-SAT, or L)
# | | | | |
# | | | | |
# * * * * *



example

  • 매 분마다 
SCHEDULE = 'USING CRON * * * * * UTC';

 

  • UTC 시간대에서 매일 6시마다
SCHEDULE = 'USING CRON 0 6 * * * UTC';

 

  • America/Los_Angeles 시간대에서 매주 일요일 9시부터 17시까지 매 시간마다
SCHEDULE = 'USING CRON 0 9-17 * * SUN America/Los_Angeles';

 

  • UTC 시간대에서 매일 9시와 17시 두번
CREATE OR REPLACE TASK CUSTOMER_INSERT
    WAREHOUSE = COMPUTE_WH
    SCHEDULE = 'USING CRON 0 9,17 * * * UTC'
    AS 
    INSERT INTO CUSTOMERS(CREATE_DATE) VALUES(CURRENT_TIMESTAMP);

 


  
  


  
4. Understand tree of tasks

  • 부모 task가 여러 자식 task를 갖는 종속성 노드를 통한 task 관계

 

 

 



5. Creating trees of tasks

  • 데이터베이스 변경
USE TASK_DB;

 

  • task 확인
SHOW TASKS;

 

  • 테이블 확인
SELECT * FROM CUSTOMERS;

 

  • 테이블 생성 - 두 번째 테이블(CUSTOMERS2)
CREATE OR REPLACE TABLE CUSTOMERS2 (
    CUSTOMER_ID INT,
    FIRST_NAME VARCHAR(40),
    CREATE_DATE DATE);

 

  • 부모 task 중단 - 자식 task를 생성하려면 부모 task를 중단해야 함
ALTER TASK CUSTOMER_INSERT SUSPEND;

 

  • 자식 task 생성(CUSTOMER_INSERT2)
CREATE OR REPLACE TASK CUSTOMER_INSERT2
    WAREHOUSE = COMPUTE_WH
    AFTER CUSTOMER_INSERT
    AS 
    INSERT INTO CUSTOMERS2 SELECT * FROM CUSTOMERS;

 

  • 테이블 생성 - 세 번째 테이블(CUSTOMERS3)
CREATE OR REPLACE TABLE CUSTOMERS3 (
    CUSTOMER_ID INT,
    FIRST_NAME VARCHAR(40),
    CREATE_DATE DATE,
    INSERT_DATE DATE DEFAULT DATE(CURRENT_TIMESTAMP));

 

  • 자식 task 생성(CUSTOMER_INSERT3)
CREATE OR REPLACE TASK CUSTOMER_INSERT3
    WAREHOUSE = COMPUTE_WH
    AFTER CUSTOMER_INSERT2
    AS 
    INSERT INTO CUSTOMERS3 (CUSTOMER_ID,FIRST_NAME,CREATE_DATE) SELECT * FROM CUSTOMERS2;

 

  • task 확인
SHOW TASKS;

 

  • task의 파라미터 값 변경 - 결과를 빨리 확인할 수 있도록 1분으로 설정
ALTER TASK CUSTOMER_INSERT 
SET SCHEDULE = '1 MINUTE';

 

  • task 시작
ALTER TASK CUSTOMER_INSERT RESUME;
ALTER TASK CUSTOMER_INSERT2 RESUME;
ALTER TASK CUSTOMER_INSERT3 RESUME;

 

  • 테이블 확인
SELECT * FROM CUSTOMERS2;

SELECT * FROM CUSTOMERS3;

 

  • task 중단
ALTER TASK CUSTOMER_INSERT SUSPEND;
ALTER TASK CUSTOMER_INSERT2 SUSPEND;
ALTER TASK CUSTOMER_INSERT3 SUSPEND;



 

 


6. Calling a stored procedure

  • 데이터베이스 변경
USE TASK_DB;

 

  • 테이블 확인
SELECT * FROM CUSTOMERS;

 

  • 스토어드 프로시져 생성
CREATE OR REPLACE PROCEDURE CUSTOMERS_INSERT_PROCEDURE (CREATE_DATE varchar)
    RETURNS STRING NOT NULL
    LANGUAGE JAVASCRIPT
    AS
        $$
        var sql_command = 'INSERT INTO CUSTOMERS(CREATE_DATE) VALUES(:1);'
        snowflake.execute(
            {
            sqlText: sql_command,
            binds: [CREATE_DATE]
            });
        return "Successfully executed.";
        $$;

 

  • task 생성
CREATE OR REPLACE TASK CUSTOMER_TAKS_PROCEDURE
WAREHOUSE = COMPUTE_WH
SCHEDULE = '1 MINUTE'
AS CALL  CUSTOMERS_INSERT_PROCEDURE (CURRENT_TIMESTAMP);

 

  • task 확인
SHOW TASKS;

 

  • task 시작
ALTER TASK CUSTOMER_TAKS_PROCEDURE RESUME;

 

  • 테이블 확인
SELECT * FROM CUSTOMERS;

 

 





7. Task history & error handling

  • task 확인
SHOW TASKS;

 

  • 데이터베이스 변경
USE DEMO_DB;

 

  • TASK_HISTORY()를 통해 task의 기록 확인
select *
  from table(information_schema.task_history())
  order by scheduled_time desc;

 

  • 주어진 시간의 task에 대한 구체적 내용 확인
select *
from table(information_schema.task_history(
    scheduled_time_range_start=>dateadd('hour',-4,current_timestamp()),
    result_limit => 5,
    task_name=>'CUSTOMER_INSERT2'));

 

  • 주어진 기간의 task에 대한 구체적 내용 확인
select *
  from table(information_schema.task_history(
    scheduled_time_range_start=>to_timestamp_ltz('2021-04-22 11:28:32.776 -0700'),
    scheduled_time_range_end=>to_timestamp_ltz('2021-04-22 11:35:32.776 -0700')));

 

  • 현재 타임스탬프가 무엇인지 모르는 경우
SELECT TO_TIMESTAMP_LTZ(CURRENT_TIMESTAMP);

 

 

 

 

 


  
  
Udemy의 'Snowflake - The Complete Masterclass (2023 Edition)'를 공부한 내용을 바탕으로 작성하였습니다. 

'Snowflake > Snowflake - The Complete Masterclass' 카테고리의 다른 글

[Snowflake] Materialized Views  (0) 2023.02.20
[Snowflake] Streams  (0) 2023.02.20
[Snowflake] Data Sampling  (0) 2023.02.14
[Snowflake] Data sharing  (0) 2023.02.13
[Snowflake] Zero-Copy Cloning  (0) 2023.02.09