Como trabalhar com DataFrames no Snowpark Python¶
No Snowpark, a principal forma de consultar e processar dados é através de um DataFrame. Este tópico explica como trabalhar com DataFrames.
Para obter e manipular dados, use a classe DataFrame. Um DataFrame representa um conjunto de dados relacionais que é avaliado lentamente: ele só é executado quando uma ação específica é acionada. Em certo sentido, um DataFrame é como uma consulta que precisa ser avaliada para obter dados.
Para obter dados em um DataFrame:
Construa um DataFrame especificando a fonte dos dados para o conjunto de dados.
Por exemplo, você pode criar um DataFrame para armazenar dados de uma tabela, um arquivo CSV externo, de dados locais ou a execução de uma instrução SQL.
Especifique como o conjunto de dados no DataFrame deve ser transformado.
Por exemplo, você pode especificar quais colunas devem ser selecionadas, como as linhas devem ser filtradas, como os resultados devem ser ordenados e agrupados, etc.
Execute a instrução para obter os dados para o DataFrame.
Para obter os dados no DataFrame, você deve invocar um método que execute uma ação (por exemplo, o método
collect()).
As próximas seções explicam essas etapas com mais detalhes.
Como estabelecer os exemplos para esta seção¶
Alguns exemplos desta seção utilizam um DataFrame para consultar uma tabela chamada sample_product_data. Se você quiser executar esses exemplos, você pode criar essa tabela e preenchê-la com alguns dados executando as seguintes instruções SQL.
Você pode executar as instruções SQL usando o Snowpark Python:
Para verificar se a tabela foi criada, execute:
Configuração dos exemplos em uma planilha Python¶
Para configurar e executar estes exemplos em uma planilha Python, crie a tabela de amostra e configure sua planilha Python.
Crie uma planilha SQL e execute o seguinte:
Crie uma planilha Python, definindo o mesmo contexto de banco de dados e esquema que a planilha SQL utilizada para criar a tabela
sample_product_data.
Se você quiser usar os exemplos deste tópico em uma planilha Python, use o exemplo dentro da função do manipulador (por exemplo, main), e use o objeto Session que é passado para a função para criar DataFrames.
Por exemplo, chame o método table do objeto session para criar um DataFrame para uma tabela:
Para revisar a saída produzida pela função, por exemplo, chamando o método show do objeto DataFrame, use a guia Output.
Para examinar o valor retornado pela função, escolha o tipo de dados do valor de retorno de Settings » Return type, e use a guia Results:
Se sua função retornar um DataFrame, use o tipo de retorno padrão de Table.
Se sua função retornar o
listdeRowdo métodocollectde um objeto DataFrame, use Variant para o tipo de retorno.Se sua função retornar qualquer outro valor que possa ser convertido em uma cadeia de caracteres, ou se sua função não retornar um valor, use String como o tipo de retorno.
Consulte Execução das planilhas Python para obter mais detalhes.
Como criar um DataFrame¶
Para criar um DataFrame, você pode usar os métodos e propriedades da classe Session. Cada um dos métodos a seguir constrói um DataFrame a partir de um tipo diferente de fonte de dados.
Você pode executar estes exemplos em seu ambiente de desenvolvimento local ou chamá-los dentro da função main definida em uma planilha Python.
Para criar um DataFrame a partir de dados em uma tabela, exibição ou fluxo, chame o método
table:Para criar um DataFrame a partir de valores especificados, chame o método
create_dataframe:Crie um DataFrame com 4 colunas, «a», «b», «c» e «d»:
Crie outro DataFrame com 4 colunas, «a», «b», «c» e «d»:
Crie um DataFrame e especifique um esquema:
Para criar um DataFrame contendo um intervalo de valores, chame o método
range:Para criar um DataFrame para armazenar os dados de um arquivo em um estágio, use a propriedade
readpara obter um objetoDataFrameReader. No objetoDataFrameReader, chame o método correspondente ao formato dos dados no arquivo:Para criar um DataFrame para armazenar os resultados de uma consulta SQL, chame o método
sql:
É possível usar o método sql para executar instruções SELECT que recuperam dados de tabelas e arquivos preparados, mas o uso do método table e a propriedade read oferece melhor destaque de sintaxe, destaque de erros e preenchimento inteligente de código em ferramentas de desenvolvimento.
Especificação de como o conjunto de dados deve ser transformado¶
Para especificar quais colunas selecionar e como filtrar, ordenar, agrupar etc. os resultados, chame os métodos DataFrame que transformam o conjunto de dados. Para identificar colunas nestes métodos, use a função col ou uma expressão que seja avaliada como coluna. Consulte Como especificar colunas e expressões.
Por exemplo:
Para especificar quais linhas devem ser retornadas, chame o método
filter:Para especificar as colunas que devem ser selecionadas, chame o método
select:Você também pode consultar colunas como esta:
Cada método retorna um novo objeto DataFrame que foi transformado. O método não afeta o objeto DataFrame original. Se você quiser aplicar múltiplas transformações, você pode encadear chamadas a métodos, chamando cada método de transformação subsequente sobre o novo objeto DataFrame retornado pela chamada ao método anterior.
Estes métodos de transformação especificam como criar a instrução SQL e não recuperam dados do banco de dados Snowflake. Os métodos de ação descritos em Como executar uma ação para avaliar um DataFrame realizam a recuperação de dados.
Junção de DataFrames¶
Para juntar objetos DataFrame, chame o método join:
Se ambos DataFrames tiverem a mesma coluna para junção, você pode usar a seguinte sintaxe de exemplo:
Você também pode usar o operador & para conectar expressões de junção:
Se você quiser realizar uma autojunção, você deverá copiar o DataFrame:
Quando há colunas sobrepostas nos DataFrames, o Snowpark irá anexar um prefixo gerado aleatoriamente para as colunas no resultado da junção:
Você pode renomear as colunas sobrepostas usando Column.alias:
Para evitar prefixos aleatórios, você também pode especificar um sufixo para anexar às colunas sobrepostas:
Estes exemplos usam DataFrame.col para especificar as colunas a serem usadas na junção. Consulte Como especificar colunas e expressões para obter mais maneiras de especificar colunas.
Se você precisar unir uma tabela consigo mesma em diferentes colunas, você não pode realizar a autojunção com um único DataFrame. Os exemplos a seguir que usam um único DataFrame para realizar uma autojunção, que falha porque as expressões da coluna para "id" estão presentes nos lados esquerdo e direito da junção:
Em vez disso, use o método clone copy() incluído com o Python para criar um clone do objeto DataFrame, e use os dois objetos DataFrame para realizar a junção:
Como especificar colunas e expressões¶
Ao chamar esses métodos de transformação, pode ser necessário especificar colunas ou expressões que utilizam colunas. Por exemplo, ao chamar o método select, você precisa especificar as colunas a serem selecionadas.
Para se referir a uma coluna, crie um objeto Column chamando a função col no módulo snowflake.snowpark.functions.
Nota
Para criar um objeto Column para um literal, consulte Como usar literais como objetos de coluna.
Ao especificar um filtro, projeção, condição de junção, etc., você pode usar objetos Column em uma expressão. Por exemplo:
Você pode usar objetos
Columncom o métodofilterpara especificar uma condição de filtro:Você pode usar objetos
Columncom o métodoselectpara definir um alias:Você pode usar objetos
Columncom o métodojoinpara definir uma condição de junção:
Ao se referir a colunas em dois objetos DataFrame diferentes que têm o mesmo nome (por exemplo, ao unir os DataFrames naquela coluna), você pode usar o método DataFrame.col em um objeto DataFrame para se referir a uma coluna naquele objeto (por exemplo, df1.col("name") e df2.col("name")).
O exemplo a seguir demonstra como usar o método DataFrame.col para se referir a uma coluna em um DataFrame específico. O exemplo une dois objetos DataFrame, ambos contendo uma coluna chamada key. O exemplo usa o método Column.as para mudar os nomes das colunas no DataFrame recém-criado.
Como utilizar aspas duplas em torno de identificadores de objetos (nomes de tabela, nomes de coluna, etc.)¶
Os nomes de bancos de dados, esquemas, tabelas e estágios que você especificar devem estar em conformidade com requisitos de identificadores do Snowflake.
Crie uma tabela com colunas que diferenciam maiúsculas de minúsculas:
Em seguida, acrescente valores à tabela:
Depois crie um DataFrame para a tabela e consulte a tabela:
Quando você especifica um nome, o Snowflake considera que o nome está em maiúsculas. Por exemplo, as chamadas a seguir são equivalentes:
Se o nome não estiver de acordo com os requisitos de identificador, deve-se usar aspas duplas (") em torno do nome. Use uma barra invertida (\) para escapar o caractere de aspas duplas dentro de uma cadeia de caracteres literal. Por exemplo, como o nome da tabela a seguir não começa com uma letra ou um sublinhado, você deve usar aspas duplas em torno do nome:
Alternativamente, você pode usar aspas simples em vez de barras invertidas para escapar o caractere de aspas duplas dentro de uma cadeia de caracteres literal.
Observe que ao especificar o nome de uma coluna, você não precisa usar aspas duplas em torno do nome. A biblioteca do Snowpark coloca automaticamente o nome da coluna entre aspas duplas caso o nome não cumpra com os requisitos de identificador:
Como outro exemplo, as chamadas a seguir são equivalentes:
Se você já tiver acrescentado aspas duplas em torno de um nome de coluna, a biblioteca não inserirá aspas duplas adicionais em torno do nome.
Em alguns casos, o nome da coluna pode conter caracteres de aspas duplas:
Como explicado em Requisitos para identificadores, para cada caractere de aspas duplas dentro de um identificador de aspas duplas, deve-se usar dois caracteres de aspas duplas (por exemplo, "name_with_""air""_quotes" e """column_name_quoted"""):
Quando um identificador é incluído entre aspas duplas (se você adicionou explicitamente as aspas ou se a biblioteca adicionou as aspas para você), o Snowflake trata o identificador diferenciando maiúsculas de minúsculas:
Em comparação com este exemplo:
Como usar literais como objetos de coluna¶
Para usar um literal em um método que toma um objeto Column como argumento, crie um objeto Column para o literal passando o literal para a função lit no módulo snowflake.snowpark.functions. Por exemplo:
Como converter um objeto de coluna para um tipo específico¶
Para converter um objeto Column a um tipo específico, chame o método cast e passe um objeto do módulo snowflake.snowpark.types. Por exemplo, para converter um literal para um NUMBER com uma precisão de 5 e escala de 2:
Como encadear chamadas a métodos¶
Como cada método que transforma um objeto DataFrame returna um novo objeto DataFrame que tem a transformação aplicada, você pode encadear chamadas a métodos para produzir um novo DataFrame que é transformado de maneiras adicionais.
O exemplo a seguir retorna um DataFrame que está configurado para:
Consultar a tabela
sample_product_data.Retornar a linha com
id = 1.Selecionar as colunas
nameeserial_number.
Neste exemplo:
session.table("sample_product_data")retorna um DataFrame para a tabelasample_product_data.Embora o DataFrame ainda não contenha os dados da tabela, o objeto contém as definições das colunas da tabela.
filter(col("id") == 1)retorna um DataFrame para a tabelasample_product_dataque está preparada para retornar a linha comid = 1.Observe que o DataFrame ainda não contém a linha correspondente da tabela. A linha correspondente não é obtida até que você chame um método de ação.
select(col("name"), col("serial_number"))retorna um DataFrame que contém as colunasnameeserial_numberpara a linha da tabelasample_product_dataque temid = 1.
A ordem das chamadas é importante quando você encadeia chamadas de métodos. Cada chamada de método retorna um DataFrame que foi transformado. Certifique-se de que as chamadas subsequentes funcionem com os DataFrame transformados.
Ao usar o Snowpark Python, talvez seja necessário fazer as chamadas ao método select e filter em uma ordem diferente daquela em que você usaria as palavras-chave equivalentes (SELECT e WHERE) em uma instrução SQL.
Como obter definições das colunas¶
Para obter a definição das colunas no conjunto de dados para o DataFrame, chame a propriedade schema. Esse método retorna um objeto StructType que contém uma list de StructField objetos. Cada objeto StructField contém a definição de uma coluna.
No objeto devolvido StructType, os nomes das colunas são sempre normalizados. Identificadores sem aspas são retornados em maiúsculas, e identificadores entre aspas são devolvidos na caixa em que foram definidos.
O exemplo a seguir cria um DataFrame contendo as colunas ID e 3rd. Para o nome de coluna 3rd, a biblioteca do Snowpark coloca o nome automaticamente entre aspas duplas ("3rd") porque o nome não cumpre os requisitos para um identificador.
O exemplo chama a propriedade schema e depois chama a propriedade names no objeto StructType retornado para obter uma list de nomes de coluna. Os nomes são normalizados no StructType retornado pela propriedade schema.
Como executar uma ação para avaliar um DataFrame¶
Como mencionado anteriormente, o DataFrame é avaliado lentamente, o que significa que a instrução SQL não é enviada ao servidor para execução até que você execute uma ação. Uma ação faz com que o DataFrame seja avaliado e envia a instrução SQL correspondente para o servidor para execução.
Os seguintes métodos executam uma ação:
Classe |
Método |
Descrição |
|---|---|---|
|
|
Avalia o DataFrame e retorna o conjunto de dados resultante como uma |
|
|
Avalia o DataFrame e retorna o número de linhas. |
|
|
Avalia o DataFrame e imprime as linhas no console. Este método limita o número de linhas a 10 (por padrão). |
|
|
Armazena os dados no DataFrame para a tabela especificada. Consulte Como salvar dados em uma tabela. |
Por exemplo, para executar uma consulta em uma tabela e retornar os resultados, chame o método collect:
Para executar a consulta e retornar o número de resultados, chame o método count:
Para executar uma consulta e imprimir os resultados para o console, chame o método show:
Para limitar o número de linhas a 20:
Nota
Se você chamar a propriedade schema para obter as definições das colunas no DataFrame, você não precisará chamar um método de ação.
Como salvar dados em uma tabela¶
Para salvar o conteúdo de um DataFrame em uma tabela:
Chame a propriedade
writepara obter um objetoDataFrameWriter.Chame o método
modeno objetoDataFrameWritere especifique o modo. Para obter mais informações, consulte a documentação da API em. Esse método retorna um novo objetoDataFrameWriterque é configurado com o modo especificado.Chame o método
save_as_tableno objetoDataFrameWriterpara salvar o conteúdo do DataFrame em uma tabela especificada.
Observe que não é necessário chamar um método separado (por exemplo, collect) para executar a instrução SQL que salva os dados na tabela.
Por exemplo:
Como criar uma exibição a partir de um DataFrame¶
Para criar uma exibição a partir de um DataFrame, chame o método create_or_replace_view, que imediatamente cria a nova exibição:
Em uma planilha Python, porque você executa a planilha no contexto de um banco de dados e esquema, você pode executar o seguinte para criar uma exibição:
As exibições que você cria ao chamar create_or_replace_view são persistentes. Se você não precisar mais dessa exibição, você pode excluir a exibição manualmente.
Alternativamente, use o método create_or_replace_temp_view, que cria uma exibição temporária. A exibição temporária só fica disponível na sessão em que ela é criada.
Como trabalhar com arquivos em um estágio¶
Esta seção explica como consultar dados em um arquivo em um estágio do Snowflake. Para outras operações em arquivos, use instruções SQL.
Para consultar dados em arquivos em um estágio do Snowflake, use a classe DataFrameReader:
Chame o método
readna classeSessionpara acessar um objetoDataFrameReader.Se os arquivos estiverem no formato CSV, descreva os campos no arquivo. Para fazer isso:
Crie um objeto
StructTypeque consiste em umalistde objetosStructFielddescrevendo os campos no arquivo.Para cada objeto
StructField, especifique o seguinte:O nome do campo.
O tipo de dados do campo (especificado como um objeto no módulo
snowflake.snowpark.types).Se o campo é ou não anulável.
Por exemplo:
Chame a propriedade
schemano objetoDataFrameReader, passando o objetoStructType.Por exemplo:
A propriedade
schemaretorna um objetoDataFrameReaderque é configurado para ler arquivos contendo os campos especificados.Note que você não precisa fazer isso para arquivos em outros formatos (como JSON). Para esses arquivos, o
DataFrameReadertrata os dados como um único campo do tipo VARIANT com o nome de campo$1.
Se você precisar especificar informações adicionais sobre como os dados devem ser lidos (por exemplo, que os dados estão comprimidos ou que um arquivo CSV usa um ponto-e-vírgula em vez de uma vírgula para delimitar campos), chame os métodos
optionouoptionsdo objetoDataFrameReader.O método
optionobtém um nome e um valor da opção que você deseja definir e permite combinar múltiplas chamadas encadeadas, enquanto o métodooptionsobtém um dicionário dos nomes das opções e seus valores correspondentes.Para os nomes e valores das opções de formato do arquivo, veja a documentação documentação sobre CREATE FILE FORMAT.
Você também pode definir as opções de cópia descritas na documentação COPY INTO TABLE. Observe que a definição de opções de cópia pode resultar em uma estratégia de execução mais cara quando você obtém os dados para o DataFrame.
O exemplo a seguir configura o objeto
DataFrameReaderpara consultar dados em um arquivo CSV que não é compactado e que usa um ponto-e-vírgula como delimitador de campo.Os métodos
optioneoptionsretornam um objetoDataFrameReaderque é configurado com as opções especificadas.Chame o método correspondente ao formato do arquivo (por exemplo, o método
csv) passando o local do arquivo.Os métodos correspondentes ao formato de um arquivo retornam um objeto DataFrame que é configurado para manter os dados nesse arquivo.
Use os métodos do objeto DataFrame para realizar quaisquer transformações necessárias no conjunto de dados (por exemplo, selecionar campos específicos, filtrar linhas, etc.).
Por exemplo, para extrair o elemento
colorde um arquivo JSON no estágio chamadomy_stage:Como explicado anteriormente, para arquivos em formatos diferentes de CSV (por exemplo JSON), o
DataFrameReadertrata os dados no arquivo como uma única coluna VARIANT com o nome$1.Esse exemplo usa a função
sql_exprno módulosnowflake.snowpark.functionspara especificar o caminho para o elementocolor.Observe que a função
sql_exprnão interpreta ou modifica o argumento de entrada. A função só permite formar expressões e trechos em SQL que ainda não são suportados pela API do Snowpark.Chame um método de ação para consultar os dados no arquivo.
Como é o caso de DataFrames para tabelas, os dados não são obtidos no DataFrame até que você chame um método de ação.
Como trabalhar com dados semiestruturados¶
Usando um DataFrame, você pode consultar e acessar dados semiestruturados (por exemplo, dados de JSON). As próximas seções explicam como trabalhar com dados semiestruturados em um DataFrame.
Nota
Os exemplos nestas seções usam os dados de exemplo em Amostra de dados usados em exemplos.
Como percorrer dados semiestruturados¶
Para se referir a um campo ou elemento específico em dados semiestruturados, use os seguintes métodos do objeto Column:
Use o atributo
col_object["<field_name>"]para retornar um objetoColumnpara o campo em um OBJECT (ou um VARIANT que contenha um OBJECT).Use
col_object[<index>]para retornar um objetoColumnpara um elemento em uma ARRAY (ou um VARIANT que contenha uma ARRAY).
Nota
Se o nome do campo ou elementos no caminho forem irregulares e dificultarem o uso da indexação descrita acima, você pode usar get, get_ignore_case ou get_path como alternativa.
Por exemplo, o seguinte código seleciona o campo dealership nos objetos na coluna src dos dados de exemplo:
O código imprime a seguinte saída:
Nota
Os valores no DataFrame estão entre aspas duplas porque eles são retornados como literais de cadeias de caracteres. Para converter esses valores para um tipo específico, consulte Conversão explícita de valores em dados semiestruturados.
Você também pode encadear chamadas a métodos para percorrer um caminho para um campo ou elemento específico.
Por exemplo, o código a seguir seleciona o campo name no objeto salesperson:
O código imprime a seguinte saída:
Como outro exemplo, o código a seguir seleciona o primeiro elemento do campo vehicle, que contém uma array de veículos. O exemplo também seleciona o campo price do primeiro elemento.
O código imprime a seguinte saída:
Como alternativa para acessar os campos da maneira mencionada acima, você pode usar as funções get, get_ignore_case, ou get_path se o nome do campo ou elementos no caminho forem irregulares.
Por exemplo, as duas linhas de código a seguir imprimem o valor de um campo especificado em um objeto:
Da mesma forma, as seguintes linhas de código imprimem o valor de um campo em um caminho especificado em um objeto:
Conversão explícita de valores em dados semiestruturados¶
Por padrão, os valores de campos e elementos são retornados como literais de cadeias de caracteres (incluindo as aspas duplas), como mostrado nos exemplos acima.
Para evitar resultados inesperados, chame o método de converter para converter o valor para um tipo específico. Por exemplo, o seguinte código imprime os valores sem e com conversão:
O código imprime a seguinte saída:
Como achatar uma array de objetos em linhas¶
Se você precisar “achatar” dados semiestruturados em um DataFrame (por exemplo, produzir uma linha para cada objeto na matriz), chame flatten usando o método join_table_function. Esse método é equivalente à função FLATTEN do SQL. Se você passar um caminho para um objeto ou array, o método retorna um DataFrame contendo uma linha para cada campo ou elemento no objeto ou array.
Por exemplo, nos dados de exemplo, src:customer é um conjunto de objetos que contém informações sobre um cliente. Cada objeto contém um campo name e address.
Se você passar esse caminho para a função flatten:
o método retornará um DataFrame:
A partir desse DataFrame, você poderá selecionar os campos name e address de cada objeto no campo VALUE:
O código a seguir complementa o exemplo anterior ao converter os valores para um tipo específico e mudar os nomes das colunas:
Como executar instruções SQL¶
Para executar uma instrução SQL que você especificar, chame o método sql na classe Session e passe a instrução a ser executada. O método retorna um DataFrame.
Note que a instrução SQL não será executada até que você chame um método de ação.
Se você quiser chamar métodos para transformar o DataFrame (por exemplo, filter, select, etc.), observe que esses métodos só funcionam se a instrução SQL subjacente for uma instrução SELECT. Os métodos de transformação não são suportados para outros tipos de instruções SQL.
Envio de consultas ao Snowpark simultaneamente¶
Nota
Esse recurso requer a versão 1.24 ou superior da biblioteca Snowpark para Python e a versão 8.46 ou superior do servidor.
Os objetos de sessão thread-safe permitem que diferentes partes do código do Snowpark Python sejam executadas simultaneamente enquanto usam a mesma sessão. Isso permite que várias operações - como transformações em vários DataFrames - sejam executadas simultaneamente. Isso é especialmente útil quando você está trabalhando com consultas que podem ser processadas independentemente no servidor Snowflake e se alinha com uma abordagem de multithreading mais tradicional.
O Global Interpreter Lock (GIL) em Python é um mutex que protege o acesso aos objetos Python, impedindo que vários threads nativos executem o bytecode Python simultaneamente. Embora as operações vinculadas a E/S ainda possam se beneficiar do modelo de threading do Python devido ao fato de o GIL ser liberado durante as operações de E/S, os threads vinculados a CPU não atingirão o verdadeiro paralelismo porque somente um thread pode ser executado por vez.
Além disso, quando usado dentro do Snowflake (por exemplo, em um procedimento armazenado), o servidor Python do Snowpark gerencia o Global Interpreter Lock (GIL), liberando-o antes de enviar as consultas ao Snowflake. Isso garante que a verdadeira simultaneidade possa ser obtida ao enfileirar várias consultas de threads separados. Com esse gerenciamento, o Snowpark permite que vários threads enviem consultas simultaneamente, garantindo a execução paralela ideal.
Benefícios do uso de objetos de sessão Thread-Safe no Snowpark¶
A capacidade de executar várias operações do DataFrame ao mesmo tempo pode trazer os seguintes benefícios aos usuários do Snowpark:
Desempenho aprimorado: os objetos de sessão thread-safe permitem que você execute várias consultas do Snowpark Python ao mesmo tempo, reduzindo o tempo de execução geral. Por exemplo, se você precisar processar várias tabelas de forma independente, esse recurso reduzirá significativamente o tempo necessário para concluir o trabalho, pois não será mais necessário aguardar a conclusão do processamento de cada tabela antes de iniciar a próxima.
Utilização eficiente da computação: o envio de consultas simultâneas garante que os recursos de computação do Snowflake sejam usados de forma eficiente, reduzindo os tempos ociosos.
Usabilidade: os objetos de sessão thread-safe integram-se perfeitamente ao multithreading nativo das Python APIs, o que permite que os desenvolvedores aproveitem as ferramentas internas do Python para controlar o comportamento do thread e otimizar a execução paralela.
Os objetos de sessão thread-safe e os trabalhos assíncronos podem se complementar, dependendo do seu caso de uso. Os trabalhos assíncronos são úteis quando o usuário não precisa esperar que os trabalhos terminem, permitindo a execução sem bloqueio e sem gerenciamento de pool de threads. Os objetos de sessão thread-safe, por outro lado, são úteis quando você deseja enviar várias consultas simultaneamente do lado do cliente. Em alguns casos, os blocos de código também podem conter trabalhos assíncronos, permitindo que ambos os métodos sejam usados juntos de forma eficaz.
A seguir, alguns exemplos em que os objetos de sessão thread-safe podem aprimorar seu pipeline de dados.
Exemplo 1: carregamento simultâneo de várias tabelas¶
Este exemplo demonstra o carregamento de dados de três arquivos CSV diferentes em três tabelas separadas, usando três threads para executar o comando COPY INTO simultaneamente.
Exemplo 2: processamento simultâneo de várias tabelas¶
Este exemplo demonstra como você pode usar vários threads para filtrar, agregar e inserir simultaneamente dados em uma tabela de resultados de cada tabela de transação do cliente (transaction_customer1, transaction_customer2 e transaction_customer3).
Limitações do uso de objetos de sessão Thread-Safe¶
Se precisar gerenciar várias transações simultaneamente, é importante usar vários objetos de sessão, pois vários threads de uma única sessão não são compatíveis com transações simultâneas.
Alterar as configurações de tempo de execução da sessão (incluindo variáveis de sessão do Snowflake, como banco de dados, esquema, warehouse e configurações do lado do cliente, como cte_optimization_enabled, sql_simplifier_enabled) enquanto outros threads estão ativos pode levar a um comportamento inesperado. Para evitar conflitos, é melhor usar objetos de sessão separados se diferentes threads exigirem configurações distintas. Por exemplo, se você precisar executar operações em diferentes bancos de dados em paralelo, certifique-se de que cada thread tenha seu próprio objeto de sessão em vez de compartilhar a mesma sessão.
Como retornar o conteúdo de um DataFrame como um DataFrame do Pandas¶
Para retornar o conteúdo de um DataFrame como um DataFrame do Pandas, use o método to_pandas.
Por exemplo:
DataFrames Snowpark vs. DataFrame Snowpark pandas: Qual devo escolher?¶
Ao instalar a biblioteca Snowpark Python, você tem a opção de usar a DataFrames API ou o pandas on Snowflake.
Os DataFrames Snowpark foram modelados a partir do PySpark, enquanto o Snowpark pandas foi criado para estender a funcionalidade do DataFrame Snowpark e fornecer uma interface familiar aos usuários do pandas para facilitar a migração e adoção. Recomendamos usar diferentes APIs dependendo do seu caso de uso e preferência:
Use os Snowpark pandas se você… |
Use o DataFrames Snowpark se você… |
|---|---|
Prefere trabalhar com ou ter código existente escrito em pandas |
Prefere trabalhar com ou ter código existente escrito em Spark |
Tem um fluxo de trabalho que envolva análise interativa e exploração iterativa |
Tem um fluxo de trabalho que envolva processamento em lote e desenvolvimento iterativo limitado |
Está acostumado a trabalhar com operações de DataFrame que são executadas imediatamente |
Está acostumado a trabalhar com operações de DataFrame que são avaliadas ociosamente |
Prefere que os dados sejam consistentes e ordenados durante as operações |
Concorda com os dados não serem ordenados? |
Concorda em ter um desempenho ligeiramente mais lento em comparação com o DataFrames Snowpark, em favor de uma API mais fácil de usar |
Prioriza o desempenho em vez da facilidade de uso |
Do ponto de vista da implementação, os DataFrames Snowpark e os DataFrames pandas são semanticamente diferentes. Como os DataFrames Snowpark são modelados a partir do PySpark, eles operam na fonte de dados original, obtêm os dados atualizados mais recentes e, portanto, não mantêm a ordem das operações. Snowpark pandas é modelado a partir do pandas, que opera em um instantâneo dos dados, mantém a ordem durante a operação e permitem indexação posicional baseada na ordem. A manutenção de pedidos é útil para inspeção visual de dados na análise interativa de dados.
Para obter mais informações, consulte Como usar o pandas on Snowflake com o DataFrames Snowpark.