Funciones definidas por el usuario (UDF) en el catálogo de Unity

Importante

Esta característica está en versión preliminar pública y requiere Databricks Runtime 13.3 LTS y versiones posteriores.

Azure Databricks proporciona una sintaxis nativa de SQL para registrar funciones personalizadas en esquemas controlados por el catálogo de Unity. La sintaxis SQL CREATE FUNCTION estándar es compatible con todos los procesos del catálogo de Unity en Azure Databricks. En almacenes SQL pro o sin servidor y en Databricks Runtime 13.3 LTS y versiones posteriores, puede incluir código de Python en funciones registradas en Unity Catalog.

Nota:

Las vistas registradas desde consultas que usan UDF deben usar el proceso admitido. Los almacenes de SQL clásicos y Databricks Runtime 12.2 LTS y versiones posteriores no pueden resolver las vistas que contienen UDF registradas en Unity Catalog.

Para obtener la referencia completa del lenguaje SQL, consulte CREATE FUNCTION (SQL y Python).

Para obtener información sobre cómo el catálogo de Unity administra los permisos en las funciones, consulte CREATE FUNCTION.

Importante

Las UDF de Python registradas como funciones en el catálogo de Unity difieren en el ámbito y la compatibilidad de las UDF de PySpark con ámbito en un cuaderno o SparkSession. Consulte Función escalar definida por el usuario: Python.

Funciones SQL personalizadas en el catálogo de Unity

Al crear una función SQL mediante el proceso configurado para el catálogo de Unity, la función se registra en el esquema activo actualmente de forma predeterminada. En el ejemplo siguiente se muestra la sintaxis que podría usar para declarar un catálogo de destino y un esquema para una nueva función:

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 los usuarios con privilegios suficientes en la función pueden usar la función en entornos de proceso configurados para el catálogo de Unity, como en el ejemplo siguiente:

SELECT target_catalog.target_schema.roll_dice()

Nota:

Puede usar UDF mediante LANGUAGE SQL para devolver tablas o valores escalares.

Registro de una UDF de Python en el catálogo de Unity

En Databricks Runtime 13.3 LTS y versiones posteriores, puede usar la instrucción SQL CREATE FUNCTION para registrar UDF escalares de Python en Unity Catalog.

Importante

Solo las instancias de SQL Warehouse profesionales y sin servidor admiten UDF de Python para el catálogo de Unity.

Las UDF de Python están diseñadas para proporcionar expresividad completa de Python directamente dentro de las funciones SQL, lo que permite operaciones personalizadas, como transformaciones avanzadas, enmascaramiento de datos y hash.

Las UDF de Python se ejecutan en un entorno seguro y aislado y no tienen acceso a sistemas de archivos ni a servicios internos.

Las UDF de Python que se ejecutan en proceso sin servidor o en modo de acceso compartido permiten el tráfico de red TCP/UDP a través de los puertos 80, 443 y 53.

Consulte ¿Qué UDF son más eficaces?.

Nota:

La sintaxis y la semántica de las UDF de Python en el catálogo de Unity difieren de las UDF de Python registradas en SparkSession. Consulte Función escalar definida por el usuario: Python.

Las UDF de Python para el catálogo de Unity usan instrucciones establecidas por signos de doble dólar ($$), como en el ejemplo de código siguiente:

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

En el ejemplo siguiente se muestra cómo usar esta función para devolver instrucciones de saludo para todos los nombres almacenados en la columna first_name de una tabla denominada students:

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

Es posible definir cualquier número de funciones de Python dentro de una UDF de Python, pero deberá devolver un valor escalar.

Las funciones de Python deben controlar los valores NULL de forma independiente y todas las asignaciones de tipos deben seguir las asignaciones del lenguaje SQL de Azure Databricks.

Puede importar bibliotecas estándar de Python incluidas en Azure Databricks, pero no puede incluir bibliotecas personalizadas ni dependencias externas.

Si no se especificase ningún catálogo o esquema, las UDF de Python se registrarán en el esquema activo actual.

En el ejemplo siguiente, se importa una biblioteca y se usan varias funciones dentro de una UDF de 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)
$$