Bestehendes Python-Paket hochladen

Snowflake CLI ermöglicht es Ihnen, bestehende Python-Pakete mit snow snowpark package-Befehlen zu Snowpark-Importen hinzuzufügen. Sie können in Ihren Funktionen und Prozeduren bereits implementierte Pakete verwenden, z. B. die von PyPi.

Um ein Python-Paket zu den Snowpark-Importen hinzuzufügen, gehen Sie wie folgt vor:

  1. Prüfen, ob Paket bereits verfügbar ist.

  2. Paket herunterladen und Snowflake-Artefakt erstellen.

  3. Paket in Snowflake-Stagingbereich hochladen.

  4. Paket in Snowpark-Prozeduren und -Funktionen verwenden.

Prüfen, ob Paket bereits verfügbar ist

Um zu überprüfen, ob ein Paket nicht bereits verfügbar ist, verwenden Sie den Befehl snow snowpark package lookup.

Das folgende Beispiel veranschaulicht die Suche nach einem Paket, das bereits im Snowflake-Anaconda-Kanal verfügbar ist:

snow snowpark package lookup numpy
Copy
Package `numpy` is available in Anaconda. Latest available version: 1.26.4.

Wenn ein Paket im Snowflake-Anaconda-Kanal nicht verfügbar ist, können Sie eine Meldung ähnlich der folgenden erhalten:

snow snowpark package lookup july
Copy
Package `july` is not available in Anaconda. To prepare Snowpark compatible package run:

  snow snowpark package create july

Weitere Informationen dazu finden Sie unter dem Befehl snowpark package lookup.

Paket herunterladen und Snowflake-Artefakt erstellen

Um ein Paket herunterzuladen und ein Snowflake-Artefakt zum Hochladen zu erstellen, verwenden Sie den Befehl snow snowpark package create.

snow snowpark package create <name>
Copy

Wobei:

  • <name> kann eine beliebige Anforderung sein, die von pip unterstützt wird, z. B. ein Paketname, eine URL für ein Paket oder ein lokaler Dateipfad.

Zusätzliche Optionen:

  • --allow-shared-libraries: Erlaubt gemeinsam genutzte (.so/.dll) Bibliotheken, wenn Sie Pakete verwenden, die über pip installiert wurden.

  • --ignore-anaconda: Sucht nicht nach Paketen im Snowflake-Anaconda-Kanal.

  • --index-url: Gibt die Basis-URL des Python Package Index an, die für die Paketsuche verwendet werden soll. Diese URL sollte auf ein Repository verweisen, das mit PEP 503 (die einfache Repository-API) kompatibel ist, oder auf ein lokales Verzeichnis, das im gleichen Format angelegt ist.

  • --skip-version-check: Überspringt den Versionsvergleich von Abhängigkeiten zwischen Anforderungen und Anaconda.

Die folgenden Beispiele veranschaulichen verschiedene Situationen für das Erstellen von Snowflake-Artefakten:

Beispiel: Paket mit Anaconda-Abhängigkeiten erstellen

In diesem Beispiel wird ein Python-Paket als ZIP-Datei erstellt, die in einen Stagingbereich hochgeladen und später von einer Snowpark Python-App importiert werden kann. Die Abhängigkeiten für das Paket „july“ befinden sich im Anaconda-Kanal, sodass sie nicht in die Datei .zip aufgenommen wurden. Der Befehl zeigt die Pakete an, die Sie in die Datei requirements.txt Ihres Snowpark-Projekts aufnehmen müssen.

snow snowpark package create july==0.1
Copy
Package july.zip created. You can now upload it to a stage using
snow snowpark package upload -f july.zip -s <stage-name>`
and reference it in your procedure or function.
Remember to add it to imports in the procedure or function definition.

The package july==0.1 is successfully created, but depends on the following
Anaconda libraries. They need to be included in project requirements,
as their are not included in .zip.
matplotlib
numpy

Beispiel: Paket mit Option --ignore-anaconda erstellen

In diesem Beispiel wird das Paket july.zip erstellt, das Sie in Ihrem Snowpark-Projekt verwenden können, ohne dass Sie der Datei requirements.txt irgendwelche Abhängigkeiten hinzufügen müssen. Die Fehlermeldungen weisen darauf hin, dass einige Pakete freigegebene Bibliotheken enthalten, die möglicherweise nicht funktionieren, z. B. wenn Sie ein Paket unter Windows erstellen.

snow snowpark package create july==0.1 --ignore-anaconda --allow-shared-libraries
Copy
2024-05-09 15:34:02 ERROR Following dependencies utilise shared libraries, not supported by Conda:
2024-05-09 15:34:02 ERROR contourpy
numpy
pillow
kiwisolver
matplotlib
fonttools
2024-05-09 15:34:02 ERROR You may still try to create your package with --allow-shared-libraries, but the might not work.
2024-05-09 15:34:02 ERROR You may also request adding the package to Snowflake Conda channel
2024-05-09 15:34:02 ERROR at https://support.anaconda.com/

Package july.zip created. You can now upload it to a stage using
snow snowpark package upload -f july.zip -s <stage-name>`
and reference it in your procedure or function.
Remember to add it to imports in the procedure or function definition.

Beispiel: Paket erstellen, das bereits im Snowflake Anaconda-Kanal verfügbar ist

In diesem Beispiel kann das Paket nicht erstellt werden, da es bereits existiert. Sie können das Erstellen des Pakets immer noch erzwingen, indem Sie die Option --ignore-anaconda verwenden.

snow snowpark package create matplotlib
Copy
Package matplotlib is already available in Snowflake Anaconda Channel.

Weitere Informationen zum Erstellen eines Pakets finden Sie unter dem Befehl snowpark package create.

Paket in Snowflake-Stagingbereich hochladen

Um Ihr Paket hochzuladen, verwenden Sie den Befehl snow snowpark package upload.

Mit diesem Befehl wird eine Python-Paket-ZIP-Datei in einen Snowflake-Stagingbereich hochgeladen, sodass es in den Importen einer Prozedur oder Funktion referenziert werden kann.

snow snowpark package upload --file="july.zip" --stage="packages"
Copy
Package july.zip UPLOADED to Snowflake @packages/july.zip.

Paket in Snowpark-Prozeduren und -Funktionen verwenden

Um das Paket in Prozeduren oder Funktionen zu verwenden, fügen Sie es dem Parameter imports im Abschnitt Snowpark-Definition in snowflake.yml hinzu.

get_custom_package_version:
  handler: "functions.get_custom_package_version"
  signature: ""
  returns: string
  type: function
  imports:
    - "@packages/july.zip"
  meta:
    use_mixins:
      - snowpark_shared
Copy

Dann importieren Sie Ihr Paket in den Funktionshandler.

# functions.py
import july

def get_custom_package_version():
  return july.__VERSION__
Copy