Preparando uma pasta local com artefatos Snowflake Native App configurados¶
Crie uma pasta local com artefatos configurados¶
O comando snow app bundle
cria um diretório local no projeto, preenche-o com a estrutura de arquivo especificada no arquivo de definição do projeto e gera declarações CREATE FUNCTION ou CREATE PROCEDURE em scripts de configuração do Snowflake Native App a partir do código Snowpark Python que inclui decoradores (como @sproc
ou @udaf
). Para obter mais informações, consulte a documentação do Snowpark Python correspondente ao decorador de função escolhido, como snowflake.snowpark.functions.udaf.
Os comandos snow app deploy
e snow app run
já usam essa funcionalidade. No entanto, agora com um comando explícito snow app bundle
à sua disposição, é possível explorar esse diretório antes que ele seja carregado no estágio, para verificar se os artefatos foram criados conforme o esperado.
Para criar uma pasta local com os artefatos configurados, faça o seguinte:
Crie ou verifique seu arquivo de definição de projeto Snowflake
snowflake.yml
, como:definition_version: 2 entities: codegen_nativeapp_pkg: type: application package manifest: root_files/_manifest.yml artifacts: - src: root_files/README.md dest: README.md - src: root_files/_manifest.yml dest: manifest.yml - src: root_files/setup_scripts/* dest: setup_scripts/ - src: python/user_gen/echo.py dest: user_gen/echo.py - src: python/cli_gen/* dest: cli_gen/ processors: - snowpark codegen_nativeapp_pkg: type: application from: target: codegen_nativeapp_pkg
No diretório do projeto, execute o comando
snow app bundle
para criar o diretório temporáriooutput/deploy
que contém os artefatos configurados.snow app bundle
Verifique se o conteúdo do diretório de saída ou de implementação corresponde às regras especificadas no arquivo snowflake.yml. Se você invocou o processamento de anotação do Snowpark em seus arquivos Python, poderá ver o código gerado no script de configuração alterado no diretório.
Para obter mais informações, consulte o comando snow app bundle.
Como gerar código SQL usando o processamento de anotação do Snowpark¶
Como desenvolvedor de Snowflake Native App com experiência limitada de SQL, você pode achar complicado escrever e manter scripts de configuração, que podem ficar muito grandes e complicados com o tempo. Os scripts de configuração contêm toda a lógica do aplicativo que um cliente pode usar com seus dados e, portanto, são uma parte necessária do desenvolvimento de um Snowflake Native App. Um dos principais componentes dos scripts de configuração é a capacidade de usar funções de extensão do Snowpark Python para funções e procedimentos armazenados. Além de escrever o código do Snowpark em Python, Java ou outras linguagens compatíveis com Snowpark, é necessário escrever as partes correspondentes dessas funções e procedimentos usando SQL no script de configuração.
Por exemplo, você pode criar uma função básica e um procedimento armazenado usando o Snowpark Python, conforme mostrado:
# Example python file "echo.py" that a developer writes
def echo_fn(data):
return 'echo_fn: ' + data
def echo_proc(session, data):
return 'echo_proc: ' + data
Você precisaria então carregar o arquivo em um estágio e consultá-lo no código SQL do script de configuração, semelhante ao seguinte:
-- Sample setup_script.sql SQL file for a Snowflake Native App
CREATE APPLICATION ROLE IF NOT EXISTS app_instance_role;
CREATE OR ALTER VERSIONED SCHEMA ext_code_schema;
GRANT USAGE ON SCHEMA ext_code_schema TO APPLICATION ROLE app_instance_role;
CREATE OR REPLACE PROCEDURE ext_code_schema.py_echo_proc(DATA string)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
PACKAGES=('snowflake-snowpark-python')
HANDLER='echo.echo_proc'
IMPORTS=('/echo.py');
GRANT USAGE ON PROCEDURE ext_code_schema.py_echo_proc(string)
TO APPLICATION ROLE app_instance_role;
-- Wraps a function from a python file
CREATE OR REPLACE FUNCTION ext_code_schema.py_echo_fn(string)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
PACKAGES=('snowflake-snowpark-python')
HANDLER='echo.echo_fn'
IMPORTS=('/echo.py');
GRANT USAGE ON FUNCTION ext_code_schema.py_echo_fn(DATA string)
TO APPLICATION ROLE app_instance_role;
Geração automática de código SQL¶
Nota
Para aproveitar a geração automática de código SQL, é necessário usar o Snowpark Python versão 1.15.0 e superior.
Para ajudar a aliviar esse trabalho extra, Snowflake CLI pode gerar automaticamente o SQL necessário para seus scripts de configuração. O Snowpark Python oferece suporte a um recurso chamado decoradores de função de extensão (@udf
, @sproc
, @udtf
e @udaf
) que permitem que você anote seu código Python, como usar o decorador de função snowflake.snowpark.functions.udf. Snowflake CLI pode usar esses decoradores para criar e validar automaticamente o código SQL necessário para seus scripts de configuração.
Por exemplo, é possível usar o decorador @udf
para a função no exemplo anterior:
# some python file echo.py
@udf(name="echo_fn")
def echo_fn(data) -> str:
return 'echo_fn: ' + str
O uso do decorador @udf
informa ao snow app bundle da Snowflake CLI (e outros comandos que invocam internamente o comando snow app bundle
) para processar os decoradores de Snowpark Python, gerar os comandos SQL correspondentes e incluí-los no script de configuração automaticamente, conforme mostrado. É possível, portanto, minimizar a quantidade de código SQL que precisa ser escrito para seu script de configuração.
-- Sample setup_script.sql SQL file for a Snowflake Native App
-- User-written code
CREATE OR REPLACE APPLICATION ROLE app_instance_role;
CREATE OR ALTER VERSIONED SCHEMA ext_code_schema;
GRANT USAGE ON SCHEMA ext_code_schema TO APPLICATION ROLE app_instance_role;
-- Snowflake CLI generated code
CREATE OR REPLACE FUNCTION ext_code_schema.py_echo_fn(DATA string)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
PACKAGES=('snowflake-snowpark-python')
HANDLER='echo.echo_fn'
IMPORTS=('/echo.py');
GRANT USAGE ON FUNCTION ext_code_schema.py_echo_fn(string)
TO APPLICATION ROLE app_instance_role;
Como usar os decoradores do Snowpark Python¶
Embora os decoradores do Snowpark em Snowflake CLI funcionem da mesma forma que os decoradores Snowpark Python regulares, é necessário estar ciente das seguintes diferenças ao escrever arquivos de código Python especificamente para um Snowflake Native App:
Não é possível usar nenhum objeto
Session
nesses arquivos, pois Snowflake CLI executa esses arquivos Python em um ambiente sandbox sem conexão com o Snowflake. Como resultado, qualquer referência a umSession
de Snowpark resulta em um erro.É possível usar apenas os decoradores Snowpark Python
@udf
,@sproc
,@udaf
e@udtf
.Você não pode usar esses decoradores como funções regulares para registrar seu código como um objeto Snowflake. Somente código explicitamente anotado com os decoradores compatíveis é reconhecido. Portanto, a função Python deve ser uma função nomeada. Funções lambda não são compatíveis.
Snowflake CLI sempre gera instruções CREATE OR REPLACE, conforme recomendado pela Snowflake, para criar funções e procedimentos em seus scripts de configuração.
Mais sobre propriedades de decoração¶
A tabela a seguir lista as propriedades do decorador Python e explica como Snowflake CLI as utiliza.
Propriedade |
Detalhes |
---|---|
nome Opcional |
Nome da função ou procedimento armazenado que Snowflake CLI usa para gerar instruções SQL. Se você omitir esta propriedade, Snowflake CLI reusa o nome da função Python para gerar as instruções SQL. |
tipos_de_entrada Obrigatório |
Tipos para cada parâmetro de entrada para esta função ou procedimento armazenado. Você deve fornecer essas informações neste parâmetro do decorador ou fornecer anotações de tipo diretamente em seu código. Se essas informações não estiverem disponíveis em nenhum local, Snowflake CLI não irá gerar instruções SQL para esta função ou procedimento armazenado. |
tipo_de_retorno Obrigatório |
Digite o valor de retorno para esta função ou procedimento armazenado. Você deve fornecer essas informações neste parâmetro do decorador ou fornecer a anotação de tipo diretamente em seu código. Se essas informações não estiverem disponíveis em nenhum local, Snowflake CLI não irá gerar instruções SQL para esta função ou procedimento armazenado. |
pacotes Opcional |
Lista de pacotes. É possível especificar Se você omitir esta propriedade, Snowflake CLI adiciona |
importações Opcional |
Lista de arquivos que sua função Snowflake ou procedimento armazenado precisa importar do estágio. É possível especificá-los como uma cadeia de caracteres ou uma tupla de cadeias de caracteres. Se você especificar uma tupla, Snowflake CLI usa apenas a cadeia de caracteres no índice 0. Para um exemplo de uso de uma tupla, consulte Uso de arquivos Python externos. Se você não especificar nenhuma importação, Snowflake CLI adicionará automaticamente uma importação para o arquivo Python com a função ou procedimento armazenado para o qual ele gera SQL. O caminho da importação é determinado pelo parâmetro |
executar_como Opcional |
Persona a ser usada ao executar um procedimento armazenado. Os valores incluem: |
manipulador N/A |
Manipulador para a função ou procedimento armazenado. Snowflake CLI preenche automaticamente este campo. |
substituir Não utilizado |
Snowflake CLI assume |
sessão Obrigatório |
Deve ser |
is_permanent Não utilizado |
Snowflake CLI não usa este campo para geração de SQL. |
localização_do_estágio Não utilizado |
Snowflake CLI não usa este campo para geração de SQL. |
se_não_existir Não utilizado |
Snowflake CLI não usa este campo para geração de SQL. |
estrito Não utilizado |
Snowflake CLI não usa este campo para geração de SQL. |
seguro Não utilizado |
Snowflake CLI não usa este campo para geração de SQL. |
imutável Não utilizado |
Snowflake CLI não usa este campo para geração de SQL. |
parâmetros_do_aplicativo_nativo Opcional |
(Apenas para um Snowflake Native App) Dicionário Python com os seguintes parâmetros de Snowflake Native App:
Embora tecnicamente opcional, não especificar a propriedade |
Ao enviar seus arquivos Python para um estágio de destino, Snowflake CLI converte os decoradores em comentários, para que esses UDFs e os procedimentos armazenados não sejam criados na sessão atual. Os arquivos de origem originais não são alterados para que o comando snow app bundle
permaneça independente. Somente os arquivos Python no diretório raiz de implementação são alterados para conter os comentários, pois a raiz de implementação é recriada toda vez que você executa o comando snow app bundle
. O exemplo a seguir ilustra como Snowflake CLI comenta os decoradores.
# output/deploy/dest_dir1/dest_dir2/echo.py
#: @sproc(
#: return_type=IntegerType(),
#: input_types=[IntegerType(), IntegerType()],
#: packages=["snowflake-snowpark-python==1.15.0"],
#: native_app_params={
#: "schema": "ext_code_schema",
#: "application_roles": ["app_instance_role"],
#: },
#: )
def add_sp(session_, x, y):
return x + y
Além disso, apenas arquivos Python com uma propriedade processors
no arquivo de definição do projeto são afetados.