API Snowpark

A biblioteca Snowpark fornece uma biblioteca intuitiva para consulta e processamento de dados em escala no Snowflake. Usando uma biblioteca para qualquer uma das três linguagens, você pode construir alicativos que processam dados no Snowflake sem mover dados para o sistema onde seu código de aplicativo é executado, e processar em escala como parte do mecanismo elástico e sem servidor do Snowflake.

Snowflake atualmente fornece bibliotecas Snowpark para três linguagens: Java, Python e Scala.

Guias do desenvolvedor

Você pode usar as bibliotecas do Snowpark para as linguagens listadas na tabela a seguir:

Linguagem

Guia do desenvolvedor

Referência de API

Java

Guia do desenvolvedor de Snowpark para Java

Referência da API da biblioteca Snowpark para Java

Python

Guia do desenvolvedor de Snowpark para Python

Referência da API da biblioteca Snowpark Python

Scala

Guia do desenvolvedor de Snowpark para Scala

Referência da API da biblioteca Snowpark para Scala

Download

Você pode baixar a biblioteca do Snowpark para qualquer uma das três linguagens suportadas. Para downloads, consulte Download do cliente Snowpark (Snowflake Developer Center).

Principais recursos

Snowpark tem vários recursos que o distinguem de outras bibliotecas de clientes, conforme descrito nas seções a seguir.

Vantagens quando comparado com o conector do Spark

Em comparação com a utilização do Conector Snowflake para Spark, o desenvolvimento com o Snowpark inclui os seguintes benefícios:

  • Suporte para interagir com os dados dentro do Snowflake utilizando bibliotecas e padrões construídos para diferentes linguagens sem comprometer o desempenho ou a funcionalidade.

  • Suporte para a criação de código Snowpark utilizando ferramentas locais como Jupyter, VS Code ou IntelliJ.

  • Suporte para o pushdown de todas as operações, incluindo UDFs do Snowflake. Isto significa que o Snowpark faz o pushdown de toda transformação de dados e levantamento pesado para a nuvem de dados Snowflake, permitindo que você trabalhe eficientemente com dados de qualquer tamanho.

  • Não há necessidade de um cluster separado fora do Snowflake para os cálculos. Todos os cálculos são feitos dentro do Snowflake. O gerenciamento de escalas e computação é feito pelo Snowflake.

Capacidade de criar instruções SQL com constructos nativos

A API Snowpark fornece construções de linguagem de programação para a construção de instruções SQL. Por exemplo, a API fornece um método de select que pode ser usado para especificar os nomes das colunas que devem retornar, em vez de escrever 'select column_name' como uma cadeia de caracteres.

Embora ainda seja possível usar uma cadeia de caracteres para especificar a instrução SQL a ser executada, você pode aproveitar recursos como o preenchimento automático e inteligente de código e verificação de tipo ao usar as construções de linguagem nativos fornecidos pelo Snowpark.

Exemplo

O código Python no exemplo a seguir realiza uma operação de seleção na tabela sample_product_data, especificando as colunas id, name e serial_number.

>>> # Import the col function from the functions module.
>>> from snowflake.snowpark.functions import col

>>> # Create a DataFrame that contains the id, name, and serial_number
>>> # columns in the "sample_product_data" table.
>>> df = session.table("sample_product_data").select(col("id"), col("name"), col("serial_number"))
>>> df.show()
Copy

Redução da transferência de dados

As operações do Snowpark são executadas lentamente no servidor, o que significa que você pode usar a biblioteca para atrasar a transformação de dados até o mais tarde possível no pipeline, enquanto se agrupa muitas operações em uma única operação. Isso reduz a quantidade de dados transferidos entre seu cliente e o banco de dados Snowflake. Isso também melhora o desempenho.

A abstração principal no Snowpark é o DataFrame, que representa um conjunto de dados e fornece métodos para operar sobre esses dados. Em seu código de cliente, você constrói um objeto DataFrame e o configura para obter os dados que deseja utilizar (por exemplo, as colunas que contêm os dados, o filtro a ser aplicado às linhas, etc.).

Os dados não são recuperados quando você cria o objeto DataFrame. Em vez disso, quando você estiver pronto para obter os dados, você pode executar uma ação que avalia os objetos DataFrame e envia as instruções SQL correspondentes para o banco de dados do Snowflake executá-las.

Exemplo

O código Python, no exemplo a seguir, define uma consulta em uma tabela. Ele chama o método collect para executar a consulta e recuperar os resultados.

>>> # Create a DataFrame with the "id" and "name" columns from the "sample_product_data" table.
>>> # This does not execute the query.
>>> df = session.table("sample_product_data").select(col("id"), col("name"))

>>> # Send the query to the server for execution and
>>> # return a list of Rows containing the results.
>>> results = df.collect()
Copy

Capacidade de criar UDFs em linha

Você pode criar funções definidas pelo usuário (UDFs) em linha em um aplicativo Snowpark. O Snowpark pode enviar por push seu código ao servidor, onde o código pode operar sobre os dados em escala. Isto é útil para a funcionalidade de looping ou lote onde a criação como uma UDF permitirá que o Snowflake paralelize e aplique a lógica codificada em escala dentro do Snowflake.

É possível escrever funções na mesma linguagem que usa para escrever seu código de cliente (por exemplo, usando funções anônimas em Scala ou funções lambda em Python). Para usar essas funções para processar dados no banco de dados do Snowflake, é necessário definir e chamar funções definidas pelo usuário (UDFs) em seu código personalizado.

O Snowpark transfere automaticamente o código personalizado de UDFs para o banco de dados do Snowflake. Quando você chama a UDF em seu código de cliente, seu código personalizado é executado no servidor (onde os dados estão). Não é necessário transferir os dados para seu cliente a fim de executar a função sobre os dados.

Exemplo

O código Python no exemplo a seguir cria uma UDF chamado my_udf e a atribui à variável add_one.

>>> from snowflake.snowpark.types import IntegerType
>>> add_one = udf(lambda x: x+1, return_type=IntegerType(), input_types=[IntegerType()], name="my_udf", replace=True)
Copy