다단계 워크플로에서 내부 테이블 사용하기
다단계 워크플로에서 내부 테이블 사용하기
클린룸 안에 내부 테이블(internal table)을 만들어 중간 결과를 저장하거나, 이후 단계의 템플릿에서 재사용해 다단계 워크플로를 지원할 수 있어요. 예를 들어 머신러닝 플로우처럼 모델을 데이터셋으로 한 번 학습시키고 다양한 입력 데이터에 여러 번 실행하는 경우가 대표적이에요.
본문
기능 — 일반 공개(Generally Available)
현재 지원 리전: 이 리전들에서 사용할 수 있어요.
정부 및 VPS 배포에서는 사용할 수 없어요.
개요
많은 클린룸 사용 사례는 클린룸 안의 하나 이상의 테이블에 단일 SQL 쿼리를 실행하고 그 결과를 응답으로 표시하는 방식이에요. 하지만 후속 템플릿에서 사용할 수 있는 내부 테이블을 만들어 다단계 워크플로를 지원해야 하는 경우도 있어요. 예를 들어 머신러닝 플로우에서 모델을 데이터셋으로 한 번 학습시키고, 단건 또는 배치로 다양한 입력 데이터에 여러 번 실행하는 경우가 그렇죠.
내부 테이블 만들기
클린룸 안에 내부 테이블을 만들어 중간 결과를 저장하거나, 이후 단계의 영구 저장소로 사용할 수 있어요(예: 여러 실행에 쓰이는 학습 데이터 저장). 내부 테이블의 속성과 지침은 다음과 같아요:
- CREATE TABLE을 실행하는 클린룸 템플릿을 사용하거나, Python으로 테이블을 만드는 UDF/UDTF를 실행해 내부 테이블을 만들 수 있어요.
- 내부 테이블은 기본으로 제공되는
cleanroom스키마에 만들 수 있어요. 커스텀 스키마를 선호한다면 테이블을 만들기 전에 먼저 스키마를 만들어야 해요. - 기본적으로 내부 테이블은 클린룸에서 승인된 템플릿만 접근할 수 있어요. 템플릿 밖에서 접근 권한을 제공해야 한다면 클린룸의 CLEANROOM_PUBLIC_ROLE 애플리케이션 역할에 해당 권한을 부여해야 해요. 예를 들어 다음과 같은 부여를 할 수 있어요:
GRANT SELECT ON TABLE CLEANROOM.MY_TABLE TO APPLICATION ROLE CLEANROOM_PUBLIC_ROLE; - 접근 권한이 있다면 콜라보레이션의 내부 테이블을 나열할 수 있어요. 내부 테이블은
SFDCR_collaboration_name.cleanroom에서 찾을 수 있고, 다음 SQL 코드로 나열할 수 있어요:SHOW TABLES IN SCHEMA SFDCR_collaboration_name.CLEANROOM; - 콜라보레이션이 제거되면 내부 테이블도 삭제돼요. 하지만 내부 테이블을 콜라보레이션보다 짧은 수명으로 설계했다면, 더 이상 필요 없을 때 테이블을 삭제하는 것을 고려하세요.
내부 테이블을 만드는 예시는 다음과 같아요:
템플릿(예시)
JinjaSQL 템플릿은 내부 테이블을 만들 수 있어요. 활성화(activation)의 일부 유형에서 이런 방식으로 만들어져요.
이 예시 템플릿은 테이블을 만들고 테이블 이름을 반환해서, 그 이름을 다른 템플릿의 파라미터로 전달할 수 있게 해줘요.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_TEMPLATE(
$$
api_version: 2.0.0
spec_type: template
name: my_test_template
version: V1
type: sql_analysis
description: Simple join example. Saves to table analysis_results
template:
BEGIN
CREATE OR REPLACE TABLE cleanroom.analysis_results AS
SELECT count(*) AS ITEM_COUNT, p1.status, p1.age_band
FROM IDENTIFIER({{ source_table[0] }}) AS p1
JOIN IDENTIFIER({{ source_table[1] }}) AS p2
ON IDENTIFIER({{ join_col_1 | join_policy }}) = IDENTIFIER({{ join_col_2 | join_policy }})
GROUP BY p1.status, p1.age_band;
RETURN 'analysis_results';
END;
$$
);
UDF(예시)
UDF는 내부 테이블을 만들 수 있어요. 일반적으로 Python에서 SQL을 실행하는 방식으로 이루어져요.
# Snippet of Python UDF to save results to an internal table.
table_name = f'cleanroom.results'
session.sql(f"""
CREATE OR REPLACE TABLE {table_name} AS (
WITH joint_data AS (
SELECT
date,
p.hashed_email AS hem,
impression_id
FROM {source_table} p
)
SELECT
date,
COUNT(DISTINCT hem) AS reach,
COUNT(DISTINCT impression_id) AS num_impressions
FROM joint_data
GROUP BY date
ORDER BY date
);
""").collect()