UDFs (funções definidas pelo usuário) no Catálogo do Unity
Importante
Esse recurso está em uma versão prévia.
As UDFs (funções definidas pelo usuário) no Catálogo do Unity estendem os recursos do SQL e do Python no Azure Databricks. Eles permitem que funções personalizadas sejam definidas, usadas e compartilhadas e controladas com segurança em ambientes de computação.
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.
Consulte CREATE FUNCTION (SQL e Python) para obter a referência completa da linguagem SQL.
Requisitos
Para usar UDFs no Catálogo do Unity, os seguintes requisitos devem ser atendidos:
- 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.
- Se uma exibição incluir uma UDF do UC Python, ela falhará nos SQL Classic Warehouses.
Criando UDFs no Catálogo do Unity
Para criar uma UDF no Catálogo do Unity, os usuários precisam das permissões USAGE e CREATE no esquema e da permissão USAGE no catálogo. Consulte o Catálogo do Unity para obter mais detalhes.
Para executar uma UDF, os usuários precisam da permissão EXECUTE na UDF. Os usuários também precisam da permissão USAGE no esquema e no catálogo.
O exemplo a seguir registra uma nova função no esquema do Catálogo do my_schema
Unity:
CREATE OR REPLACE FUNCTION my_catalog.my_schema.calculate_bmi(weight DOUBLE, height DOUBLE)
RETURNS DOUBLE
LANGUAGE SQL
AS
SELECT weight / (height * height);
As UDFs do Python para o Catálogo do Unity usam instruções compensadas por cifrões duplos ($$). Você também precisa especificar um mapeamento de tipo de dados. O exemplo a seguir registra uma UDF que calcula o índice de massa corporal:
CREATE FUNCTION my_catalog.my_schema.calculate_bmi(weight_kg DOUBLE, height_m DOUBLE)
RETURNS DOUBLE
LANGUAGE PYTHON
AS $$
return weight_kg / (height_m ** 2)
$$;
Agora você pode usar essa função do Catálogo do Unity em suas consultas SQL ou código PySpark:
SELECT person_id, my_catalog.my_schema.calculate_bmi(weight_kg, height_m) AS bmi
FROM person_data;
Usando a UDF do Catálogo do Unity no PySpark
from pyspark.sql.functions import expr
result = df.withColumn("bmi", expr("my_catalog.my_schema.calculate_bmi(weight_kg, height_m)"))
display(result)
Atualizar uma UDF no escopo da sessão
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. Consulte funções escalares definidas pelo usuário - Python.
Dada a seguinte UDF baseada em sessão em um notebook do Azure Databricks:
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
@udf(StringType())
def greet(name):
return f"Hello, {name}!"
# Using the session-based UDF
result = df.withColumn("greeting", greet("name"))
result.show()
Para registrar isso como uma função do Catálogo do Unity, use uma instrução SQL CREATE FUNCTION
, como no exemplo a seguir:
CREATE OR REPLACE FUNCTION my_catalog.my_schema.greet(name STRING)
RETURNS STRING
LANGUAGE PYTHON
AS $$
return f"Hello, {name}!"
$$
Compartilhar UDFs no Catálogo do Unity
As permissões para UDFs são gerenciadas com base nos controles de acesso aplicados ao catálogo, esquema ou banco de dados em que a UDF está registrada. Consulte o Catálogo do Unity para obter mais informações.
Use o SQL do Azure Databricks ou a interface do usuário do workspace do Azure Databricks para conceder permissões a um usuário ou grupo (recomendado).
Permissões na interface do usuário do workspace
- Localize o catálogo e o esquema em que sua UDF está armazenada e selecione a UDF.
- Procure uma opção Permissões nas configurações de UDF. Adicione usuários ou grupos e especifique o tipo de acesso que eles devem ter, como EXECUTE ou MANAGE.
! [Permissões na interface do usuário do espaço de trabalho](.. /_static/images/udf/udf de alta resolução permission.gif)
Permissões usando o SQL do Azure Databricks
O exemplo a seguir concede a um usuário a permissão EXECUTE em uma função:
GRANT EXECUTE ON FUNCTION my_catalog.my_schema.calculate_bmi TO user@example.com;
Para remover permissões, use o REVOKE
comando como no exemplo a seguir:
REVOKE EXECUTE ON FUNCTION my_catalog.my_schema.calculate_bmi FROM user@example.com;
Práticas recomendadas para UDFs
Para UDFs que precisam ser acessíveis a todos os usuários, o Databricks recomenda a criação de um catálogo e esquema dedicados com controles de acesso apropriados.
Para UDFs específicas da equipe, use um esquema dedicado no catálogo da equipe para armazenamento e gerenciamento.
O Azure Databricks recomenda que você inclua as seguintes informações na docstring da UDF:
- O número da versão atual
- Um changelog para rastrear modificações entre versões
- A finalidade, os parâmetros e o valor retornado da UDF
- Um exemplo de como usar a UDF
Aqui está um exemplo de uma UDF seguindo as práticas recomendadas:
CREATE OR REPLACE FUNCTION my_catalog.my_schema.calculate_bmi(weight_kg DOUBLE, height_m DOUBLE)
RETURNS DOUBLE
COMMENT ”Calculates Body Mass Index (BMI) from weight and height.”
LANGUAGE PYTHON
AS $$
"""
Parameters:
calculate_bmi (version 1.2):
- weight_kg (float): Weight of the individual in kilograms.
- height_m (float): Height of the individual in meters.
Returns:
- float: The calculated BMI.
Example Usage:
SELECT calculate_bmi(weight, height) AS bmi FROM person_data;
Change Log:
- 1.0: Initial version.
- 1.1: Improved error handling for zero or negative height values.
- 1.2: Optimized calculation for performance.
Note: BMI is calculated as weight in kilograms divided by the square of height in meters.
"""
if height_m <= 0:
return None # Avoid division by zero and ensure height is positive
return weight_kg / (height_m ** 2)
$$;
UDFs para acessar APIs externas
Você pode usar UDFs para acessar APIs externas do SQL. O exemplo a seguir usa a biblioteca Python requests
para fazer uma solicitação HTTP.
Observação
As UDFs do Python permitem o tráfego de rede TCP/UDP nas portas 80, 443 e 53 usando computação sem servidor ou computação configurada com o modo de acesso compartilhado.
CREATE FUNCTION my_catalog.my_schema.get_food_calories(food_name STRING)
RETURNS DOUBLE
LANGUAGE PYTHON
AS $$
import requests
api_url = f"https://example-food-api.com/nutrition?food={food_name}"
response = requests.get(api_url)
if response.status_code == 200:
data = response.json()
# Assuming the API returns a JSON object with a 'calories' field
calories = data.get('calories', 0)
return calories
else:
return None # API request failed
$$;
UDFs para segurança e conformidade
Use UDFs do Python para implementar tokenização personalizada, mascaramento de dados, redação de dados ou mecanismos de criptografia.
O exemplo a seguir mascara a identidade de um endereço de e-mail, mantendo o comprimento e o domínio:
CREATE OR REPLACE FUNCTION my_catalog.my_schema.mask_email(email STRING)
RETURNS STRING
LANGUAGE PYTHON
AS $$
parts = email.split('@')
masked_username = username[0] + '*' * (len(username) - 2) + username[-1]
return f"{masked_username}@{domain}"
$$
O exemplo a seguir aplica essa UDF em uma definição de exibição dinâmica:
-- First, create the view
CREATE OR REPLACE VIEW my_catalog.my_schema.masked_customer_view AS
SELECT
id,
name,
my_catalog.my_schema.mask_email(email) AS email
FROM my_catalog.my_schema.customer_data;
-- Now you can query the view
SELECT * FROM my_catalog.my_schema.masked_customer_view;
+---+------------+------------------------+------------------------+
| id| name| email| masked_email |
+---+------------+------------------------+------------------------+
| 1| John Doe| john.doe@example.com | j*******e@example.com |
| 2| Alice Smith|alice.smith@company.com |a**********h@company.com|
| 3| Bob Jones| bob.jones@email.org | b********s@email.org |
+---+------------+------------------------+------------------------+
Limitações
- Você pode definir qualquer número de funções Python em uma UDF do Python, mas todas devem retornar um valor escalar.
- As funções do Python devem lidar com valores NULL 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.
- 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.