Referência de modelo de sala limpa personalizado¶
Sobre os modelos de clean rooms¶
Os modelos de clean room são escritos em JinjaSQL. JinjaSQL é uma extensão da linguagem de modelos Jinja que gera uma consulta SQL como saída. O JinjaSQL oferece suporte a instruções lógicas e resolução de variáveis em tempo de execução para permitir que o usuário personalize a consulta em tempo de execução. As variáveis são normalmente usadas em um modelo para permitir que um usuário especifique nomes de tabelas, colunas de tabelas e valores personalizados a serem usados em sua consulta.
O Snowflake oferece uma seleção de modelos pré-configurados para casos de uso comuns. Esses modelos de estoque podem ser usados somente na UI de salas limpas. No entanto, tanto provedores quanto consumidores podem criar modelos personalizados para uma sala limpa. É possível criar modelos personalizados apenas em código, mas executá-los em código ou pela UI de salas limpas.
Há dois tipos gerais de modelos:
Modelos de análise, que avaliam uma instrução SELECT (ou um conjunto de operações SELECT).
Modelos de ativação, que avaliam uma instrução SELECT aninhada dentro de uma instrução CREATE TABLE e retornam o nome da tabela. Esse modelo gera dados que são exportados para a conta Snowflake do consumidor ou do provedor ou para um terceiro, dependendo de como a clean room está configurada. Um modelo de ativação é muito semelhante a um modelo de análise com alguns requisitos adicionais.
Nas UI de clean rooms, um modelo de análise pode ser associado a um modelo de ativação para permitir que o chamador execute uma análise e, em seguida, envie os dados para si mesmo ou para terceiros. O modelo de ativação não precisa ser resolvido para a mesma consulta que o modelo de análise associado.
Criação e execução de um modelo personalizado¶
Em uma clean room com configurações padrão, o provedor adiciona um modelo a uma clean room e o consumidor pode escolher, configurar e executá-la:
O provedor projeta um modelo personalizado e o adiciona a uma clean room chamando
provider.add_custom_sql_template
.O consumidor chama
consumer.run_analysis
para executar o modelo do provedor, passando valores para quaisquer variáveis necessárias ao modelo.
Esse fluxo não exige permissões da outra parte, a não ser o fato de que o consumidor deve ser convidado pelo provedor para uma clean room. Há variações nesse processo, como modelos fornecidos pelo consumidor e modelos gerenciados pelo provedor, que são abordados em outro lugar.
Um exemplo rápido¶
Aqui está um exemplo simples de SQL que une uma tabela de provedor e uma tabela de consumidor por e-mail e mostra a contagem de sobreposições por cidade:
SELECT COUNT(*), city FROM consumer_table
INNER JOIN provider_table
ON consumer_table.hashed_email = provider_table.hashed_email
GROUP BY city;
Esta é a aparência dessa consulta como um modelo que permite que o chamador escolha as colunas select/group e join, bem como as tabelas:
SELECT COUNT(*), IDENTIFIER({{ group_by_col | column_policy }})
FROM IDENTIFIER({{ my_table[0] }}) AS C
INNER JOIN IDENTIFIER({{ source_table[0] }}) AS P
ON IDENTIFIER({{ consumer_join_col | join_policy }}) = IDENTIFIER({{ provider_join_col | join_policy }})
GROUP BY IDENTIFIER({{ group_by_col | column_policy }});
Observações sobre o modelo:
Os valores em {{ double bracket pairs }} são variáveis personalizadas.
group_by_col
,my_table
,source_table
,consumer_join_col
,provider_join_col
egroup_by_col
são variáveis personalizadas preenchidas pelo chamador.source_table
emy_table
são variáveis de matriz de cadeia de caracteres definidas pelo Snowflake e preenchidas pelo chamador. Os membros da matriz são nomes totalmente qualificados de tabelas de provedores e consumidores vinculadas à clean room. O chamador especifica quais tabelas devem ser incluídas em cada matriz.As tabelas de provedores devem ter o alias
P
e as tabelas de consumidoresC
em um modelo. Se você tiver várias tabelas, poderá indexá-las comoP1
,P2
,C1
,C2
e assim por diante.IDENTIFIER é necessário para todos os nomes de colunas e tabelas, pois as variáveis em {{ double brackets }} são avaliadas como literais de cadeia de caracteres, que não são identificadores válidos.
Filtros JinjaSQL podem ser aplicados às variáveis. O Snowflake implementa os filtros personalizados
join_policy
ecolumn_policy
, que verificam se uma coluna está em conformidade com as políticas de junção ou de coluna na clean room, respectivamente, e reprova a consulta se não estiver. Um filtro é aplicado a um nome de coluna como{{ column_name | filter_name }}
.
Todos esses pontos serão discutidos em detalhes posteriormente.
Veja como um consumidor pode executar esse modelo no código. Observe como os nomes de colunas são qualificados pelos aliases de tabela declarados no modelo.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.CONSUMER.RUN_ANALYSIS(
$cleanroom_name,
$template_name,
['my_db.my_sch.consumer_table], -- Populates the my_table variable
['my_db.my_sch.provider_table'], -- Populates the source_table variable
OBJECT_CONSTRUCT( -- Populates custom named variables
'consumer_join_col','c.age_band',
'provider_join_col','p.age_band',
'group_by_col','p.device_type'
)
);
Para usar esse modelo na UI de salas limpas, o provedor deve criar um formulário de UI personalizado para o modelo. O formulário de UI nomeou os elementos do formulário de forma que correspondam aos nomes das variáveis do modelo, e os valores inseridos no formulário são passados para o modelo.
Desenvolvimento de um modelo personalizado¶
Os modelos de sala limpa são modelos JinjaSQL. Para criar um modelo, você deve estar familiarizado com os seguintes tópicos:
Noções básicas sobre criação de modelos Jinja
A extensão JinjaSQL para Jinja
Siga o procedimento get_sql_jinja para testar a validade do modelo e renderizar um modelo. Execute o modelo renderizado para ver se ele produz os resultados desejados. Observe que esse procedimento não oferece suporte para extensões de filtro de sala limpa, como join_policy
, portanto, você deve testar seu modelo sem esses filtros e adicioná-los mais tarde.
Exemplo:
-- Template to test
SELECT {{ col1 | sqlsafe }}, {{ col2 | sqlsafe }}
FROM IDENTIFIER({{ source_table[0] }}) AS p
JOIN IDENTIFIER({{ my_table[0] }}) AS c
ON {{ provider_join_col | sqlsafe }} = {{ consumer_join_col | sqlsafe}}
{% if where_phrase %} WHERE {{ where_phrase | sqlsafe}}{% endif %};
-- Render the template.
USE WAREHOUSE app_wh;
USE ROLE samooha_app_role;
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.CONSUMER.GET_SQL_JINJA(
$$
SELECT {{ col1 | sqlsafe }}, {{ col2 | sqlsafe }}
FROM IDENTIFIER({{ source_table[0] }}) AS p
JOIN IDENTIFIER({{ my_table[0] }}) AS c
ON {{ provider_join_col | sqlsafe }} = {{ consumer_join_col | sqlsafe}}
{% if where_phrase %} WHERE {{ where_phrase | sqlsafe }}{% endif %};
$$,
object_construct(
'col1', 'c.status',
'col2', 'c.age_band',
'where_phrase', 'p.household_size > 2',
'consumer_join_col', 'c.age_band',
'provider_join_col', 'p.age_band',
'source_table', ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS'],
'my_table', ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS']
));
-- The rendered template looks like this:
SELECT c.status, c.age_band
FROM IDENTIFIER('SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS') AS p
JOIN IDENTIFIER('SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS') AS c
ON p.age_band = c.age_band
WHERE p.household_size > 2;
-- Run it.
- Test without a WHERE clause
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.CONSUMER.GET_SQL_JINJA(
$$
SELECT {{ col1 | sqlsafe }}, {{ col2 | sqlsafe }}
FROM IDENTIFIER({{ source_table[0] }}) AS p
JOIN IDENTIFIER({{ my_table[0] }}) AS c
ON {{ provider_join_col | sqlsafe }} = {{ consumer_join_col | sqlsafe}}
{% if where_phrase %} WHERE {{ where_phrase | sqlsafe }}{% endif %};
$$,
object_construct(
'col1', 'c.status',
'col2', 'c.age_band',
'consumer_join_col', 'c.age_band',
'provider_join_col', 'p.age_band',
'source_table', ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS'],
'my_table', ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS']
));
-- Output
SELECT c.status, c.age_band
FROM IDENTIFIER('SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS') AS p
JOIN IDENTIFIER('SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS') AS c
ON p.age_band = c.age_band
;
-- Put in the policy filters and declare the template
CALL samooha_by_snowflake_local_db.provider.add_custom_sql_template(
$cleanroom_name,
'simple_template',
$$
SELECT {{ col1 | sqlsafe | column_policy }}, {{ col2 | sqlsafe | column_policy }}
FROM IDENTIFIER({{ source_table[0] }}) AS p
JOIN IDENTIFIER({{ my_table[0] }}) AS c
ON {{ provider_join_col | sqlsafe | join_policy }} = {{ consumer_join_col | sqlsafe | join_policy }}
{% if where_phrase %} WHERE {{ where_phrase | sqlsafe }}{% endif %};
$$,
);
Proteção de dados¶
Os modelos podem acessar apenas conjuntos de dados vinculados à clean room pelo provedor e pelo consumidor.
Tanto o provedor quanto o consumidor podem definir políticas de junção, coluna e ativação em seus dados para proteger as colunas que podem ser unidas, projetadas ou ativadas. Entretanto, o modelo deve incluir o filtro JinjaSQL apropriado em uma coluna para a política que será aplicada.
Sintaxe de modelo personalizado¶
O Snowflake Data Clean Rooms é compatível com JinjaSQL V3, com algumas extensões, conforme indicado.
Regras de nomeação de modelos¶
Ao criar um modelo, os nomes devem ser todos em letras minúsculas, números, espaços ou sublinhados. Os modelos de ativação (exceto para a ativação do provedor administrado pelo consumidor) devem ter um nome que comece com “activation”. Os nomes de modelos são atribuídos quando você chama provider.add_custom_sql_template
ou consumer.create_template_request
.
Exemplo de nomes válidos:
my_template
activation_template_1
Exemplo de nomes inválidos:
my template
– Espaços não permitidosMy_Template
– Somente modelos em letras minúsculas são permitidos
Variáveis de modelo¶
Os chamadores de modelo podem passar valores para variáveis de modelo. A sintaxe JinjaSQL permite a vinculação de variáveis para qualquer nome de variável em {{ double_brackets }}, mas o Snowflake reserva alguns nomes de variável que você não deve substituir, conforme descrito abaixo.
Cuidado
Todas as variáveis, sejam elas definidas pelo Snowflake ou personalizadas, são preenchidas pelo usuário e devem ser tratadas com a devida cautela. Os modelos do Snowflake Data Clean Rooms devem ser resolvidos em uma única instrução SELECT, mas você ainda deve se lembrar de que todas as variáveis são passadas pelo chamador.
Variáveis definidas pelo Snowflake¶
Todos os modelos de clean room têm acesso às seguintes variáveis globais definidas pelo Snowflake, mas passadas pelo chamador:
source_table
:Uma matriz de cadeias de caracteres com base zero contendo as tabelas e exibições vinculadas ao provedor na clean room que pode ser usada pelo modelo. Os nomes de tabelas são totalmente qualificados, por exemplo:
my_db.my_sch.provider_customers
Exemplo:
SELECT col1 FROM IDENTIFIER({{ source_table[0] }}) AS p;
my_table
:Uma matriz de cadeias de caracteres com base zero contendo tabelas e exibições de consumidores na clean room que pode ser usada pelo modelo. Os nomes de tabelas são totalmente qualificados, por exemplo:
my_db.my_sch.consumer_customers
Exemplo:
SELECT col1 FROM IDENTIFIER({{ my_table[0] }}) AS c;
privacy
:Um conjunto de valores relacionados à privacidade associados a usuários e modelos. Veja a lista de campos filho disponíveis. Esses valores podem ser definidos explicitamente para o usuário, mas seu modelo deve sempre fornecer um valor padrão caso eles não sejam definidos. Acesse os campos secundários diretamente em seu modelo, como
privacy.threshold
.Exemplo: aqui está um exemplo de trecho de código de um modelo que usa
threshold_value
para aplicar um tamanho mínimo de grupo em uma cláusula de agregação.SELECT IFF(a.overlap > ( {{ privacy.threshold_value | default(2) | sqlsafe }} ), a.overlap,1 ) AS overlap, c.total_count AS total_count ...
Nota
Há duas variáveis globais de clean room herdadas: measure_columns
e dimensions
. O uso desses nomes não é mais recomendado, mas eles ainda são definidos e aparecem em alguns modelos e documentações herdados, portanto, você não deve criar aliases de tabelas ou colunas usando qualquer um desses nomes para evitar colisões de nomes.
Variáveis personalizadas¶
Os criadores de modelos podem incluir variáveis arbitrárias em um modelo, que pode ser preenchido pelo autor da chamada. Essas variáveis podem ter qualquer nome arbitrário compatível com Jinja, exceto as variáveis definidas pelo Snowflake ou nomes de alias de tabelas. Se você quiser que seu modelo possa ser usado na UI de salas limpas, também deverá fornecer um formulário de UI para os usuários da UI de salas limpas. Para usuários de API, você deverá fornecer uma boa documentação sobre as variáveis obrigatórias e opcionais.
As variáveis personalizadas podem ser acessadas por seu modelo, conforme mostrado aqui para a variável personalizada max_income
:
SELECT income FROM my_db.my_sch.customers WHERE income < {{ max_income }};
Os usuários podem passar variáveis para um modelo de duas maneiras diferentes:
Na UI de salas limpas, selecionando ou inserindo valores por meio de um formulário de UI criado pelo desenvolvedor do modelo. Esse formulário de UI contém elementos nos quais o usuário insere os valores do modelo. O nome do elemento de formulário é mesmo da variável. O modelo simplesmente usa o nome do elemento de formulário para acessar o valor. Crie o formulário de UI usando provider.add_ui_form_customizations.
No código, um consumidor chama consumer.run_analysis e passa os nomes das tabelas como matrizes de argumentos e as variáveis personalizadas como pares nome-valor ao argumento
analysis_arguments
.
Nota
Se precisar acessar os valores fornecidos pelo usuário em qualquer código Python personalizado carregado na clean room, você deve passar explicitamente os valores de variável ao código por meio dos argumentos da função Python; as variáveis de modelo não podem ser acessadas diretamente no código Python usando {{jinja variable binding syntax}}
.
Resolução correta de variáveis¶
Os valores de cadeia de caracteres passados para o modelo são resolvidos como literais de cadeia de caracteres no modelo final. Isso pode causar erros SQL de análise ou lógicos se você não tratar adequadamente as variáveis vinculadas:
SELECT {{ my_col }} FROM P;
é resolvida comoSELECT 'my_col' from P;
, que apenas retorna a cadeia de caracteres «my_col» (provavelmente, não é o que você quer).SELECT age FROM {{ my_table[0] }} AS P;
é resolvida comoSELECT age FROM 'somedb.somesch.my_table' AS P;
, que causa um erro de análise porque a tabela deve ser um identificador, não uma cadeia de caracteres literal.SELECT age FROM IDENTIFIER({{ my_table[0] }}) AS P {{ where_clause }};
passada em «WHERE age < 50» é avaliada comoSELECT age FROM mytable AS P 'WHERE age < 50';
, que é um erro de análise devido à cláusula WHERE de cadeia de caracteres literal.
Portanto, quando apropriado, você deve resolver as variáveis. Veja como resolver as variáveis corretamente em seu modelo:
- Nomes de tabelas e colunas
As variáveis que especificam nomes de tabelas ou colunas devem ser convertidas em identificadores em seu modelo de duas maneiras:
IDENTIFIER: por exemplo,
SELECT IDENTIFIER({{ my_column }}) FROM P;
sqlsafe: esse filtro JinjaSQL resolve cadeias de caracteres de identificadores para o texto SQL. Uma instrução equivalente ao item anterior é
SELECT {{ my_column | sqlsafe }} FROM P;
Seu uso específico determina quando usar IDENTIFIER ou
sqlsafe
. Por exemplo,c.{{ my_column | sqlsafe }}
não pode ser facilmente reescrito usando IDENTIFIER.- SQL dinâmico
Quando você tiver uma variável de cadeia de caracteres que deva ser usada como SQL literal, como uma cláusula WHERE, use o filtro
sqlsafe
em seu modelo. Por exemplo:SELECT age FROM IDENTIFIER({{ my_table[0] }}) AS C WHERE {{ where_clause }};
Se um usuário inserir “age < 50” em
where_clause
, a consulta será resolvida emSELECT age FROM sometable AS C WHERE 'age < 50';
, que é SQL inválido devido à condição WHERE da cadeia de caracteres literal. Nesse caso, você deve usar o filtrosqlsafe
:SELECT age FROM IDENTIFIER( {{ my_table[0] }} ) as C {{ where_clause | sqlsafe }};
Aliases de tabela necessários¶
No nível superior de sua consulta, todas as tabelas ou subconsultas devem ter o alias P
(para tabelas de provedores) ou C
(para tabelas de consumidores) para que o Snowflake valide corretamente as políticas de junção e coluna na consulta. Qualquer coluna que precise ser verificada em relação às políticas de junção ou de coluna pertence a uma tabela cujo alias é P
ou C
. (Especificar P
ou C
informa ao back-end se a coluna deve ser validada com base na política do provedor ou consumidor, respectivamente)
Se você usar várias tabelas de provedor ou consumidor em sua consulta, adicione um sufixo numérico sequencial baseado em 1 a cada alias de tabela após o primeiro. Portanto: P
, P1
, P2
e assim por diante para a primeira, segunda e terceira tabelas de provedores, e C
, C1
, C2
e assim por diante para a primeira, segunda e terceira tabelas de consumidores. O índice P
ou C
deve ser sequencial, sem intervalos (ou seja, crie os aliases P
, P1
e P2
, e não P
, P2
e P4
).
Exemplo
SELECT col1 FROM IDENTIFIER({{ source_table[0] }}) AS P;
Filtros de modelo¶
O Snowflake é compatível com todos os filtros Jinja padrão e com a maioria dos filtros padrão JinjaSQL, além de algumas extensões:
join_policy
: verifica se a coluna é permitida pela política de junção da tabela e falha se não for.column_policy
: verifica se a coluna é permitida pela política de colunas do modelo (pode ser projetada).activation_policy
: verifica se a coluna filtrada é permitida pelas políticas de ativação da clean room (provider.set_activation_policy
ouconsumer.set_activation_policy
).join_and_column_policy
: verifica se a coluna é permitida pelas políticas de junção, ativação ou coluna. Usado para oferecer mais flexibilidade na clean room, para permitir que os colaboradores atualizem as políticas de junção e coluna sem alterar o modelo.O filtro JinjaSQL
identifier
não é compatível com os modelos Snowflake.
As instruções JinjaSQL são avaliadas da esquerda para a direita:
{{ my_col | column_policy }}
Correto{{ my_col | sqlsafe | column_policy }}
Correto{{ column_policy | my_col }}
Incorreto{{ my_col | column_policy | sqlsafe }}
Incorreto:column_policy
será verificada com base no valormy_col
como cadeia de caracteres, o que é um erro.
Aplicação de políticas de clean room¶
As clean rooms não verificam automaticamente as políticas de clean room em relação às colunas usadas em um modelo. Se quiser impor uma política a uma coluna, você deve aplicar o filtro de política apropriado a essa coluna no modelo. Por exemplo:
JOIN IDENTIFIER({{ source_table[0] }}) AS p
ON {{ c_join_col | sqlsafe | join_policy }} = {{ p_join_col | sqlsafe }}
Isso testará a política de junção em relação à coluna passada para c_join_col
, mas não em relação a p_join_col
.
Observe que os nomes das colunas não podem ser ambíguos ao testar políticas, da mesma forma que qualquer outro uso de SQL. Portanto, se você tiver colunas com o mesmo nome em duas tabelas, deverá qualificar o nome da coluna para testar a política em relação a essa coluna.
Execução de código Python personalizado¶
Os modelos podem executar o código Python carregado na clean room. O modelo pode chamar uma função Python que aceita valores de uma linha de dados e retorna valores para serem usados ou projetados na consulta.
Quando o provedor carrega um código Python personalizado em uma sala limpa, o modelo chama funções Python com a sintaxe
cleanroom.function_name
. Mais detalhes aqui.Quando o consumidor carrega um código Python personalizado em uma sala limpa, o modelo chama a função com o valor básico
function_name
passado paraconsumer.generate_python_request_template
(sem escopo definido paracleanroom
como acontece no código do provedor). Mais detalhes aqui.
Exemplo de código de provedor:
-- Provider uploads a Python function that takes two numbers and returns the sum.
call samooha_by_snowflake_local_db.provider.load_python_into_cleanroom(
$cleanroom_name,
'simple_addition', -- Function name to use in the template
['someval integer', 'added_val integer'], -- Arguments
[], -- No packages needed
'integer', -- Return type
'main', -- Handler for function name
$$
def main(input, added_val):
return input + int(added_val)
$$
);
-- Template passes value from each row to the function, along with a
-- caller-supplied argument named 'increment'
call samooha_by_snowflake_local_db.provider.add_custom_sql_template(
$cleanroom_name,
'simple_python_example',
$$
SELECT val, cleanroom.simple_addition(val, {{ increment | sqlsafe }})
FROM VALUES (5),(8),(12),(39) AS P(val);
$$
);
Considerações de segurança¶
Um modelo deve ser avaliado em uma única consulta SELECT, que é executada pelo aplicativo nativo da clean room. O modelo não é executado com a identidade do usuário atual.
O usuário não tem acesso direto a nenhum dado dentro da clean room; todo o acesso é feito pelo aplicativo nativo por meio dos resultados do modelo.
Aplique um filtro de política sempre que uma coluna for usada na consulta, mesmo quando o nome da coluna for definido explicitamente no modelo, ou quando a coluna ou tabela for fornecida pelo usuário. Você pode alterar as políticas de junção ou coluna posteriormente, ou alterar a coluna e esquecer de atualizar o modelo. Para todas as colunas fornecidas pelo usuário, você deve aplicar um filtro join_policy
, column_policy
, join_and_column_policy
ou activation_policy
.
Modelos de ativação¶
Um modelo também pode ser usado para salvar os resultados de consulta em uma tabela fora da clean room; isso é chamado de ativação. Atualmente, as únicas formas de ativação compatíveis com modelos personalizados são a ativação do provedor e a ativação do consumidor (armazenando resultados na conta Snowflake do provedor ou do consumidor, respectivamente). Saiba como implementar a ativação.
Um modelo de ativação é um modelo de análise com os seguintes requisitos adicionais:
Os modelos de ativação são instruções JinjaSQL que são avaliadas em um bloco de script SQL, diferentemente dos modelos de análise, que podem ser simples instruções SELECT.
O nome do modelo de ativação deve começar com a cadeia de caracteres
activation
(exceto para modelos de ativação de provedores executados pelo consumidor). Por exemplo:activation_my_template
.O modelo de ativação deve criar uma tabela com um nome que depende do tipo de ativação que ele permite:
Ativação de provedor executada pelo provedor: o nome da tabela gerada deve ser
cleanroom.temp_result_data
.Todos os outros tipos de ativação: o nome da tabela gerada deve ser prefixado por
cleanroom.activation_data_
, por exemplo:cleanroom.activation_data_cross_activation_results
. O nome da tabela deve ser exclusivo em sua clean room.
Essa tabela gerada é uma tabela intermediária; você não deve tentar acessá-la diretamente.
O bloco de script deve terminar com uma instrução RETURN que retorna o nome da tabela gerada, menos qualquer prefixo
cleanroom.
oucleanroom.activation_data_
.Todas as colunas que estão sendo ativadas devem estar listadas na política de ativação do provedor ou consumidor que vinculou os dados e devem ter o filtro
activation_policy
aplicado a elas. Observe que uma coluna pode ser tanto uma coluna de ativação quanto uma coluna de junção.Se o modelo vai ser executado pela UI de salas limpas, você deve fornecer um formulário da Web que inclua os campos
activation_template_name
eenabled_activations
. Os modelos para uso na UI deve ter um modelo tanto de análise quanto de ativação associados.Todas as colunas calculadas devem ter aliases explícitos, em vez de nomes inferidos, porque uma tabela está sendo gerada. Ou seja:
SELECT COUNT(*), P.status from T AS P;
FAILS porque o nome da coluna COUNT é inferido.SELECT COUNT(*) AS COUNT_OF_ITEMS, P.status from T AS P;
SUCCEEDS porque ele cria explicitamente um alias para a coluna COUNT.
Aqui estão duas amostras de modelos básicos de ativação. Um é para ativação de servidor executado pelo provedor e o outro é para outros tipos de ativação. Eles diferem nas duas linhas destacadas, que contêm o nome da tabela de resultados.
-- These are the required table name strings.
BEGIN
CREATE OR REPLACE TABLE cleanroom.temp_result_data AS
SELECT COUNT(c.status) AS ITEM_COUNT, c.status, c.age_band
FROM IDENTIFIER({{ my_table[0] }}) AS c
JOIN IDENTIFIER({{ source_table[0] }}) AS p
ON {{ c_join_col | sqlsafe | activation_policy }} = {{ p_join_col | sqlsafe | activation_policy }}
GROUP BY c.status, c.age_band
ORDER BY c.age_band;
RETURN 'temp_result_data';
END;
-- analysis_results can be whatever name you want.
BEGIN
CREATE OR REPLACE TABLE cleanroom.activation_data_analysis_results AS
SELECT COUNT(c.status) AS ITEM_COUNT, c.status, c.age_band
FROM IDENTIFIER({{ my_table[0] }}) AS c
JOIN IDENTIFIER({{ source_table[0] }}) AS p
ON {{ c_join_col | sqlsafe | activation_policy }} = {{ p_join_col | sqlsafe | activation_policy }}
GROUP BY c.status, c.age_band
ORDER BY c.age_band;
RETURN 'analysis_results';
END;
Próximos passos¶
Depois que você dominar o sistema de modelos, leia os detalhes específicos para implementar uma clean room com seu tipo de modelo:
Modelos de provedor são modelos gravados pelo provedor. Esse é o caso de uso padrão.
Os modelos de consumidor são escritos pelo consumidor. Em alguns casos, o criador de sala limpa quer permitir que o consumidor crie, carregue e execute os próprios modelos na sala limpa.
Modelos de ativação criam uma tabela de resultados após uma execução bem-sucedida. Dependendo do modelo de ativação, a tabela de resultados pode ser salva na conta de provedor ou consumidor fora da clean room ou enviada a um provedor de ativação terceirizado listado no hub de ativação.
Modelos encadeados permitem que você encadeie vários modelos em que a saída de cada modelo é usada pelo próximo modelo da cadeia.