Pular para o conteúdo principal

Funções de tabela definidas pelo usuário (UDTFs) do Python no Unity Catalog

info

Visualização

O registro de Python UDTFs no Unity Catalog está em visualização pública.

A função de tabela definida pelo usuário (UDTF) do site Unity Catalog permite registrar funções que retornam tabelas completas em vez de valores escalares. Diferentemente das funções escalares que retornam um único valor de resultado em cada chamada, as UDTFs são invocadas em uma cláusula FROM de uma instrução SQL e podem retornar várias linhas e colunas.

Os UDTFs são particularmente úteis para:

  • Transformando matrizes ou estruturas de dados complexas em várias linhas
  • Integração do APIs ou serviço externo ao SQL fluxo de trabalho
  • Implementação de lógica personalizada de geração ou enriquecimento de dados
  • Processamento de dados que requerem operações com estado entre as linhas

Cada chamada de UDTF pode aceitar zero ou mais argumentos. Esses argumentos podem ser expressões escalares ou argumentos de tabela representando tabelas de entrada inteiras.

Os UDTFs podem ser registrados de duas maneiras:

Requisitos

Unity Catalog Python Os UDTFs são compatíveis com os seguintes tipos de compute:

  • Clássico compute com modo de acesso padrão (Databricks Runtime 17.1 e acima)
  • SQL warehouse (serverless, pro e classic)

Criar um UDTF no Unity Catalog

Use SQL DDL para criar um UDTF governado no Unity Catalog. Os UDTFs são invocados usando a cláusula FROM de uma instrução SQL.

SQL
CREATE OR REPLACE FUNCTION square_numbers(start INT, end INT)
RETURNS TABLE (num INT, squared INT)
LANGUAGE PYTHON
HANDLER 'SquareNumbers'
DETERMINISTIC
AS $$
class SquareNumbers:
"""
Basic UDTF that computes a sequence of integers
and includes the square of each number in the range.
"""
def eval(self, start: int, end: int):
for num in range(start, end + 1):
yield (num, num * num)
$$;

SELECT * FROM square_numbers(1, 5);

Output
+-----+---------+
| num | squared |
+-----+---------+
| 1 | 1 |
| 2 | 4 |
| 3 | 9 |
| 4 | 16 |
| 5 | 25 |
+-----+---------+

A Databricks implementa UDTFs Python como classes Python com um método obrigatório eval que produz linhas de saída.

Exemplos práticos

Os exemplos a seguir demonstram casos de uso do mundo real para UDTFs do Unity Catalog Python, progredindo de transformações de dados simples para integrações externas complexas.

Exemplo: Reimplementação explode

Embora o Spark forneça uma função explode integrada, a criação de sua própria versão demonstra o padrão UDTF fundamental de receber uma única entrada e produzir várias linhas de saída.

SQL
CREATE OR REPLACE FUNCTION my_explode(arr ARRAY<STRING>)
RETURNS TABLE (element STRING)
LANGUAGE PYTHON
HANDLER 'MyExplode'
DETERMINISTIC
AS $$
class MyExplode:
def eval(self, arr):
if arr is None:
return
for element in arr:
yield (element,)
$$;

Use a função diretamente em uma consulta SQL:

SQL
SELECT element FROM my_explode(array('apple', 'banana', 'cherry'));
Output
+---------+
|| element |
+---------+
|| apple |
|| banana |
|| cherry |
+---------+

Ou aplique-o aos dados da tabela existente com um LATERAL join:

SQL
SELECT s.*, e.element
FROM my_items AS s,
LATERAL my_explode(s.items) AS e;

Exemplo: Geolocalização de endereço IP via API REST

Este exemplo demonstra como os UDTFs podem integrar APIs externas diretamente em seu fluxo de trabalho SQL. Em vez de exigir processos ETL separados, o analista pode enriquecer os dados com chamadas API de tempo real usando a sintaxe SQL conhecida.

SQL
CREATE OR REPLACE FUNCTION ip_to_location(ip_address STRING)
RETURNS TABLE (city STRING, country STRING)
LANGUAGE PYTHON
HANDLER 'IPToLocationAPI'
AS $$
class IPToLocationAPI:
def eval(self, ip_address):
import requests
api_url = f"https://api.ip-lookup.example.com/{ip_address}"
try:
response = requests.get(api_url)
response.raise_for_status()
data = response.json()
yield (data.get('city'), data.get('country'))
except requests.exceptions.RequestException as e:
# Returns nothing if the ip_address is invalid
return
$$;
nota

Python Os UDTFs permitem o tráfego de rede TCP/UDP pelas portas 80, 443 e 53 usando serverless compute ou compute configurados com o modo de acesso padrão.

Use a função para enriquecer os dados da Web log com informações geográficas:

SQL
SELECT
l.timestamp,
l.request_path,
geo.city,
geo.country
FROM web_logs AS l,
LATERAL ip_to_location(l.ip_address) AS geo;

Essa abordagem permite a análise geográfica em tempo real sem a necessidade de tabelas de pesquisa pré-processadas ou um pipeline de dados separado. O UDTF lida com solicitações HTTP, análise de JSON e tratamento de erros, tornando as fontes de dados externas acessíveis por meio de consultas padrão em SQL.

Defina DETERMINISTIC se sua função produzir resultados consistentes

Adicione DETERMINISTIC à sua definição de função se ela produzir as mesmas saídas para as mesmas entradas. Isso permite otimizações de consulta para melhorar o desempenho.

Em default, os lotes Unity Catalog Python UDTFs são considerados não determinísticos, a menos que sejam declarados explicitamente. Exemplos de funções não determinísticas incluem: geração de valores aleatórios, acesso a horários ou datas atuais ou chamadas de API externas.

Consulte CREATE FUNCTION (SQL e Python)

Limitações

As seguintes limitações se aplicam aos UDTFs do Unity Catalog Python:

Próximos passos