Ir para o conteúdo principal

Apresentando as funções de tabela definidas pelo usuário (UDTFs) do Python

O que são as funções de tabela definidas pelo usuário (UDTFs) do Python, por que elas são importantes e como usá-las

pyhton

Published: November 7, 2023

Data Engineering5 min de leitura

O Apache Spark™ 3.5 e o Databricks Runtime 14.0 trouxeram um recurso empolgante: funções de tabela definidas pelo usuário (UDTFs) em Python. Nesta postagem no blog, vamos explorar o que são UDTFs, por que são tão poderosas e como você pode usá-las.

O que são funções de tabela definidas pelo usuário (UDTFs) do Python

Uma função de tabela do Python definida pelo usuário (UDTF) é um novo tipo de função que retorna uma tabela como saída, em vez de um único valor escalar como resultado. Depois de registradas, elas podem aparecer na cláusula FROM de uma SQL query.

Cada UDTF do Python aceita zero ou mais argumentos, em que cada argumento pode ser um valor escalar constante, como um número inteiro ou uma strings. O corpo da função pode inspecionar os valores desses argumentos para tomar decisões sobre quais dados retornar.

Por que você deve usar as UDTFs do Python

Resumindo, se você quer uma função que gere várias linhas e colunas e quer aproveitar o rico ecossistema do Python, as UDTFs do Python são para você.

UDTFs do Python vs. UDFs do Python

Embora as UDFs do Python no Spark sejam projetadas para aceitar zero ou mais valores escalares como entrada e retornar um único valor como saída, as UDTFs oferecem mais flexibilidade. Elas podem retornar várias linhas e colunas, ampliando os recursos das UDFs.

UDTFs em Python vs. UDTFs em SQL

As UDTFs em SQL são eficientes e versáteis, mas o Python oferece um conjunto mais rico de bibliotecas e ferramentas. Para transformações ou cálculos que precisam de técnicas avançadas (como funções estatísticas ou inferências de machine learning), o Python se destaca.

Como criar uma UDTF do Python

Vejamos uma UDTF básica do Python:

No código acima, criamos uma UDTF simples que recebe dois números inteiros como entrada e produz duas colunas como saída: o número original e seu quadrado.

O primeiro o passo para implementar uma UDTF é definir uma classe, neste caso

A seguir, você precisa implementar o método eval da UDTF. Este é o método que faz os cálculos e retorna linhas, onde você define os argumentos de entrada da função.

Observe o uso da instrução yield; uma UDTF do Python exige que o tipo de retorno seja uma tupla ou um objeto Row para que os resultados possam ser processados corretamente.

Por fim, para marcar a classe como uma UDTF, você pode usar o decorador @udtf e definir o tipo de retorno da UDTF. Observe que o tipo de retorno deve ser um StructType com formatação de bloco ou uma string DDL que represente um StructType com formatação de bloco no Spark.

Como usar uma UDTF do Python

Em Python

Você pode invocar uma UDTF diretamente usando o nome da classe.

Em SQL

Primeiro, registro a UDTF do Python:

Em seguida, você pode usá-la em SQL como uma função com valor de tabela na cláusula FROM de uma query:

UDTFs do Python otimizadas para Arrow

O Apache Arrow é um formato de dados colunares na memória que permite transferências de dados eficientes entre processos Java e Python. Ele pode aumentar significativamente o desempenho quando a UDTF gera muitas linhas. A otimização do Arrow pode ser ativada usando useArrow=True.

Caso de uso real com LangChain

O exemplo acima pode parecer básico. Vamos nos aprofundar com um exemplo divertido, integrando UDTFs em Python com o LangChain.

Agora, você pode invocar a UDTF:

Comece a usar UDTFs do Python hoje mesmo

Se você deseja realizar transformações de dados complexas, enriquecer seus datasets ou simplesmente explorar novas maneiras de analisar seus dados, as UDTFs do Python são uma adição valiosa ao seu kit de ferramentas. Experimente este Notebook e consulte a documentação para mais informação.

Trabalhos futuros

Esta funcionalidade é apenas o começo da plataforma de UDTF do Python. Muitos outros recursos estão atualmente em desenvolvimento no Apache Spark para serem disponibilizados em versões futuras. Por exemplo, será possível oferecer suporte a:

  • Uma análise polimórfica na qual as chamadas de UDTF podem computar dinamicamente seus esquemas de saída em resposta aos argumentos específicos fornecidos para cada chamada (incluindo os tipos de argumentos de entrada fornecidos e os valores de quaisquer argumentos escalares literais).
  • Passar relações de entrada inteiras para chamadas de UDTF na cláusula FROM do SQL usando a palavra-chave TABLE. Isso funcionará com referências diretas a tabelas de catálogo, bem como com subconsultas de tabela arbitrárias. Será possível especificar o particionamento personalizado da tabela de entrada em cada query para definir quais subconjuntos de linhas da tabela de entrada serão consumidos pela mesma instância da classe UDTF no método eval.
  • Realizando a inicialização arbitrária para qualquer chamada de UDTF apenas uma vez no momento de programar a query e propagando esse estado para todas as futuras instâncias da classe para consumo futuro. Isso significa que o esquema da tabela de saída da UDTF retornado pelo método estático inicial "analyze" poderá ser consumido por todas as chamadas __init__ futuras para a mesma query.
  • Muitos outros recursos interessantes!

 

(This blog post has been translated using AI-powered tools) Original Post

Nunca perca uma postagem da Databricks

Inscreva-se nas categorias de seu interesse e receba as últimas postagens na sua caixa de entrada