Einführung in Java-UDFs

Unter diesem Thema werden Java-UDFs vorgestellt, und Sie erhalten Informationen, die Ihnen bei der Entscheidung helfen, wann Sie eine Java-UDF verwenden sollten.

Unter diesem Thema:

Was ist eine Java-UDF?

Eine UDF (benutzerdefinierte Funktion) ist eine vom Benutzer geschriebene Funktion, die von Snowflake aus auf die gleiche Weise wie eine integrierte Funktion aufgerufen werden kann.

Snowflake unterstützt UDFs, die in mehreren Sprachen, einschließlich Java, geschrieben wurden.

Java-UDFs sind skalare Funktionen, wobei für jede Zeile, die an die UDF übergeben wird, von der UDF ein Wert zurückgegeben wird.

UDFs akzeptieren keine oder mehr Parameter.

Wenn ein Benutzer eine UDF aufruft, übergibt der Benutzer den Namen der UDF und die Parameter der UDF an Snowflake. Wenn die UDF eine Java-UDF ist, ruft Snowflake den entsprechenden Java-Code (genannt Handler-Methode) in einer JAR-Datei auf. Die Handler-Methode gibt dann die Ausgabe an Snowflake zurück, und Snowflake gibt die Ausgabe an den Client zurückgibt. Nachfolgend finden Sie eine vereinfachte Darstellung des Datenflusses:

UDF Data Flow

Java-UDFs können sowohl neuen Code als auch Aufrufe bestehender Bibliotheken enthalten, was sowohl Flexibilität als auch die Wiederverwendung von Code ermöglicht. Wenn Sie z. B. bereits Datenanalysecode in Java haben, dann können Sie diesen wahrscheinlich in eine Java-UDF einbinden.

Snowflake unterstützt derzeit das Schreiben von UDFs in den Java-Versionen 8.x, 9.x, 10.x und 11.x.

Entscheiden, wann ein Java-UDF verwendet werden soll

In diesem Abschnitt werden die Vor- und Nachteile von Java-UDFs beschrieben.

Weitere Informationen zu anderen möglichen Sprachen, in denen UDFs geschrieben werden können, und für Vergleiche zwischen diesen Sprachen finden Sie unter Übersicht zu UDFs.

Informationen zu andere Methoden zur Erweiterung von Snowflake finden Sie unter:

Vorteile von Java-UDFs

Java-UDFs sind besonders geeignet, wenn einer oder mehrere der folgenden Punkte zutreffen:

  • Sie haben bereits Java-Code (Quellcode oder kompiliert), den Sie verwenden können.

  • Ihr Code verwendet (oder könnte verwenden) Funktionen, die bereits in Standard-Java-Bibliotheken vorhanden sind.

  • Sie kennen Java so gut wie oder besser als die anderen Sprachen, die UDFs unterstützen.

Einschränkungen bei Java-UDFs

Allgemeine Einschränkungen

  • Obwohl Ihre Java-Methode Klassen und Methoden aus Standard-Java-Bibliotheken verwenden kann, deaktivieren die Sicherheitseinschränkungen von Snowflake einige Funktionen, wie z. B. das Schreiben in Dateien. Weitere Informationen dazu finden Sie im Abschnitt Einsetzen von bewährten Sicherheitsmethoden.

  • Java-UDFs können nicht freigegeben werden. Datenbankobjekte, die Java-UDFs verwenden, können ebenfalls nicht freigegeben werden. So ist Folgendes zum Beispiel nicht möglich:

    • Direktes Freigeben einer Java-UDF.

    • Freigeben einer Ansicht, die eine Java-UDF aufruft.

    • Freigeben einer Funktion, die eine Java-UDF aufruft.

    • Freigeben einer Tabelle mit einer Maskierungs- oder Zeilenzugriffsrichtlinie, die eine Java-UDF aufruft.

  • Wenn Sie versuchen, einen Java-UDF mit der SECURE-Option zu erstellen (CREATE SECURE FUNCTION...), gibt Snowflake einen Fehler zurück. Die SECURE-Option wird für Java-UDFs noch nicht unterstützt.

  • Durch Erteilen der USAGE-Berechtigung für eine Java-UDF kann der Empfänger den Inhalt von Dateien anzeigen, die von dieser UDF importiert wurden. Wenn Sie einer Rolle die USAGE-Berechtigung für eine Java-UDF erteilen und diese Rolle eine Anweisung ausführt, die diese Java-UDF aufruft, könnte jede Java-UDF in derselben Anweisung den Inhalt aller Dateien lesen, die von der Java-UDF importiert wurden, für die Sie eine USAGE-Berechtigung erteilt haben.

  • Das Erstellen oder Aktualisieren einer sekundären Datenbank wird blockiert, wenn in der primären Datenbank eine Java-UDF vorhanden ist. (Diese Einschränkung entfällt möglicherweise in zukünftigen Versionen.)

Einschränkungen beim Klonen

Eine Java-UDF kann geklont werden, wenn die Datenbank oder das Schema, das die Java-UDF enthält, geklont wird. Um geklont zu werden, muss eine Java-UDF die folgende(n) Bedingung(en) erfüllen:

  • Wenn die Java-UDF auf einen Stagingbereich verweist (z. B. den Stagingbereich, der die UDF-JAR-Datei enthält), muss sich dieser Stagingbereich außerhalb des Schemas (oder der Datenbank) befinden, das (die) geklont wird.

    Sie können eine Java-UDF und deren referenzierte Stagingbereiche in getrennten Schemas (und/oder getrennten Datenbanken) auf eine der folgenden Arten speichern:

    • Verwenden Sie überall dort, wo die Java-UDF auf einen Stagingbereich verweist, einen qualifizierten Stagingbereichsnamen (z. B. „my_db.my_schema.my_stage()“), der sich von dem Schema oder der Datenbank der Java-UDF unterscheidet. Wenn die Klonoperation eine Datenbank klont, muss der Stagingbereichsverweis die Datenbank und das Schema enthalten. Wenn die Klonoperation ein Schema klont, muss der Stagingbereichsverweis das Schema (und optional die Datenbank) enthalten.

    • Erstellen Sie den referenzierten Stagingbereich unter Verwendung eines nicht qualifizierten Stagingbereichsnamens (der implizit die aktive Datenbank und das aktive Schema der aktuellen Sitzung verwendet), und erstellen Sie die Java-UDF unter Verwendung eines qualifizierten Namens, der nicht mit der aktuellen Datenbank und dem aktuellen Schema der Sitzung übereinstimmt.

    • Verwenden Sie den Stagingbereich des Benutzers als referenzierten Stagingbereich (der Stagingbereich des Benutzers ist von allen anderen Stagingbereichen der Datenbank oder des Schemas getrennt).

Wenn eine oder mehrere Java-UDFs im Schema oder in der Datenbank die erforderlichen Bedingungen nicht erfüllen, kann das Schema oder die Datenbank trotzdem geklont werden, wobei die nicht konformen Java-UDFs allerdings ohne Fehler- oder Warnmeldung ausgelassen werden.

Jede geklonte Java-UDF hat die gleiche Definition wie das Original. Diese Definition schließt alle Verweise auf Stagingbereiche ein. Die Stagingbereichsverweise in der Java-UDF müssen vollqualifiziert sein und sind daher absolut und nicht relativ zu dem Schema oder der Datenbank, die geklont wird. Da sowohl Original als auch Klon auf dieselben Stagingbereiche und Dateien verweisen, gilt Folgendes:

  • Wenn Sie den Stagingbereich löschen oder erforderliche Dateien aus dem Stagingbereich entfernen, werden sowohl die Original- als auch die geklonte-UDF deaktiviert.

  • Das Ändern des Stagingbereichs oder der Dateien im Stagingbereich (z. B. das Ersetzen der JAR-Datei durch eine neuere JAR-Datei) wirkt sich sowohl auf die Original- als auch auf die geklonte UDF-Datei aus.