UDFs (funções definidas pelo usuário) no Catálogo do Unity

Importante

Esse recurso está em Visualização Pública e requer o Databricks Runtime 13.3 LTS e versões superiores.

O Azure Databricks fornece uma sintaxe nativa de SQL para registrar funções personalizadas em esquemas regidos pelo Catálogo do Unity. A sintaxe SQL Padrão CREATE FUNCTION tem suporte para toda a computação do Catálogo do Unity no Azure Databricks. Em SQL warehouses profissionais ou sem servidor e no Databricks Runtime 13.3 LTS e versões superiores, você pode incluir código Python em funções registradas no Catálogo do Unity.

Observação

As exibições registradas de consultas que usam UDFs devem usar computação com suporte. Os SQL warehouses clássicos e o Databricks Runtime 12.2 LTS e versões anteriores não podem resolver exibições que contenham UDFs registrados no Catálogo do Unity.

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

Para obter informações sobre como o Catálogo do Unity gerencia permissões em funções, consulte CREATE FUNCTION.

Importante

As UDFs do Python registradas como funções no Catálogo do Unity diferem no escopo e o suporte de UDFs do PySpark com escopo para um notebook ou SparkSession. Confira Funções escalares definidas pelo usuário – Python.

Funções SQL personalizadas no Catálogo do Unity

Quando você cria uma função SQL usando a computação configurada para o Catálogo do Unity, a função é registrada no esquema ativo no momento por padrão. 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 de computação configurados para o Catálogo do Unity, 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 uma UDF do Python no Catálogo do Unity

No Databricks Runtime 13.3 LTS e posteriores, você pode usar a instrução SQL CREATE FUNCTION para registrar UDFs escalares do Python no Catálogo do Unity.

Importante

Somente SQL warehouses profissionais e sem servidor dão suporte a UDFs do Python para o Catálogo do Unity.

As UDFs do Python foram projetadas para fornecer toda a expressividade do Python diretamente nas funções SQL, permitindo operações personalizadas, como transformações avançadas, mascaramento de dados e hashing.

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.

As UDFs do Python em execução na computação sem servidor ou no modo de acesso compartilhado permitem o tráfego de rede TCP/UDP nas portas 80, 443 e 53.

Confira Quais UDFs são mais eficientes?.

Observação

A sintaxe e a semântica para UDFs do Python no Catálogo do Unity diferem das UDFs do Python registradas para o SparkSession. Confira Funções escalares definidas pelo usuário – Python.

As UDFs do Python para o Catálogo do Unity usam instruções definidas por sinais de dólar duplo ($$), 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 como usar essa 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 do Python em uma UDF do Python, mas deve retornar um valor escalar.

As funções do Python devem lidar com NULL valores de forma independente e todos os mapeamentos de tipo devem seguir os mapeamentos de linguagem SQL do Azure Databricks.

Você pode importar bibliotecas padrão do Python incluídas pelo Azure 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)
$$