Compartilhar via


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

Importante

Esse recurso está em uma versão prévia.

O Azure Databricks fornece uma sintaxe nativa de SQL para registrar funções personalizadas em esquemas regidos pelo Catálogo do Unity. 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.

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.

Requisitos

  • Databricks Runtime 13.3 LTS ou superior.
  • Para usar o código Python em UDFs registrados no Catálogo do Unity, você deve usar um SQL Warehouse sem servidor ou Pro ou um cluster executando o Databricks Runtime 13.3 LTS ou superior.
  • Para resolver as exibições que foram criadas usando uma UDF registrada no Catálogo do Unity, você deve usar um SQL warehouse sem servidor ou Pro.

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

Se quiser usar um warehouse SQL para registrar UDFs Python no Unity Catalog, ele deverá ser um warehouse SQL Pro ou sem servidor.

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.

No Databricks Runtime 13.3 LTS até 14.2, 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 pelas 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)
$$