Référence d’un modèle de salle blanche personnalisé¶
À propos des modèles de clean rooms¶
Les modèles de salle blanche sont écrits en JinjaSQL. JinjaSQL est une extension du langage de modélisation Jinja qui génère une requête SQL comme sortie. Cela permet aux modèles d’utiliser des instructions logiques et la résolution des variables de runtime pour permettre à l’utilisateur de spécifier les noms des tables, les colonnes des tables et les valeurs personnalisées utilisées dans la requête au moment de l’exécution.
Snowflake fournit des modèles pré-conçus pour des cas d’utilisation courants. Cependant, la plupart des utilisateurs préfèrent créer des modèles de requêtes personnalisés pour leurs salles blanches. Des modèles personnalisés sont créés à l’aide de l’API des salles blanches, mais peuvent être exécutés soit dans du code, soit en utilisant l’UI des salles blanches.
Il existe deux types généraux de modèles :
Les Modèles d’analyse, qui correspondent à une instruction SELECT (ou un ensemble d’opérations SELECT) qui affichent les résultats à la personne qui exécute le modèle.
Les Modèles d’activation, qui sont utilisés pour activer les résultats sur un compte Snowflake ou chez un tiers, plutôt que d’afficher les résultats dans l’environnement immédiat. Un modèle d’activation est très similaire à un modèle d’analyse avec quelques exigences supplémentaires.
Dans l’UI des salles blanches, un modèle d’analyse peut être associé à un modèle d’activation pour permettre à l’appelant d’exécuter une analyse, de voir les résultats, puis d’activer les données pour lui-même ou pour un tiers. Le modèle d’activation n’a pas besoin de résoudre la même requête que le modèle d’analyse associé.
Création et exécution d’un modèle personnalisé¶
Dans une salle blanche avec les paramètres par défaut, le fournisseur ajoute un modèle à une salle blanche et le consommateur exécute le modèle, comme décrit dans la documentation sur l’utilisation des modèles personnalisés.
Un exemple rapide¶
Voici un exemple simple de SQL qui joint une table de fournisseurs et une table de consommateurs par courriel et affiche le nombre de chevauchements par ville :
SELECT COUNT(*), city FROM consumer_table
INNER consumer_table
ON consumer_table.hashed_email = provider_table.hashed_email
GROUP BY city;
Voici à quoi ressemblerait cette requête sous la forme d’un modèle JinjaSQL qui permet à l’appelant de choisir les colonnes JOIN et GROUP BY, ainsi que les tables utilisées :
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 }});
Notes sur le modèle :
Les valeurs contenues dans {{ double bracket pairs }} sont des variables personnalisées.
group_by_colles valeurs demy_table,source_table,consumer_join_col,provider_join_coletgroup_by_colsont toutes des variables personnalisées renseignées par l’appelant.source_tableetmy_tablesont des variables de type tableau de chaînes définies par Snowflake et renseignées par l’appelant. Les membres du tableau sont les noms pleinement qualifiés des tables de fournisseurs et de consommateurs liées à la clean room. L’appelant spécifie les tables à inclure dans chaque tableau.Les tables de fournisseur doivent avoir un alias en minuscules
pet les tables de consommateurs en minusculescdans un modèle. Si vous avez plusieurs tables, vous pouvez les indexer commep1,p2,c1,c2, et ainsi de suite.IDENTIFIER est nécessaire pour tous les noms de colonnes et de tables, car les variables dans {{ double brackets }} évaluent des chaînes littérales, qui ne sont pas des identificateurs valides.
Les filtres JinjaSQL peuvent être appliqués aux variables pour appliquer n’importe quelle politique de jointure ou de colonne définie de chaque côté. Snowflake implémente des filtres personnalisés
join_policyetcolumn_policy, qui vérifient si une colonne est conforme aux politiques de jointure ou de colonne dans la salle blanche respectivement, et font échouer la requête si ce n’est pas le cas. Un filtre est appliqué à un nom de colonne comme{{ column_name | filter_name }}.
Tous ces points seront examinés en détail ultérieurement.
Voici comment un consommateur pourrait exécuter ce modèle dans le code. Notez que les noms de colonnes sont qualifiés par les alias de table déclarés dans le modèle.
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'
)
);
Afin d’utiliser ce modèle dans l’UI des salles blanches, le fournisseur doit créer un formulaire UI personnalisé pour le modèle. Le formulaire d’UI comporte des éléments de formulaire nommés qui correspondent aux noms des variables du modèle, et les valeurs fournies dans le formulaire sont transmises dans le modèle.
Développement d’un modèle personnalisé¶
Les modèles de salle blanche sont des modèles JinjaSQL. Pour créer un modèle, vous devez connaître les rubriques suivantes :
L’extension JinjaSQL de Jinja.
Utilisez la procédure consumer.get_jinja_sql pour tester la validité de votre modèle, puis exécutez le modèle rendu pour voir s’il produit les résultats que vous attendez. Notez que cette procédure ne prend pas en charge les extensions de filtre de salle blanche, telles que join_policy, vous devez donc tester votre modèle sans ces filtres et les ajouter plus tard.
Exemple :
-- 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']
));
Le modèle rendu ressemble à ceci :
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;
Essayez d’exécuter l’instruction SQL ci-dessus dans votre environnement pour voir si cela fonctionne et permet d’obtenir les résultats attendus.
Testez ensuite votre modèle sans clause 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']
));
Modèle renvoyé :
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
;
Ajoutez les filtres de la politique au modèle, et ajoutez le modèle à votre salle blanche :
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 %};
$$,
);
Protection des données¶
Les modèles ne peuvent accéder qu’aux ensembles de données liés à la clean room par le fournisseur et le consommateur.
Le fournisseur et le consommateur peuvent tous deux définir des politiques de jointure, de colonne et d’activation sur leurs données pour protéger les colonnes pouvant être jointes, projetées ou activées ; cependant, le modèle doit inclure le filtre de politique JinjaSQL approprié sur une colonne pour que la politique soit appliquée.
Syntaxe des modèles personnalisés¶
Snowflake Data Clean Rooms prend en charge la version 3 du site JinjaSQL, avec quelques extensions comme indiqué.
Cette section comprend les rubriques suivantes :
Règles de dénomination des modèles¶
Lors de la création d’un modèle, les noms doivent être tous des lettres minuscules, des chiffres, des espaces ou des traits de soulignement. Les modèles d’activation (à l’exception de l’activation du fournisseur exécutée par le consommateur) doivent avoir un nom commençant par activation_. Les noms des modèles sont attribués lorsque vous appelez provider.add_custom_sql_template ou consumer.create_template_request.
Exemples de noms valides :
my_templateactivation_template_1
Exemple de noms non valides :
my template- Espaces non autorisésMy_Template- Seuls les modèles en minuscules sont autorisés
Variables de modèles¶
Les appelants d’un modèle peuvent transmettre des valeurs aux variables du modèle. La syntaxe JinjaSQL permet la liaison de variables pour n’importe quel nom de variable dans {{ double_brackets }}, mais Snowflake réserve quelques noms de variables que vous ne devez pas remplacer, comme décrit ci-dessous.
Prudence
Toutes les variables, qu’elles soient définies par Snowflake ou personnalisées, sont renseignées par l’utilisateur et doivent être traitées avec la prudence qui s’impose. Les modèles de Snowflake Data Clean Rooms doivent se résoudre en une seule instruction SELECT, mais vous devez toujours vous rappeler que toutes les variables sont transmises par l’appelant.
Variables définies par Snowflake¶
Tous les modèles de clean room ont accès aux variables globales suivantes, définies par Snowflake, mais transmises par l’appelant :
source_table:Un tableau de chaînes de caractères indexé à partir de zéro, listant les tables et vues liées au fournisseur dans la clean room, utilisables par le modèle. Les noms de tables sont entièrement qualifiés, par exemple :
my_db.my_sch.provider_customersExemple :
SELECT col1 FROM IDENTIFIER({{ source_table[0] }}) AS p;my_table:Tableau (string) basé sur zéro des tables et vues consommateurs de la clean room qui peuvent être utilisées par le modèle. Les noms de tables sont entièrement qualifiés, par exemple :
my_db.my_sch.consumer_customersExemple :
SELECT col1 FROM IDENTIFIER({{ my_table[0] }}) AS c;privacy:Un ensemble de valeurs liées à la confidentialité associées aux utilisateurs et aux modèles. Voir la liste des champs enfants disponibles. Ces valeurs peuvent être définies explicitement pour l’utilisateur, mais vous pouvez définir des valeurs par défaut dans le modèle. Accédez aux champs enfants directement dans votre modèle, par exemple
privacy.threshold.Exemple : Voici un exemple de modèle qui utilise
threshold_valuepour imposer une taille de groupe minimale dans une clause d’agrégation.SELECT IFF(a.overlap > ( {{ privacy.threshold_value | default(2) | sqlsafe }} ), a.overlap,1 ) AS overlap, c.total_count AS total_count ...
measure_column:dimensions:where_clause:Variables globales de salle blanche héritées. Il n’est plus recommandé de les utiliser, mais elles sont toujours définies et apparaissent dans certains modèles et documents hérités. Vous ne devez donc pas attribuer des alias aux tables ou aux colonnes qui utilisent l’un de ces noms afin d’éviter les conflits de noms.
Si votre modèle utilise
measure_columnoudimensions, la politique de colonne est vérifiée par rapport à toutes les colonnes transmises dans ces variables.Si votre modèle utilise une
where_clausequi a une condition de jointure (par exemple,table1.column1 = table2.column2), la politique de jointure est vérifiée par rapport à toutes les colonnes qui y sont nommées ; sinon, la politique de colonnes est vérifiée par rapport à toutes les colonnes qui y sont nommées.
Variables personnalisées¶
Les créateurs de modèles peuvent inclure des variables arbitraires dans un modèle qui peuvent être renseignées par l’appelant. Ces variables peuvent avoir n’importe quel nom arbitraire conforme Jinja, à l’exception des variables définies par Snowflake ou des noms d’alias de table. Si vous souhaitez que votre modèle soit utilisable dans l’UI des salles blanches, vous devez également fournir un formulaire d’UI pour les utilisateurs de l’UI des salles blanches. Vous devez fournir une bonne documentation pour les variables obligatoires et facultatives aux utilisateurs de l’API.
Les variables personnalisées sont accessibles par votre modèle, comme indiqué ici pour la variable personnalisée max_income:
SELECT income FROM my_db.my_sch.customers WHERE income < {{ max_income }};
Les utilisateurs peuvent transmettre des variables à un modèle de deux manières différentes :
Dans l’UI des salles blanches, en sélectionnant ou en fournissant des valeurs via un formulaire UI créé par le développeur du modèle. Ce formulaire d’UI contient des éléments de formulaire dans lesquels l’utilisateur peut fournir des valeurs pour votre modèle. Le nom de chaque élément de formulaire est le nom d’une variable. Le modèle utilise simplement le nom de l’élément de formulaire pour accéder à la valeur. Créez le formulaire UI en utilisant provider.add_ui_form_customizations.
Dans le code, un consommateur appelle consumer.run_analysis et transmet les noms des tables sous forme de tableaux d’arguments et les variables personnalisées sous forme de paires nom-valeur dans l’argument
analysis_arguments.
Note
Si vous avez besoin d’accéder à des valeurs fournies par l’utilisateur dans un code Python personnalisé téléchargé dans la salle blanche, vous devez transmettre explicitement les valeurs des variables dans le code via des arguments de fonction Python ; les variables de modèle ne sont pas directement accessibles dans le code Python avec {{jinja variable binding syntax}}.
Résoudre correctement les variables¶
Les valeurs de chaîne passées dans le modèle se traduisent par une chaîne littérale dans le modèle final. Cela peut provoquer des erreurs d’analyse SQL ou des erreurs logiques si vous ne gérez pas les variables de liaison de manière appropriée :
SELECT {{ my_col }} FROM P;- se résout enSELECT 'my_col' from P;qui renvoie simplement la chaîne « my_col » - ce qui n’est probablement pas ce que vous voulez.SELECT age FROM {{ my_table[0] }} AS P;se résout enSELECT age FROM 'somedb.somesch.my_table' AS P;, ce qui provoque une erreur d’analyse, car une table doit être un identificateur et non une chaîne littérale.SELECT age FROM IDENTIFIER({{ my_table[0] }}) AS P {{ where_clause }};- Transmettre « WHERE age < 50 » donne comme résultatSELECT age FROM mytable AS P 'WHERE age < 50' ;, qui est une erreur d’analyse à cause de la clause WHERE de la chaîne littérale.
Par conséquent, le cas échéant, vous devez résoudre les variables. Voici comment résoudre correctement les variables dans votre modèle :
- Résolution des noms de table et de colonne
Les variables qui spécifient des noms de tables ou de colonnes doivent être converties en identificateurs dans votre modèle de l’une des deux manières suivantes :
IDENTIFIER: Par exemple :
SELECT IDENTIFIER({{ my_column }}) FROM P ;sqlsafe: Ce filtre JinjaSQL résout les chaînes d’identificateurs en texte SQL. Une instruction équivalente au point précédent est
SELECT {{ my_column | sqlsafe }} FROM P ;
Votre utilisation particulière dicte quand utiliser IDENTIFIER ou
sqlsafe. Par exemple,c.{{ my_column | sqlsafe }}ne peut pas être facilement réécrit en utilisant IDENTIFIER.- Résolution du SQL dynamique
Lorsque vous avez une variable chaîne qui doit être utilisée comme littéral SQL, telle qu’une clause WHERE, utilisez le filtre
sqlsafedans votre modèle. Par exemple :SELECT age FROM IDENTIFIER({{ my_table[0] }}) AS C WHERE {{ where_clause }};
Si un utilisateur introduit « age < 50 » dans
where_clause, la requête aboutira àSELECT age FROM sometable AS C WHERE 'age < 50';, qui n’est pas valide SQL en raison de la condition relative à la chaîne littérale WHERE. Dans ce casse-tête, vous devez utiliser le filtresqlsafe:SELECT age FROM IDENTIFIER( {{ my_table[0] }} ) as c {{ where_clause | sqlsafe }};
Alias de table requis¶
Au niveau supérieur de votre requête, toutes les tables ou sous-requêtes doivent avoir un alias p (pour les tables de fournisseurs) ou c (pour les tables de consommateurs) afin que Snowflake valide correctement les politiques de jointure et de colonne dans la requête. Toute colonne qui doit être vérifiée par rapport aux politiques de jointure ou de colonne doit avoir l’alias de table p ou c en minuscule. (Spécifier p ou c indique au back-end s’il faut valider une colonne par rapport au fournisseur ou à la politique du consommateur).
Si vous utilisez plusieurs tables de fournisseurs ou de consommateurs dans votre requête, ajoutez un suffixe numérique et séquentiel de base 1 à chaque alias de table après le premier. Ainsi : p, p1, p2, et ainsi de suite pour les première, deuxième et troisième tables de fournisseurs, et c, c1, c2, et ainsi de suite pour les première, deuxième et troisième tables de consommateurs. L’index p ou c doit être séquentiel sans espaces (c’est-à-dire avec des alias p, p1 et p2, pas p, p2, et p4).
Exemple
SELECT p.col1 FROM IDENTIFIER({{ source_table[0] }}) AS P
UNION
SELECT p1.col1 FROM IDENTIFIER({{ source_table[1] }}) AS P1;
Filtres de modèles de salle blanche personnalisés¶
Snowflake prend en charge tous les filtres standard Jinja et la plupart des filtres JinjaSQL standard, ainsi que quelques extensions :
join_policy: Réussit si la colonne est dans la politique de jointure du propriétaire des données ; échoue dans le cas contraire.column_policy: Réussit si la colonne figure dans la politique de colonne du propriétaire des données ; échoue dans le cas contraire.activation_policy: Réussit si la colonne se trouve dans la politique d’activation du propriétaire des données ; échoue dans le cas contraire.join_and_column_policy: Réussit si la colonne figure dans la politique de jointure ou de colonne du propriétaire des données ; échoue dans le cas contraire.Le filtre
identifierJinjaSQL n’est pas supporté par les modèles Snowflake.
Astuce
L’évaluation des expressions JinjaSQL s’effectue de gauche à droite :
{{ my_col | column_policy }}Correct{{ my_col | sqlsafe | column_policy }}Correct{{ column_policy | my_col }}Incorrect{{ my_col | column_policy | sqlsafe }}Incorrect :column_policysera vérifié par rapport à la valeur demy_colen tant que chaîne, ce qui est une erreur.
Appliquer les politiques des clean rooms¶
Les salles blanches ne vérifient pas automatiquement les politiques de salle blanche par rapport aux colonnes utilisées dans un modèle. Si vous voulez appliquer une politique à une colonne :
Vous devez appliquer le Filtre de politique approprié à cette colonne du modèle. Par exemple :
JOIN IDENTIFIER({{ source_table[0] }}) AS p
ON IDENTIFIER({{ c_join_col | join_policy }}) = IDENTIFIER({{ p_join_col | join_policy }})
Vous devez ajouter à la table un alias p ou c en minuscule. Voir Alias de table requis.
Les politiques ne sont vérifiées qu’en fonction des colonnes appartenant à d’autres collaborateurs. Les politiques ne sont pas vérifiées pour vos propres données.
Notez que les noms des colonnes ne peuvent pas être ambigus lors du test des politiques. Ainsi, si vous avez des colonnes portant le même nom dans deux tables, vous devez qualifier le nom de la colonne afin de tester la politique par rapport à cette colonne.
Exécution de code Python personnalisé¶
Les modèles peuvent exécuter le code Python téléchargé dans la clean room. Le modèle peut appeler une fonction Python qui accepte les valeurs d’une ligne de données et renvoie des valeurs à utiliser ou à projeter dans la requête.
Lorsqu’un fournisseur télécharge du code Python personnalisé dans une salle blanche, le modèle appelle des fonctions Python avec la syntaxe
cleanroom.function_name. Plus de détails ici.Lorsqu’un consommateur télécharge du code Python personnalisé dans une salle blanche, le modèle appelle la fonction avec la valeur
function_namede base transmise àconsumer.generate_python_request_template(non limité àcleanroomcomme l’est le code du fournisseur). Plus de détails ici.
Exemple de code fournisseur :
-- 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);
$$
);
Remarques relatives à la sécurité¶
Un modèle de salle blanche n’est pas exécuté avec l’identité de l’utilisateur actuel.
L’utilisateur n’a pas d’accès direct aux données de la clean room ; tout l’accès se fait par l’application native via les résultats du modèle.
Appliquez un filtre de politiques chaque fois qu’une colonne est utilisée dans votre modèle pour garantir que vos politiques, et les politiques de tous les collaborateurs, sont respectées.
Entourez les variables fournies par l’utilisateur de IDENTIFIER() lorsque cela est possible pour renforcer vos modèles contre les attaques par injection de SQL.
Modèles d’activation¶
Un modèle peut également être utilisé pour enregistrer les résultats de la requête dans une table située à l’extérieur de la clean room ; il s’agit de l’activation. Actuellement, les seules formes d’activation supportées pour les modèles personnalisés sont l’activation du fournisseur et l’activation du consommateur (stockage des résultats sur le compte Snowflake du fournisseur ou du consommateur, respectivement). Découvrez comment mettre en œuvre l’activation.
Un modèle d’activation est un modèle d’analyse auquel s’ajoutent les exigences suivantes :
Les modèles d’activation sont des instructions JinjaSQL qui évaluent un bloc de script SQL, contrairement aux modèles d’analyse, qui peuvent être de simples instructions SELECT.
Les modèles d’activation créent une table dans la salle blanche pour stocker les résultats, et renvoient le nom de la table (ou un fragment du nom) à l’appelant du modèle.
Le bloc de script doit se terminer par une instruction RETURN qui renvoie le nom de la table générée, sans le préfixe
cleanroom.oucleanroom.activation_data_.Le nom du modèle, le nom de la table interne créée par le modèle et le nom de la table renvoyée par le modèle suivent ces modèles :
Type d’activation |
Préfixe de nom du modèle |
Préfixe de nom de table |
Nom de la table renvoyée |
|---|---|---|---|
Consommateur exécuté par le consommateur |
|
|
Nom de table sans préfixe |
Fournisseur exécuté par le consommateur |
Aucun préfixe requis |
|
Nom de table sans préfixe |
Fournisseur exécuté par le fournisseur |
|
|
|
Toute colonne activée doit être listée dans la politique d’activation du fournisseur ou du consommateur qui a lié les données, et le filtre
activation_policydoit lui être appliqué. Notez qu’une colonne peut être à la fois une colonne d’activation et une colonne de jointure.Si le modèle doit être exécuté à partir de l’UI des salles blanches , vous devriez fournir un formulaire Web qui comprend les champs
activation_template_nameetenabled_activations. Les modèles à utiliser dans l’UI doivent disposer à la fois d’un modèle d’analyse et d’un modèle d’activation associé.Toutes les colonnes calculées doivent être explicitement aliasées, plutôt que d’avoir des noms déduits, parce qu’une table est générée. C’est-à-dire :
SELECT COUNT(*), p.status from T AS P;FAILS, parce que le nom de la colonne COUNT est déduit.SELECT COUNT(*) AS COUNT_OF_ITEMS, p.status from T AS P;SUCCEEDS, car il ajoute explicitement un alias à la colonne COUNT.
Voici deux échantillons de modèles d’activation de base. L’une concerne l’activation du serveur géré par le fournisseur, l’autre les autres types d’activation. Elles se distinguent par les deux lignes surlignées, qui contiennent le nom de la table de résultats.
La table doit être nommée 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;
Le nom de la table a besoin d’un préfixe cleanroom.activation_data :
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;
Prochaines étapes¶
Une fois que vous aurez maîtrisé le système de création de modèles, lisez les détails relatifs à la mise en place d’une clean room avec votre type de modèle :
Les modèles du fournisseur sont des modèles rédigés par le fournisseur. Il s’agit du cas d’utilisation par défaut.
Les modèles du consommateur sont des modèles créés par le consommateur. Dans certains cas, un créateur de salle blanche souhaite permettre au consommateur de créer, de télécharger et d’exécuter ses propres modèles dans la salle blanche.
Les modèles d’activation créent une table de résultats après une exécution réussie. En fonction du modèle d’activation, la table des résultats peut être soit enregistrée sur le compte du fournisseur ou du consommateur en dehors de la clean room, soit envoyée à un fournisseur d’activation tiers répertorié dans le hub d’activation.
Les modèles enchaînés vous permettent d’enchaîner plusieurs modèles où la sortie de chaque modèle est utilisée par le modèle suivant dans la chaîne.