Referência de modelo de sala limpa personalizado

Sobre os modelos de clean rooms

Os modelos de sala limpa são escritos em JinjaSQL. JinjaSQL é uma extensão da linguagem de criação de modelos Jinja que gera uma consulta SQL como saída. Isso permite que os modelos usem instruções lógicas e resolução de variáveis de tempo de execução para permitir que o usuário especifique nomes de tabelas, colunas de tabela e valores personalizados usados na consulta em tempo de execução.

O Snowflake oferece alguns modelos pré-configurados para casos de uso comuns. No entanto, a maioria dos usuários prefere criar modelos de consulta personalizados para as salas limpas. Os modelos personalizados são criados usando a API de salas limpas, mas podem ser executados no código ou usando a UI de salas limpas.

Há dois tipos gerais de modelos:

  • Modelos de análise, que são avaliados como uma instrução SELECT (ou um conjunto de operações SELECT) e mostram os resultados ao executor do modelo.

  • Modelos de ativação, que são usados para ativar os resultados para uma conta Snowflake ou um terceiro, em vez de mostrar os resultados no ambiente imediato. O modelo de ativação é muito semelhante ao de análise, com alguns requisitos extras.

    Na UI de salas limpas, um modelo de análise pode ser associado a um modelo de ativação para permitir que o autor da chamada execute uma análise, veja os resultados e ative 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 sala limpa com configurações padrão, o provedor adiciona um modelo a uma sala limpa, e o consumidor executa o modelo conforme descrito na documentação de uso de modelo personalizado.

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 consumer_table
  ON consumer_table.hashed_email = provider_table.hashed_email
  GROUP BY city;
Copy

Veja abaixo a aparência da consulta como um modelo JinjaSQL que permite ao autor da chamada escolher as colunas JOIN e GROUP BY e as tabelas utilizadas:

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 }});
Copy

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 e group_by_col são variáveis personalizadas preenchidas pelo chamador.

  • source_table e my_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 do provedor devem usar os alias em um modelo como p em letras minúsculas, e as tabelas do consumidor como c em letras minúsculas. Se você tem várias tabelas, pode indexá-las como p1, 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.

  • Os filtros do JinjaSQL podem ser aplicados a variáveis para impor políticas de junção ou de coluna definidas por qualquer um dos lados. O Snowflake implementa os filtros personalizados join_policy e column_policy, que verificam se uma coluna cumpre respectivamente as políticas de junção ou de coluna na sala limpa. Se não cumprir, haverá falha na consulta. 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'
  )
);
Copy

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:

Use o procedimento consumer.get_jinja_sql para testar a validade do seu modelo e, em seguida, execute o modelo renderizado para verificar se ele produz os resultados esperados. 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 IDENTIFIER({{ provider_join_col }}) = IDENTIFIER({{ consumer_join_col }})
  {% 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']
));
Copy

O modelo renderizado tem esta aparência:

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;

Tente executar a instrução SQL acima em seu ambiente para ver se ela funciona e retorna os resultados esperados.

Em seguida, teste seu modelo sem uma cláusula WHERE:

-- Render the template 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']
));
Copy

Modelo renderizado:

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
  ;

Adicione os filtros de política ao modelo e o modelo à sua sala limpa:

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 %};
    $$,
);
Copy

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 de política 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.

Esta seção inclui os seguintes tópicos:

Regras de nomeação de modelos

Ao criar um modelo, todos os nomes devem ser letras minúsculas, números, espaços ou sublinhados. Os modelos de ativação (exceto para ativação de provedor executada pelo consumidor) devem ter um nome que comece com activation_. Os nomes dos 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 permitidos

  • My_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. Consulte a lista de campos filho disponíveis. Esses valores podem ser definidos explicitamente para o usuário, mas talvez você queira definir valores padrão no modelo. Acesse os campos filho 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
  ...
Copy
measure_column:

dimensions:

where_clause:

Variáveis globais de sala limpa legadas. Elas não são mais recomendadas para uso, mas ainda são definidas e aparecem em alguns modelos e documentações legados, portanto você não deve definir alias de tabelas ou colunas usando um desses nomes para evitar conflitos de nomenclatura.

Se seu modelo usa measure_column ou dimensions, a política de coluna é verificada em relação às colunas passadas para essas variáveis.

Se seu modelo usa uma where_clause que tem uma condição de junção (por exemplo, table1.column1 = table2.column2), a política de junção é verificada em relação às colunas nomeadas nessa cláusula; caso contrário, a política de coluna será verificada em relação às colunas nomeadas nessa cláusula.

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 }};
Copy

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 valores fornecidos pelo usuário em um código Python personalizado carregado na sala limpa, você deverá passar explicitamente os valores das variáveis para o código por meio de argumentos de função Python. As variáveis de modelo não são diretamente acessíveis 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 como SELECT 'my_col' from P;, que apenas retorna a cadeia de caracteres «my_col», e provavelmente não é o que você quer.

  • SELECT age FROM {{ my_table[0] }} AS P;: é resolvida como SELECT 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 como SELECT 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:

Resolução de nomes de tabela e coluna

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.

Resolução de 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 }};
Copy

Se um usuário inserir “age < 50” em where_clause, a consulta será resolvida em SELECT 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 filtro sqlsafe:

SELECT age FROM IDENTIFIER( {{ my_table[0] }} ) as c {{ where_clause | sqlsafe }};
Copy

Aliases de tabela necessários

No nível superior da sua consulta, todas as tabelas ou subconsultas devem ter alias definidos como p (para tabelas de provedor) ou c (para tabelas de consumidor), de modo que o Snowflake valide as políticas de junção e de coluna corretamente na consulta. Uma coluna que deve ser verificada em relação às políticas de junção ou de coluna precisa ser qualificada com os alias de tabela p ou c em letras minúsculas. Especificar p ou c instrui o back-end se é para validar uma coluna em relação à política de provedor ou de consumidor, respectivamente.

Se você usa várias tabelas de provedor ou de consumidor em sua consulta, adicione um sufixo numérico e 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 provedor, e c, c1, c2, e assim por diante, para a primeira, segunda e terceira tabelas de consumidor. O índice p ou c deve ser sequencial, sem intervalos (ou seja, crie os alias p, p1 e p2, e não p, p2 e p4).

Exemplo

SELECT p.col1 FROM IDENTIFIER({{ source_table[0] }}) AS P
UNION
SELECT p1.col1 FROM IDENTIFIER({{ source_table[1] }}) AS P1;
Copy

Filtros de modelo de sala limpa personalizados

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: com sucesso se a coluna estiver na política de junção do proprietário dos dados; caso contrário, com falha.

  • column_policy: com sucesso se a coluna estiver na política de coluna do proprietário dos dados; caso contrário, com falha.

  • activation_policy: com sucesso se a coluna estiver na política de ativação do proprietário dos dados; caso contrário, com falha.

  • join_and_column_policy: com sucesso se a coluna estiver na política de junção ou de coluna do proprietário dos dados; caso contrário, com falha.

  • O filtro JinjaSQL identifier não é compatível com os modelos Snowflake.

Dica

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 valor my_col como cadeia de caracteres, o que é um erro.

Aplicação de políticas de clean room

As salas limpas não verificam automaticamente as políticas de sala limpa em relação às colunas usadas em um modelo. Se você quiser aplicar uma política a uma coluna:

JOIN IDENTIFIER({{ source_table[0] }}) AS p
  ON IDENTIFIER({{ c_join_col | join_policy }}) = IDENTIFIER({{ p_join_col | join_policy }})
Copy

As políticas são verificadas somente em relação às colunas de propriedade de outros colaboradores. Elas não são verificadas em seus próprios dados.

Observe que os nomes das colunas não podem ser ambíguos ao testar as políticas. Portanto, se você tiver colunas com o mesmo nome em duas tabelas, deverá qualificar o nome da coluna para testar a política nessa 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 para consumer.generate_python_request_template (sem escopo definido para cleanroom 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);
$$
);
Copy

Considerações de segurança

Um modelo de sala limpa 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 em seu modelo para garantir que suas políticas e as políticas de todos os colaboradores sejam respeitadas.

Coloque as variáveis fornecidas pelo usuário entre IDENTIFIER() quando possível para proteger seus modelos contra ataques de injeção de SQL.

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.

  • Os modelos de ativação criam uma tabela na sala limpa para armazenar os resultados e retornam o nome da tabela (ou um fragmento do nome) ao autor da chamada do modelo.

  • O bloco de script deve terminar com uma instrução RETURN que retorna o nome da tabela gerada, menos qualquer prefixo cleanroom. ou cleanroom.activation_data_.

  • O nome do modelo, o nome da tabela interna que o modelo cria e o nome da tabela que o modelo retorna seguem estes padrões:

Tipo de ativação

Prefixo do nome do modelo

Prefixo do nome da tabela

Nome da tabela retornado

Consumidor executado pelo consumidor

activation_

cleanroom.activation_data_*

Nome da tabela sem prefixo

Provedor executado pelo consumidor

Não é necessário um prefixo

cleanroom.activation_data_*

Nome da tabela sem prefixo

Provedor executado pelo provedor

activation_

cleanroom.temp_result_data é o nome completo da tabela.

temp_result_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 e enabled_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 define o alias da coluna COUNT explicitamente.

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.

A tabela deve ser chamada cleanroom.temp_result_data:

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;
Copy

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.

Mais informações