Kundenspezifische Funktionen in einem Clean Room hochladen und ausführen

Übersicht

Sie können kundenspezifische Python UDFs und UDTFs in Ihren Clean Room hochladen und von Ihren Vorlagen aus ausführen, um komplexe Datenaktionen durchzuführen. Zu diesen Aktionen gehören maschinelles Lernen oder die kundenspezifische Datenmanipulation innerhalb einer Abfrage, als Teil eines Einzelschritts oder eines mehrstufigen Workflows. Python ist die einzige Codierungssprache, die kundenspezifische UDFs unterstützt.

Ihr hochgeladener Code kann Pakete aus einem genehmigten Bundle von Python-Paketen und der Snowpark-API importieren und verwenden.

Sowohl Anbieter als auch Verbraucher können kundenspezifischen Python-Code in einen Clean Room hochladen, obwohl der Prozess für Anbieter und Verbraucher unterschiedlich ist.

Unter diesem Thema wird gezeigt, wie Sie kundenspezifische Python-UDFs und -UDTFs als Anbietende oder Verbrauchende hochladen und ausführen.

Tipp

Hintergrundinformationen darüber, wie Sie Ihre eigenen Python-UDFs in einem Clean Room entwickeln, finden Sie unter folgenden Themen:

Ausführen von hochgeladenem Code

Jedes Bundle mit hochgeladenem Code kann mehrere Funktionen definieren, die sich gegenseitig aufrufen, aber ein Bundle stellt nur eine Handler-Funktion zur Verfügung. Diese Handler-Funktion kann von Vorlagen aufgerufen werden, die von jedem erstellt oder ausgeführt werden, der den Clean Room nutzt. Wenn der Code interne Tabellen erstellt, kann auf diese Tabellen zugegriffen werden, wie unter Abläufe mit mehreren Schritten gestalten beschrieben.

Wenn Sie z. B. eine Funktion mit dem Namen simple_add hochgeladen haben, die zwei numerische Parameter enthält, können Sie sie von einer Vorlage aus wie hier gezeigt aufrufen. Die Funktion wird immer mit dem Geltungsbereich``cleanroom`` referenziert. Eine Vorlage könnte zum Beispiel wie folgt simple_add aufrufen:

SELECT cleanroom.simple_add({{ price | sqlsafe | int }}, {{ tax | sqlsafe | int }}) ...
Copy

Tipp

Wenn die Anbietenden den oben genannten Code ausführen möchten, müssen sie für alle SELECT-Spalten, die eine Aggregat- oder kundenspezifische Funktion verwenden, einen Alias verwenden, da im Hintergrund eine Ergebnistabelle generiert wird:

SELECT
  cleanroom.simple_add(
    {{ price | sqlsafe | int }}, {{ tax | sqlsafe | int }}
    ) AS TOTAL_ITEM_COST
...
Copy

Sie können mehrere Funktionen in ein einziges Paket hochladen, und Funktionen innerhalb eines einzelnen Pakets können sich gegenseitig aufrufen, aber Funktionen können keine Funktionen innerhalb anderer Pakete aufrufen. (Sie können jedoch die Handler-Funktionen aufrufen.) Beispiel:

Clean Room mit zwei hochgeladenen Python-Paketen

Paket 1

Paket 2

  • Handler-Funktion A

  • Hilfsfunktion A1

  • Hilfsfunktion A2

  • Handler-Funktion B

  • Hilfsfunktion B1

  • Hilfsfunktion B2

Anmerkungen:

  • Code, der von beiden Seiten (Anbietende und Verbrauchende) hochgeladen wird, kann von beiden Seiten ausgeführt werden.

  • Eine Vorlage kann die Funktion A oder B aufrufen, aber nicht A1, A2, B1, B2.

  • Funktion A kann Funktion B aufrufen und umgekehrt.

  • Funktion A kann nicht B1 oder B2 aufrufen, und Funktion B kann nicht A1 oder A2 aufrufen.

  • A1 kann A2 aufrufen und umgekehrt. A1 und A2 können B aufrufen. A1 und A2 können nicht B1 oder B2 aufrufen.

  • B1 kann B2 aufrufen und umgekehrt. B1 und B2 können A aufrufen. B1 und B2 können nicht A1 oder A2 aufrufen.

Aktualisieren oder Löschen von kundenspezifischen Funktionen

Sie können eine bestehende Funktion oder Vorlage, die Sie hochgeladen haben, hochladen oder überschreiben, aber Sie können eine bestehende Funktion oder Vorlage nicht löschen. Die einzige Möglichkeit, eine Funktion zu „entfernen“, besteht darin, eine Dummy-Funktion mit genau demselben Namen und einer immer erfolgreichen Signatur zu erstellen.

Wenn Sie eine Funktion mit genau derselben Signatur hochladen, wie die zuvor hochgeladene Funktion, wird die vorhandene Funktion überschrieben. Die Signatur steht für den Funktionsnamen des externen Handlers, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, sowie für die Datentypen aller Parameter in der gleichen Reihenfolge. Parameternamen spielen keine Rolle. Sie können eine Funktion, die von einem anderen Konto hochgeladen wurde, nicht überschreiben.

Da die Signatur beim Aktualisieren einer Funktion übereinstimmen muss, können Sie die Signatur einer vorhandenen Funktion nicht ändern. Wenn Sie die Funktion foo(name VARIANT age INTEGER) und dann die Funktion foo(name VARIANT age FLOAT) hochladen, wird dem Clean Room zusätzlich zur ersten Funktion die zweite Funktion hinzugefügt, da sich die Argumenttypen unterscheiden.

Vom Anbieter übermittelter Code

Vom Anbieter übermittelte Funktionen können als Inline-Code oder aus einem Snowflake-Stagingbereich hochgeladen werden. Beide Techniken werden hier vorgestellt.

Ihr hochgeladener Code kann Pakete aus einem genehmigten Satz von Python-Paketen hochladen und nativ importieren. Wenn Sie ein nicht standardmäßiges Paket benötigen, müssen Sie Snowpark Container Services in einem Clean Room verwenden, um Ihren Code zu hosten.

Sie können den hochgeladenen Anbietercode nicht einsehen, auch nicht Ihren eigenen Code. Stellen Sie also sicher, dass Sie eine Kopie von genau dem beilegen, was Sie in einen Clean Room hochladen.

Tipp

Nach der Aktualisierung des vom Anbieter geschriebenen Codes sollten Sie die Standard-Release-Richtlinie aktualisieren und dann provider.create_or_update_cleanroom_listing aufrufen, um die Änderungen an die Verbraucher weiterzugeben. Wenn Sie provider.create_or_update_cleanroom_listing nicht aufrufen, wird Ihre Standardversion für Verbraucher, die derzeit den Clean Room nutzen, nicht aktualisiert.

Hier ist eine allgemeine Ansicht, wie ein Anbieter Code zu einem Clean Room hinzufügt:

  1. Der Anbieter erstellt und konfiguriert den Clean Room auf normale Weise.

  2. Der Anbieter lädt den Code hoch, indem er``provider.load_python_into_cleanroom`` aufruft. Sie können Ihren Code entweder inline direkt innerhalb dieses Prozesses hochladen oder eine Codedatei in einen Stagingbereich hochladen. Geben Sie anschließend den Stagingbereich für dieses Prozess an.

    Obwohl Ihr Code mehrere Funktionen enthalten kann, wird für jeden Upload nur ein Handler angezeigt. Um mehrere Funktionen in Vorlagen bereitzustellen, laden Sie jeden Handler hoch, indem Sie provider.load_python_into_cleanroom aufrufen.

  3. Nach jedem erfolgreichen Hochladen des Codes wird eine neue Patchversion des Clean Rooms generiert. Sie müssen dann die Standardversion durch Aufruf von provider.set_default_release_directive auf die neue Patchnummer aktualisieren. Wenn der Clean Room extern zugänglich ist, werden vor der Installation Ihres Codes Sicherheitsprüfungen durchgeführt, und Sie müssen provider.view_cleanroom_scan_status aufrufen, um zu bestätigen, dass die Sicherheitsprüfungen bestanden wurden, bevor die Standardversion aktualisiert wird.

    • Wenn Sie mehrere Funktionen in einem einzigen Patch hochladen möchten, können Sie Ihren Code in einem Massen-Upload hochladen. Massen-Uploads können jedoch das Debuggen erschweren, wenn der Upload ein Problem mit dem Sicherheitsscan verursacht, da die für das Problem verantwortliche Datei nicht in der Fehlerantwort angegeben ist.

  4. Sie erstellen eine kundenspezifische Vorlage, die Ihren Code aufruft und laden diese hoch. Die Vorlage muss die Handler-Funktion über den cleanroom-Bereich aufrufen: cleanroom.my_function(...).

  5. Der Verbraucher führt Ihre Vorlage auf die gleiche Weise aus wie jede andere Vorlage.

    Tipp

    Wenn der Verbraucher bei der Installation eines Clean Rooms mit kundenspezifischem Code auf einen Fehler stößt, kann dies auf einen Syntaxfehler im Code hinweisen.

Codebeispiele, die diesen Ablauf demonstrieren, finden Sie im:ref:Abschnitt zu vom Anbieter geschriebenen Codebeispielen <label-dcr_provider_written_code_examples>.

Wichtige Hinweise zur Versionierung:

Jedes Mal, wenn der Anbieter eine Funktion hochlädt, erhöht er die Patchnummer (und es gibt ein Limit von 99 Patchnummern). Geben Sie daher Ihr Bestes, um Ihren Code gründlich zu testen und zu debuggen, bevor Sie ihn in den Clean Room aufnehmen, um Versionsaktualisierungen während der Entwicklung zu reduzieren.

Wenn Sie eine Patchnummer aktualisieren, müssen Kunden, die die Clean Room UI verwenden möglicherweise die Seite aktualisieren, um die Änderung zu sehen. Kunden, die die API verwenden, sollte Änderungen sofort sehen. Je nach, je nach den verfügbaren Ressourcen kann es aber zu einer Verzögerung kommen. Erfahren Sie mehr über die Versionierung von Clean Rooms.

Vom Anbieter geschriebenen Inline-Funktionen hochladen

Sie können den Code inline im``code`` Parameter provider.load_python_into_cleanroom hochladen. Hier ist ein Beispiel für das Hochladen einer einfachen Funktion inline:

CALL samooha_by_snowflake_local_db.provider.load_python_into_cleanroom(
$cleanroom_name,
'simple_add',                         -- Name used to call the UDF from a template.
['first INTEGER', 'second INTEGER'],  -- Arguments of the UDF, specified as '<variable_name> <SQL type>' pairs.
['numpy', 'pandas'],                  -- Packages imported by the UDF.
'INTEGER',                            -- SQL return type of UDF.
'add_two',                            -- Handler function in your code called when external name is called.
$$
import numpy as np   # Not used, but you can load supported packages.
import pandas as pd

def add_two(first, second):
    return first + second
$$
);
Copy

Die aufrufende Vorlage ruft diese Funktion über cleanroom.simple_add auf. Beispiele von Anbietern zeigen, wie Inline-Code hochgeladen wird.

Vom Anbieter geschriebene Funktionen aus einem Stagingbereich hochladen

Sie können Python-Dateien in einen Clean Room-Stagingbereich hochladen und auf den Stagingbereich verweisen, wenn Sie provider.load_python_into_cleanroom aufrufen. Durch das Laden von Code aus einem Stagingbereich können Sie den Code in Ihrem lokalen System in einem Editor entwickeln, Sie vermeiden Kopier-/Einfügefehler beim Inline-Laden, und Sie haben außerdem eine bessere Versionskontrolle. Beachten Sie, dass Sie mehrere Dateien mit einem einzigen Prozessaufruf hochladen können, aber für jeden Upload nur eine Handler-Funktion verfügbar ist.

Der Code wird von einem Stagingbereich in den Clean Room geladen, wenn Sie load_python_into_cleanroom aufrufen. Spätere Änderungen am Code im Stagingbereich werden nicht an den Clean Room weitergegeben.

Hochladen Ihres UDF in einen Stagingbereich:

  1. Erstellen Sie Ihre .py-Datei, und stellen Sie sie an einem Speicherort zur Verfügung, an dem Sie sie in einen Snowsight-Stagingbereich hochladen können.

  2. Um den Namen des Stagingbereichs für Ihren Clean Room zu erhalten, rufen Sie provider.get_stage_for_python_files($cleanroom_name) auf. Dieser Stagingbereich ist über den Clean Room zugänglich – Sie können keinen beliebigen Stagingbereich verwenden, den Sie erstellen.

  3. Laden Sie die .py-Datei in den Stagingbereich Ihres Clean Rooms hoch. Es gibt mehrere Möglichkeiten, dies zu tun, einschließlich der Verwendung der CLI, von Snowsight oder sprachspezifischer Treiber.

  4. Rufen Sie provider.load_python_into_cleanroom mit dem Stagingbereich, dem Handler, dem externen Namen, Argumenten und dem Rückgabetyp auf. Vorlagen in Ihrem Clean Room können jetzt die Funktion aufrufen.

Der folgende Beispielcode zeigt, wie Sie Code aus einem Stagingbereich in einen Clean Room laden.

-- Save the following code as reverser.py:
--import numpy as np
--def main(some_string):
--  '''Return the reverse of a string plus a random number 1-10'''
--  return some_string[::-1] + str(np.random.randint(1,10))

-- Get the stage for your clean room.
CALL samooha_by_snowflake_local_db.provider.get_stage_for_python_files($cleanroom_name);

-- Save the file to the stage. Here is how to do it by using the Snowflake CLI
PUT file://~/reverser.py <STAGE_NAME> overwrite=True auto_compress=False;

-- Load the code from the stage into the clean room.
CALL samooha_by_snowflake_local_db.provider.load_python_into_cleanroom(
    $cleanroom_name,
    'reverse', -- Name used to call the function
    ['some_string  STRING'], -- Arguments and SQL types
    ['numpy'],               -- Any required packages
    ['/reverser.py'],        -- Relative path to file on stage
    'STRING',                -- Return type
    'reverser.main'          -- <FILE_NAME>.<FUNCTION_NAME>
);

-- Uploading code, even from a stage, increases the patch number.
CALL samooha_by_snowflake_local_db.provider.set_default_release_directive(
  $cleanroom_name, 'V1_0', <NEW_PATCH_NUMBER>);

-- Upload a template that calls the function.
CALL samooha_by_snowflake_local_db.provider.add_custom_sql_template(
    $cleanroom_name,
    $udf_template_name,
    $$
    SELECT
      p.status,
      cleanroom.reverse(p.status)
    FROM SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS AS p
    LIMIT 100;
    $$
);

-- Switch to the consumer account and run the template to see the results.
Copy

Beispiele von Anbietern zeigen das Hochladen von Code aus einem Stagingbereich.

Problembehandlung bei Syntax-Fehlern oder Scan-Fehlern im hochgeladenen Code

Wenn Sie eine Funktion hochladen, die aufgrund eines Syntaxfehlers fehlschlägt, oder wenn ein Sicherheitsscan fehlschlägt, kann ein nicht veröffentlichbarer Patch generiert werden. Daher sollten Sie Ihren Code vor dem Hochladen gründlich testen, damit er keine Syntaxfehler enthält.

Sie können die Liste der Pakete und deren Überprüfungsstatus anzeigen, indem Sie den folgenden SQL-Befehl ausführen, der die Clean Room-ID an der angegebenen Stelle bereitstellt:

SHOW VERSIONS IN APPLICATION PACKAGE samooha_cleanroom_cleanroom_id;

Sicherheitsscans

Nach jeder Aktion, die eine neue Patchversion in einem externen Clean Room erzeugt, wird ein Sicherheitsscan durchgeführt, z. B. wenn die Anbietenden Python in den Clean Room hochladen. (Der auf dieser Seite beschriebene, von Verbrauchenden übermittelte Code löst keinen Sicherheitsscan aus.) In internen Clean Rooms werden keine Sicherheitsscans durchgeführt, aber wenn Sie einen internen Clean Room in einen externen Clean Room ändern, wird ein Sicherheitsscan für diesen Patch ausgelöst. Ein Clean Room-Patch kann erst dann extern veröffentlicht werden, wenn er gescannt wurde.

Data Clean Rooms verwendet das Sicherheitsscan-Framework der Snowflake Native App. Befolgen Sie die Best Practices für die Sicherheit der Native App, um Fehler mit dem Sicherheitsscan zu vermeiden.

Sie können weitere Aktionen zur Erstellung von Patches durchführen, bevor der letzte Sicherheitsscan abgeschlossen ist. Sie müssen jedoch darauf warten, dass provider.view_cleanroom_scan_status erfolgreich beendet ist, bevor Sie die Standard Release-Richtlinie aktualisieren können. Danach können Sie die neueste Clean Room-Version bereitstellen.

Hochladen mehrerer Python-Funktionen in einen einzigen Patch

Wenn Sie mehrere über Vorlagen aufrufbare Python Pakete in Ihren Reinraum hochladen möchten, können Sie prepare_python_for_cleanroom mehrmals aufrufen und anschließend einmal load_prepared_python_into_cleanroom aufrufen, um einen einzigen Patch für Ihren Clean Room zu scannen, hochzuladen und zu generieren. Das folgende Beispiel zeigt das Hochladen einer UDF und UDTF mithilfe von Massen-Uploads:

---- Add custom inline UDF ----
CALL samooha_by_snowflake_local_db.provider.prepare_python_for_cleanroom(
    $cleanroom_name,
    'get_next_status',  -- Name of the UDF. Can be different from the handler.
    ['status VARCHAR'], -- Arguments of the UDF, specified as (variable name, SQL type).
    ['numpy'],          -- Packages needed by UDF.
    [],                 -- When providing the code inline, this is an empty array.
    'VARCHAR',          -- Return type of UDF.
    'get_next_status',  -- Handler.
    $$
import numpy as np
def get_next_status(status):
  """Return the next higher status, or a random status
  if no matching status found or at the top of the list."""

  statuses = ['MEMBER', 'SILVER', 'GOLD', 'PLATINUM', 'DIAMOND']
  try:
    return statuses[statuses.index(status.upper()) + 1]
  except:
    return 'NO MATCH'
    $$
);

---- Add custom inline UDTF. ----
CALL samooha_by_snowflake_local_db.provider.prepare_python_for_cleanroom(
    $cleanroom_name,
    'get_info',  -- Name of the UDTF. Can be different from the handler.
    ['hashed_email VARCHAR', 'days_active INT', 'status VARCHAR', 'income VARCHAR'],   -- Name/Type arguments of the UDTF.
    ['numpy'],         -- Packages used by UDTF.
    [],                -- When providing the code inline, this is an empty array.
    'TABLE(hashed_email VARCHAR, months_active INT, level VARCHAR)',  -- Return type of UDTF.
    'GetSomeVals',     -- Handler class name.
$$
class GetSomeVals:
  def __init__(self):
    self.month_days = 30

  def process(self, hashed_email, days_active, status, income):
    '''Change days into rough months, and also return whether we
    think the user's membership status is lower, higher, or equal to
    what is expected, based on their income.'''

    months_active = days_active // self.month_days
    brackets = ['0-50K', '50K-100K', '100K-250K', '250K+']
    statuses = ['MEMBER', 'SILVER', 'GOLD', 'PLATINUM']
    if(statuses.index(status) < brackets.index(income)):
      level = 'low'
    elif(statuses.index(status) > brackets.index(income)):
      level = 'high'
    else:
      level = 'equal'

    yield(hashed_email, months_active, level)
$$
);

-- Upload all stored procedures.
-- Note the new patch number returned by this procedure. Keep this number for later use.
CALL samooha_by_snowflake_local_db.provider.load_prepared_python_into_cleanroom($cleanroom_name);

-- Set the release directive specified by the last load_python_into_cleanroom call.
CALL samooha_by_snowflake_local_db.provider.set_default_release_directive($cleanroom_name, 'V1_0', <PATCH_NUMBER>);
Copy

Vom Anbieter geschriebene Codebeispiele

Die folgenden Beispiele zeigen das Hinzufügen von vom Anbieter geschriebenen UDFs und UDTFs zu einem Clean Room.

Laden Sie die folgenden Beispiele herunter, und laden Sie sie dann als Arbeitsblattdateien in Ihr Snowflake-Konto hoch. Sie benötigen separate Konten für den Anbieter und den Verbraucher, jeweils mit einer installierten Clean Room API. Ersetzen Sie die Informationen wie in den Beispieldateien notiert.

Vom Verbraucher übermittelter Code

Der von den Verbrauchenden hochgeladene Code wird gebündelt und mit einer kundenspezifisch Vorlage unter Verwendung des Workflows zum Hochladen von Vorlagen hochgeladen. Der hochgeladene Code kann von jeder Vorlage im Clean Room aufgerufen werden.

Um Code als Verbrauchende hochzuladen, sollten Sie die Syntax der kundenspezifischen Vorlagen kennen.

Beachten Sie, dass jeder Code, der von einem Verbraucher hochgeladen wird, für den Anbieter sichtbar sein kann, wenn dieser eine Berechtigung zum Hochladen anfragt. Der Verbraucher-Code ist auch sichtbar, wenn ein Anbieter oder Verbraucher die Vorlage untersucht.

Hier finden Sie einen Überblick über die Schritte zum Hochladen von kundenspezifischem Verbrauchercode:

  1. Der Anbieter erstellt den Clean Room auf die übliche Weise und lädt dann den Verbraucher ein.

  2. Der Verbraucher installiert und konfiguriert den Clean Room standardmäßig.

  3. Die Verbrauchenden bereiten eine Vorlage vor, die die UDF oder UDTF innerhalb des cleanroom-Namespace aufruft. Zum Aufrufen der verbraucherdefinierten calculate_tax-Funktion könnte eine einfache Vorlage wie der folgende Snippet aussehen:

    SELECT {{ cleanroom.calculate_tax(p.cost) }} AS Tax FROM my_db.my_sch.sales AS p;
    
    Copy
  4. Der Verbraucher bereitet seinen Python-Code vor. Wir empfehlen die Verwendung von doppelten Anführungszeichen (" ") anstelle von einfachen Anführungszeichen (' ') in Ihrem Code, um zusätzliche Escapezeichen zu vermeiden, die später benötigt werden. Ihr Code kann auf diese unterstützten Python-Bibliotheken verweisen.

  5. Der Verbraucher übergibt seinen Python-Code an consumer.generate_python_request_template. Der Prozess gibt den Python-Code als gespeicherten Prozess zurück, mit einem Platzhalter für die kundenspezifische JinjaSQL-Vorlage. Es gibt mehrere mehrzeilige Zeichenfolgen in der Vorlage, die $$ als mehrzeilige Trennzeichen verwenden.

  6. Die Verbrauchenden ersetzen den Platzhalter für die Vorlage in der Ausgabe von generate_python_request_template durch ihre JinjaSQL-Vorlage.

  7. Maskieren Sie in der kombinierten Vorlage alle einfachen Anführungszeichen wie folgt: \'. Dies liegt daran, dass beim Upload in den Clean Room für die gesamte mehrzeilige Prozesszeichenfolge einfache Anführungszeichen als äußerstes Trennzeichen verwendet werden. Hier ist ein Beispiel für eine gespeicherte Prozedur, die den Python-Code der Verbrauchenden und die kundenspezifische Vorlage mit Escaping von Zeichen enthält:

      BEGIN
    
      CREATE OR REPLACE FUNCTION CLEANROOM.custom_compare(min_status STRING, max_status STRING, this_status STRING)
      RETURNS boolean
      LANGUAGE PYTHON
      RUNTIME_VERSION = 3.10
      PACKAGES = (\'numpy\')
    
      HANDLER = \'custom_compare\'
      AS $$
      import numpy as np
    
      def custom_compare(min_status:str, max_status:str, this_status:str):
        statuses = [\'MEMBER\', \'SILVER\', \'GOLD\', \'PLATINUM\']
        return ((statuses.index(this_status) >= statuses.index(min_status)) &
                (statuses.index(this_status) <= statuses.index(max_status)))
      $$;
    
      -- Custom template
      LET SQL_TEXT varchar := $$
      SELECT
        c.status,
        c.hashed_email
      FROM IDENTIFIER( {{ my_table[0] }} ) as c
      WHERE cleanroom.custom_compare({{ min_status }}, {{ max_status }}, c.status);
      $$;
    
      LET RES resultset := (EXECUTE IMMEDIATE :SQL_TEXT);
      RETURN TABLE(RES);
    
      END;
    
    Copy
  8. Die Verbrauchenden rufen consumer.create_template_request mit der kombinierten Vorlage auf. Verwenden Sie einfache Anführungszeichen (' ') anstelle von doppelten Dollarzeichen als Trennzeichen ($$...$$), wenn Sie den Code für den gespeicherten Prozess im template_definition-Argument angeben. Beispiel:

    CALL samooha_by_snowflake_local_db.consumer.create_template_request(
      $cleanroom_name,
      $template_name,
      '
    BEGIN
    
    -- First, define the Python UDF.
    CREATE OR REPLACE FUNCTION CLEANROOM.custom_compare(min_status STRING, max_status STRING, this_status STRING)
    RETURNS boolean
    LANGUAGE PYTHON
    RUNTIME_VERSION = 3.10
    PACKAGES = (\'numpy\')
    
    HANDLER = \'custom_compare\'
    AS $$
    import numpy as np
    
    def custom_compare(min_status:str, max_status:str, this_status:str):
      statuses = [\'MEMBER\', \'SILVER\', \'GOLD\', \'PLATINUM\']
      return ((statuses.index(this_status) >= statuses.index(min_status)) &
              (statuses.index(this_status) <= statuses.index(max_status)))
        $$;
    
    -- Then define and execute the SQL query.
    LET SQL_TEXT varchar := $$
    SELECT
      c.status,
      c.hashed_email
    FROM IDENTIFIER( {{ my_table[0] }} ) as c
    WHERE cleanroom.custom_compare({{ min_status }}, {{ max_status }}, c.status);
    $$;
    
    -- Execute the query and then return the result.
    LET RES resultset := (EXECUTE IMMEDIATE :SQL_TEXT);
    RETURN TABLE(RES);
    
    END;
    ');
    
    Copy
  9. Verbraucher und Anbieter fahren mit dem standardmäßigen, vom Verbraucher definierten Vorlagenflow fort:

    1. Der Anbieter zeigt die Anforderung der Vorlage an (provider.list_pending_template_requests) und genehmigt sie dann durch Aufruf von approve_template_request. In der Anfrage kann der Anbieter die Vorlage und den gebündelten Code sehen.

    2. Der Verbraucher prüft den Status der Anfrage (consumer.list_template_requests) und, wenn der Status APPROVED lautet, führt er die Vorlage aus (consumer.run_analysis).

Verbraucher-Codebeispiele

Die folgenden Beispiele zeigen das Hinzufügen von vom Anbieter geschriebenen UDFs zu einem Clean Room.

Laden Sie die folgenden Beispiele herunter, und laden Sie sie dann als Arbeitsblattdateien in Ihr Snowflake-Konto hoch. Sie benötigen separate Konten für den Anbieter und den Verbraucher, jeweils mit einer installierten Clean Room API. Ersetzen Sie die Informationen wie in den Beispieldateien notiert: