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

Visualização

Esse recurso está em Prévia Pública.

Databricks fornece uma sintaxe nativa do SQL para registrar funções personalizadas em esquemas regidos por Unity Catalog. Python Os UDFs registrados como funções em Unity Catalog diferem em escopo e suporte dos UDFs de PySpark com escopo para Notebook ou SparkSession. Consulte 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 Unity Catalog gerencia permissões em funções, consulte CREATE FUNCTION.

Requisitos

  • Databricks Runtime 13.3 LTS ou acima.

  • Para usar o código Python em UDFs registrados em Unity Catalog, o senhor deve usar um serverless ou pro SQL warehouse ou um cluster executando Databricks Runtime 13.3 LTS ou acima.

  • Para resolver visualizações que foram criadas usando um UDF registrado em Unity Catalog, o senhor deve usar um serverless ou um pro SQL warehouse.

  • Graviton O suporte de instância para Scala UDFs em clusters habilitado para o Unity Catalog está disponível em Databricks Runtime 15.2 e acima.

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

Em Databricks Runtime 13.3 LTS e acima, o senhor pode usar a instrução SQL CREATE FUNCTION para registrar UDFs escalares Python em Unity Catalog.

Importante

Apenas SQL warehouse profissional e serverless 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.

Em Databricks Runtime 13.3 LTS a 14.2, os UDFs Python em execução em serverless compute ou no modo de acesso compartilhado permitem o tráfego de rede TCP/UDP pelas 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)
$$