Funções definidas pelo usuário (UDFs) no Unity Catalog

Importante

Este recurso está em versão prévia pública e requer o Databricks Runtime 14.1 e acima.

Databricks fornece uma sintaxe nativa de SQL para registrar funções personalizadas em esquemas governados pelo Unity Catalog. A sintaxe SQL CREATE FUNCTION padrão é compatível com todos os compute do Unity Catalog no Databricks. No pro SQL warehouse e no Databricks Runtime 14.1 e acima, você pode incluir código Python em funções registradas no Unity Catalog.

Observação

view registrada na query que usa UDFs deve usar compute compatível. SQL warehouse e Databricks Runtime 14.0 e abaixo não podem resolver view que contêm UDFs registradas no Unity Catalog.

Para obter a referência completa da linguagem SQL, consulte CREATE FUNCTION (SQL e Python).

Para obter informações sobre como o Unity Catalog gerencia permissões em funções, consulte CREATE FUNCTION.

Importante

As UDFs do Python registradas como funções no Unity Catalog diferem em escopo e suporte das UDFs do PySpark com escopo para um Notebook ou SparkSession. Consulte Funções escalares definidas pelo usuário - Python.

Funções SQL personalizadas no Unity Catalog

Quando você cria uma função SQL usando compute configurada para Unity Catalog, a função é registrada no esquema atualmente ativo por default. O exemplo a seguir demonstra a sintaxe que você pode usar para declarar um catálogo de destino e um esquema para uma nova função:

CREATE FUNCTION target_catalog.target_schema.roll_dice()
    RETURNS INT
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    COMMENT 'Roll a single 6 sided die'
    RETURN (rand() * 6)::INT + 1;

Todos os usuários com privilégios suficientes na função podem usar a função em ambientes compute configurados para o Unity Catalog, como no exemplo a seguir:

SELECT target_catalog.target_schema.roll_dice()

Observação

Você pode usar UDFs usando LANGUAGE SQL para retornar tabelas ou valores escalares.

registrar um Python UDF no Unity Catalog

No Databricks Runtime 14.1 e acima, você pode usar a instrução SQL CREATE FUNCTION para registrar UDFs escalares do Python no Unity Catalog.

Importante

Somente SQL warehouse oferece suporte a UDFs Python para Unity Catalog.

Os UDFs do Python são projetados para fornecer a expressividade total do Python diretamente nas funções SQL, permitindo operações personalizadas, como transformações avançadas, mascaramento de dados e hash.

As UDFs do Python são executadas em um ambiente seguro e isolado e não têm acesso a sistemas de arquivos ou serviços internos.

UDFs Python executados em modo de acesso compartilhado permitem tráfego de rede TCP/UDP nas portas 80, 443 e 53.

Consulte Quais UDFs são mais eficientes?.

Observação

A sintaxe e a semântica para UDFs do Python no Unity Catalog são diferentes das UDFs do Python registradas na SparkSession. Consulte Funções escalares definidas pelo usuário - Python.

As UDFs do Python para Unity Catalog usam instruções definidas por cifrões duplos ($$), como no exemplo de código a seguir:

CREATE FUNCTION target_catalog.target_schema.greet(s STRING)
RETURNS STRING
LANGUAGE PYTHON
AS $$
  return f"Hello, {s}"
$$

O exemplo a seguir demonstra o uso dessa função para retornar instruções de saudação para todos os nomes armazenados na coluna first_name de uma tabela chamada students:

SELECT target_catalog.target_schema.greet(first_name)
FROM students;

Você pode definir qualquer número de funções Python em uma UDF Python, mas deve retornar um valor escalar.

As funções do Python devem manipular valores NULL independentemente e todos os mapeamentos de tipo devem seguir os mapeamentos de linguagem SQL do Databricks.

Você pode importar bibliotecas Python padrão incluídas pelo Databricks, mas não pode incluir bibliotecas personalizadas ou dependências externas.

Se nenhum catálogo ou esquema for especificado, as UDFs do Python serão registradas no esquema ativo atual.

O exemplo a seguir importa uma biblioteca e usa várias funções em uma UDF do Python:

CREATE FUNCTION roll_dice(num_dice INTEGER, num_sides INTEGER)
RETURNS INTEGER
LANGUAGE PYTHON
AS $$
  import numpy as np

  def roll_die(num_sides):
    return np.random.randint(num_sides) + 1

  def sum_dice(num_dice,num_sides):
    return sum([roll_die(num_sides) for x in range(num_dice)])

  return sum_dice(num_dice, num_sides)
$$