Ir para o conteúdo principal

Apresentando a API DataFrame para Funções de Valor de Tabela

Uma Maneira Mais Simples e Direta de Trabalhar com TVFs

Introducing the DataFrame API for Table-Valued Functions

Published: June 25, 2025

Engenharia7 min de leitura

Summary

  • As Funções de Valor de Tabela oferecem maneiras poderosas e mais simples de realizar transformações em massa em seus pipelines de dados
  • Use-as com a API DataFrame para encadeamento de operadores em suas transformações sequenciais
  • Empregue junção lateral com DataFrames para expansão dinâmica de transformação baseada em linha, retornando um conjunto expandido de transformações

As Funções de Valor de Tabela (TVFs) têm sido uma ferramenta poderosa para o processamento de dados estruturados. Elas permitem que funções retornem múltiplas linhas e colunas em vez de apenas um único valor. Anteriormente, o uso de TVFs no Apache Spark exigia SQL, tornando-os menos flexíveis para usuários que preferem a API DataFrame.

Temos o prazer de anunciar a nova API DataFrame para Funções de Valor de Tabela. Os usuários agora podem invocar TVFs diretamente dentro das operações do DataFrame, tornando as transformações mais simples, mais compostas e totalmente integradas ao fluxo de trabalho do DataFrame do Spark. Isso está disponível no Databricks Runtime (DBR) 16.1 e acima.

Neste blog, vamos explorar o que são TVFs e como usá-los, tanto com argumentos escalares quanto de tabela. Considere os três benefícios ao usar TVTs:

Principais benefícios

  • Integração Nativa com DataFrame: Chame as TVFs diretamente usando spark.tvf.<nome_da_função>,<function_name> sem a necessidade de SQL.
  • Encadeável e Componível: Combine TVFs sem esforço com suas transformações de DataFrame favoritas, como .filter(), .select(), e mais.
  • Suporte a Junção Lateral (disponível no DBR 17.0): Use TVFs em junções para gerar e expandir dinamicamente as linhas com base nos dados de cada linha de entrada.

Usando a API DataFrame da Função de Valor de Tabela (TVF)

Vamos começar com um exemplo simples usando uma TVF integrada. Spark vem com TVFs úteis como variant_explode, que expande estruturas JSON em várias linhas.

Aqui está a abordagem SQL:

E aqui está a abordagem equivalente da API DataFrame:

Como você pode ver acima, é simples usar TVFs de qualquer maneira: através do SQL ou da API DataFrame. Ambos dão o mesmo resultado, usando argumentos escalares.

Aceitando Argumentos de Tabela

E se você quiser usar uma tabela como argumento de entrada? Isso é útil quando você quer operar em linhas de dados. Vamos olhar para um exemplo onde queremos calcular a duração e os custos de viagem de carro e avião.

Vamos imaginar um DataFrame simples:

Precisamos que nossa classe manipule uma linha de tabela como argumento. Note que o método eval recebe um argumento Row de uma tabela em vez de um argumento escalar.

Com essa definição de manipulação de um Row de uma tabela, podemos calcular o resultado desejado enviando nosso DataFrame como um argumento de tabela.

Ou você pode criar uma tabela, registrar a UDTF e usá-la em uma instrução SQL da seguinte maneira:

Alternativamente, você pode obter o mesmo resultado chamando a TVF com uma junção lateral, que é útil com argumentos escalares (leia abaixo para um exemplo).

Levando para o Próximo Nível: Junções Laterais

Você também pode usar junções laterais para chamar uma TVF com um DataFrame inteiro, linha por linha. O suporte para Junção Lateral e Argumentos de Tabela está disponível no DBR 17.0.

Cada junção lateral permite que você chame uma TVF em cada linha de um DataFrame, expandindo dinamicamente os dados com base nos valores dessa linha. Vamos explorar alguns exemplos com mais de uma única linha.

Junção Lateral com TVFs Integradas

Digamos que temos um DataFrame onde cada linha contém um array de números. Como antes, podemos usar variant_explode para explodir cada array em linhas individuais.

Aqui está a abordagem SQL:

E aqui está a abordagem equivalente do DataFrame:

Junção Lateral com Python UDTFs

Às vezes, as TVFs integradas simplesmente não são suficientes. Você pode precisar de uma lógica personalizada para transformar seus dados de uma maneira específica. É aí que as Funções de Tabela Definidas pelo Usuário (UDTFs) entram em ação! Python UDTFs permitem que você escreva suas próprias TVFs em Python, dando a você controle total sobre o processo de expansão de linhas.

Aqui está uma simples UDTF Python que gera uma sequência de números de um valor inicial a um valor final, e retorna tanto o número quanto seu quadrado:

Agora, vamos usar esta UDTF em uma junção lateral. Imagine que temos um DataFrame com colunas de início e fim, e queremos gerar as sequências de números para cada linha.

Aqui está outro exemplo ilustrativo de como usar uma UDTF usando um lateralJoin [Ver documentação] com um DataFrame com cidades e distância entre elas. Queremos aumentar e gerar uma nova tabela com informações adicionais, como tempo para viajar entre elas de carro e avião, juntamente com custos adicionais em passagens aéreas.

Vamos usar nosso DataFrame de distâncias aéreas acima:

Podemos modificar nosso Python UDTF anterior que calcula a duração e o custo da viagem entre duas cidades, fazendo com que o método eval aceite argumentos escalares:

Finalmente, vamos chamar nossa UDTF com um lateralJoin, nos dando a saída desejada. Ao contrário do nosso exemplo anterior de companhia aérea, o método eval deste UDTF aceita argumentos escalares.

Conclusão

A API DataFrame para Funções de Valor de Tabela oferece uma abordagem mais coesa e intuitiva para a transformação de dados dentro do Spark. Demonstramos três abordagens para empregar TVFs: SQL, DataFrame e UDTF Python. Ao combinar TVFs com a API DataFrame, você pode processar várias linhas de dados e realizar transformações em massa.

Além disso, ao passar argumentos de tabela ou usar junções laterais para Python UDTFs, você pode implementar lógica de negócios específica para necessidades específicas de processamento de dados. Mostramos dois exemplos específicos de transformação e aumento de sua lógica de negócios para produzir a saída desejada, usando tanto argumentos escalares quanto de tabela.

Encorajamos você a explorar as capacidades desta nova API para otimizar suas transformações de dados e fluxos de trabalho. Esta nova funcionalidade está disponível no lançamento do Apache Spark™ 4.0.0. Se você é um cliente Databricks, pode usá-lo no DBR 16.1 e acima.

 

(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