Distribuzione di pacchetti Python personalizzati da GitHub a Snowflake

Nov 30 2022
AGGIORNAMENTO: dal 7 novembre 2022. Snowpark per Python è GA, quindi installarlo è facile come installare pip snowflake-snowpark-python tramite PyPi.

AGGIORNAMENTO: dal 7 novembre 2022. Snowpark per Python è GA, quindi installarlo è facile come pip install snowflake-snowpark-pythontramite PyPi .

Panoramica

Snowpark offre agli sviluppatori un modo per estendere le funzionalità della piattaforma Snowflake scrivendo codice in linguaggi come Python, Java, Scala e JavaScript. In questo blog, esamineremo un modo per distribuire pacchetti personalizzati in puro Python da un repository GitHub utilizzando GitHub Actions su Snowflake.

Ancora più importante, quando questi pacchetti vengono utilizzati per creare funzioni definite dall'utente (UDF) in Snowpark Python , questo approccio semplifica la manutenzione e la distribuzione del codice personalizzato su più UDF contemporaneamente e automaticamente senza intervento manuale. Un altro vantaggio evidenziato da questa configurazione è il disaccoppiamento dei pacchetti personalizzati dallo script che carica il pacchetto in Snowflake e visualizza i nomi delle UDF che utilizzano il pacchetto personalizzato aggiornato.

Funzione definita dall'utente

Per dimostrare come l'intero flusso si riunisce, consideriamo questo semplice UDF in Snowpark Python. (Questo script viene eseguito in Snowsight .)

Note di sceneggiatura

  • Il pacchetto Python do_something_cool.py viene aggiunto come dipendenza — riga 6 . Si noti che l' istruzione imports include l'intero percorso; nome dello stage e il nome del file
  • Quel pacchetto viene quindi importato ( riga 9 ) e viene chiamato il metodo greetings() ( riga 11 ) passando il parametro passato in questa UDF

SELECT greet_me('Dash');

Hello, Dash! How are you doing today? It's great to see you today!

Configurazione: repository GitHub 1

Supponiamo che tu abbia un repository GitHub in cui mantieni questo pacchetto Python a cui tu e i membri del tuo team contribuite e collaborate.

Ecco " fai qualcosa di figo "

Questo repository è anche il punto in cui dovresti impostare GitHub Actions .

Ecco come sarebbe il file del flusso di lavoro di GitHub Actions ( dettagli del flusso di lavoro di seguito ):

Dettagli del flusso di lavoro

  • Evento di attivazione: al push al ramo principale quando il codice viene aggiornato
  • Passaggi del flusso di lavoro:

— 2. Installare le richieste di dipendenze e snowflake-connector-python necessarie per distribuire il codice del pacchetto aggiornato

— 3. Scarica lo script ( da Repo 2 — vedi sotto ) che caricherà il codice personalizzato aggiornato su Snowflake

— 4. Impostare le variabili di ambiente ( database, magazzino, schema, utente, password e ruolo ) archiviate in GitHub Secrets. Queste variabili verranno utilizzate da Snowflake Python Connector nello script ( scaricato nel passaggio 3 ) per connettersi a Snowflake

— 5. Eseguire lo script ( scaricato nel passaggio 3 ) per distribuire il codice aggiornato

[Codice su GitHub : pacchetto personalizzato di esempio | File del flusso di lavoro delle azioni GitHub ]

Configurazione: repository GitHub 2

Questo repository contiene lo script Python (vedere i dettagli di seguito) che viene scaricato ed eseguito dalla configurazione del flusso di lavoro di GitHub Actions nel Repo 1 quando vengono apportati aggiornamenti al pacchetto nel ramo principale nel Repo 1.

Ecco come sarebbe lo script:

Passaggi di sceneggiatura

— 1. Connettiti a Snowflake utilizzando Snowflake Python Connector e le variabili di ambiente impostate utilizzando GitHub Secrets

— 2. Scarica l'elenco dei pacchetti (vedi sotto formato JSON) da aggiornare

— 3. Per ogni pacchetto, scarica l'ultima versione dal ramo principale da Repo 1 e caricala nella fase Snowflake

— 4. Passa in rassegna tutte le UDF, esamina le loro importazioni e stampa i nomi delle UDF che utilizzano il pacchetto aggiornato

Elenco dei pacchetti

Questo repository contiene anche un file JSON con un elenco di pacchetti ( a cui si fa riferimento nel passaggio 2 sopra ) da aggiornare quando viene eseguito lo script update_packages.py .

Ecco il formato del file:

Nota : la fase nel file JSON si riferisce a una fase in Snowflake in cui il file viene caricato.

Test

Per testare, aggiorna do_something_cool.py in Repo 1 ( ad esempio, modifica il messaggio di saluto in "Benvenuto, come va la tua giornata?" ) e invia le modifiche al ramo principale . A quel punto dovresti vedere un build kickoff e se ha successo (cioè il codice/ sintassi è corretto, tutti i file e i percorsi di riferimento esistono, i parametri di connessione per connettersi a Snowflake sono validi, ecc. ), allora dovresti vedere build output simile a questo:

Quindi, eseguendo di nuovo questo SQL...

SELECT greet_me('DASH');

Hello, Dash! Welcome, how is your day going?

Questo è tutto!

Grazie per il tuo tempo e sentiti libero di seguirmi su Twitter e LinkedIn dove condivido video dimostrativi, frammenti di codice e altri artefatti interessanti in particolare sullo Snowpark .