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 |