Publicado: 26 de junho de 2025
por Allison Wang, Takuya Ueshin e Jules Damji
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
spark.tvf.<nome_da_função>,<function_name> sem a necessidade de SQL..filter(), .select(), e mais.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.
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).
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.
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:
