Pular para o conteúdo principal

O que são funções definidas pelo usuário (UDFs)?

Funções definidas pelo usuário (UDFs) permitem reutilizar e compartilhar código que estende as funcionalidades integradas no Databricks. Use UDFs para executar tarefas específicas, como cálculos complexos, transformações ou manipulações de dados personalizadas.

Quando usar um UDF em vez de uma função do Apache Spark?

Use UDFs para lógica que seja difícil de expressar com funções integradas Apache Spark. integrada Apache Spark funções são otimizadas para processamento distribuído e oferecem melhor desempenho em escala. Para obter mais informações, consulte Funções.

A Databricks recomenda UDFs para queries ad hoc, limpeza manual de dados, análise exploratória de dados e operações em datasets pequenos a médios. Os casos de uso comuns para UDFs incluem criptografia de dados, descriptografia, hashing, análise de JSON e validação.

Use métodos do Apache Spark para operações em grandes datasets e quaisquer workloads que executam regularmente ou continuamente, incluindo Jobs ETL e operações de transmissão.

Compreender os tipos de UDF

Selecione um tipo de UDF na guia a seguir para ver uma descrição, um exemplo e um link para saber mais.

As UDFs escalares operam em uma única linha e retornam um único valor de resultado para cada linha. Eles podem ser controlados pelo Unity Catalog ou com escopo de sessão.

O exemplo a seguir usa um UDF escalar para calcular o comprimento de cada nome em uma coluna name e adicionar o valor em uma nova coluna name_length.

+-------+-------+
| name | score |
+-------+-------+
| alice | 10.0 |
| bob | 20.0 |
| carol | 30.0 |
| dave | 40.0 |
| eve | 50.0 |
+-------+-------+
SQL
-- Create a SQL UDF for name length
CREATE OR REPLACE FUNCTION main.test.get_name_length(name STRING)
RETURNS INT
RETURN LENGTH(name);

-- Use the UDF in a SQL query
SELECT name, main.test.get_name_length(name) AS name_length
FROM your_table;
+-------+-------+-------------+
| name | score | name_length |
+-------+-------+-------------+
| alice | 10.0 | 5 |
| bob | 20.0 | 3 |
| carol | 30.0 | 5 |
| dave | 40.0 | 4 |
| eve | 50.0 | 3 |
+-------+-------+-------------+

Para implementar isso em um Notebook do Databricks usando PySpark:

Python
from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType

@udf(returnType=IntegerType())
def get_name_length(name):
return len(name)

df = df.withColumn("name_length", get_name_length(df.name))

# Show the result
display(df)

Consulte funções definidas pelo usuário (UDFs) de SQL e Python no Unity Catalog e funções definidas pelo usuário (UDFs) Python escalares.

UDFs governadas pelo Unity Catalog vs. UDFs com escopo de sessão

O Unity Catalog persiste as UDFs governadas pelo Unity Catalog para uma governança, reutilização e capacidade de descoberta aprimoradas. Você define as UDFs com escopo de sessão em um Notebook ou Job, com escopo para a SparkSession atual. Você pode definir e acessar UDFs com escopo de sessão usando SQL, Python ou Scala.

Use a tabela a seguir para decidir entre as duas categorias e, em seguida, consulte as folhas de dicas a seguir para os tipos específicos de UDF em cada uma.

Consideração

UDFs regidas pelo Unity Catalog

UDFs com escopo de sessão

Melhor para

Compartilhamento seguro de funções entre equipes, notebooks, jobs e SQL Warehouse.

Desenvolvimento rápido e iterativo em um único Notebook ou Job.

Idiomas

SQL, Python, Scala e Java.

SQL, Python e Scala.

Governança e compartilhamento

Regido pelas permissões do Unity Catalog e detectável no Catalog Explorer.

Com escopo para a SparkSession atual. Não governado nem compartilhado.

Persistência

Persistido no Unity Catalog e reutilizável entre sessões.

Existem apenas para a sessão atual.

Consideração

UDFs regidas pelo Unity Catalog

UDFs com escopo de sessão

Melhor para

Compartilhamento seguro de funções entre equipes, notebooks, jobs e SQL Warehouse.

Desenvolvimento rápido e iterativo em um único Notebook ou Job.

Idiomas

SQL, Python, Scala e Java.

SQL, Python e Scala.

Governança e compartilhamento

Regido pelas permissões do Unity Catalog e detectável no Catalog Explorer.

Com escopo para a SparkSession atual. Não governado nem compartilhado.

Persistência

Persistido no Unity Catalog e reutilizável entre sessões.

Existem apenas para a sessão atual.

Folha de dicas de UDFs governados pelo Unity Catalog

As UDFs governadas pelo Unity Catalog permitem que funções personalizadas sejam definidas, usadas, compartilhadas com segurança e governadas em todos os ambientes de computação. Consulte funções definidas pelo usuário (UDFs) de SQL e Python no Unity Catalog.

Tipo de UDF

Com suporte compute

Descrição

Unity Catalog Python UDF

  • Notebook e trabalho sem servidor
  • compute clássico com modo de acesso padrão (Databricks Runtime 13.3 LTS e acima)
  • SQL warehouse (serverless e pro)
  • Lakeflow Pipelines (clássico e serverless)

Defina um UDF em Python e registre-o em Unity Catalog para governança.

As UDFs escalares operam em uma única linha e retornam um único valor de resultado para cada linha.

lotes Unity Catalog Python UDF

  • Notebook e trabalho sem servidor
  • Clássico compute com modo de acesso padrão (Databricks Runtime 16.3 e acima)
  • SQL warehouse (serverless e pro)

Defina um UDF em Python e registre-o em Unity Catalog para governança.

lotes operações em vários valores e retornam vários valores. Reduz a sobrecarga de operações linha a linha para processamento de dados em grande escala.

Unity Catalog Python UDTF

  • Notebook e trabalho sem servidor
  • Clássico compute com modo de acesso padrão (Databricks Runtime 17.1 e acima)
  • SQL warehouse (serverless e pro)

Defina uma UDTF em Python e registre-a em Unity Catalog para governança.

Uma UDTF usa um ou mais argumentos de entrada e retorna várias linhas (e possivelmente várias colunas) para cada linha de entrada.

UDF de Scala ou Java do Unity Catalog

  • Notebook e trabalho sem servidor
  • Compute clássico (modo de acesso padrão e acesso dedicado)
  • SQL warehouse (serverless, pro e classic)
  • Spark Declarative Pipelines no Lakeflow (clássico e serverless)

Defina uma UDF em Scala ou Java e registre-a no Unity Catalog para governança.

As UDFs escalares operam em uma única linha e retornam um único valor de resultado para cada linha. Requer Scala 2.13.16, JDK 17 e Versão 4 do Ambiente.

Tipo de UDF

Com suporte compute

Descrição

Unity Catalog Python UDF

  • Notebook e trabalho sem servidor
  • compute clássico com modo de acesso padrão (Databricks Runtime 13.3 LTS e acima)
  • SQL warehouse (serverless e pro)
  • Lakeflow Pipelines (clássico e serverless)

Defina um UDF em Python e registre-o em Unity Catalog para governança.

As UDFs escalares operam em uma única linha e retornam um único valor de resultado para cada linha.

lotes Unity Catalog Python UDF

  • Notebook e trabalho sem servidor
  • Clássico compute com modo de acesso padrão (Databricks Runtime 16.3 e acima)
  • SQL warehouse (serverless e pro)

Defina um UDF em Python e registre-o em Unity Catalog para governança.

lotes operações em vários valores e retornam vários valores. Reduz a sobrecarga de operações linha a linha para processamento de dados em grande escala.

Unity Catalog Python UDTF

  • Notebook e trabalho sem servidor
  • Clássico compute com modo de acesso padrão (Databricks Runtime 17.1 e acima)
  • SQL warehouse (serverless e pro)

Defina uma UDTF em Python e registre-a em Unity Catalog para governança.

Uma UDTF usa um ou mais argumentos de entrada e retorna várias linhas (e possivelmente várias colunas) para cada linha de entrada.

UDF de Scala ou Java do Unity Catalog

  • Notebook e trabalho sem servidor
  • Compute clássico (modo de acesso padrão e acesso dedicado)
  • SQL warehouse (serverless, pro e classic)
  • Spark Declarative Pipelines no Lakeflow (clássico e serverless)

Defina uma UDF em Scala ou Java e registre-a no Unity Catalog para governança.

As UDFs escalares operam em uma única linha e retornam um único valor de resultado para cada linha. Requer Scala 2.13.16, JDK 17 e Versão 4 do Ambiente.

Folha de dicas de UDFs com escopo de sessão para usuários isolados compute

Você define UDFs com escopo de sessão em um notebook ou job, com escopo para a SparkSession atual. Você pode definir e acessar UDFs com escopo de sessão usando SQL, Python ou Scala.

Tipo de UDF

Com suporte compute

Descrição

Escalar Python

  • Notebook e trabalho sem servidor
  • compute clássico com modo de acesso padrão (Databricks Runtime 13.3 LTS e acima)
  • Lakeflow Pipelines (clássico e serverless)

As UDFs escalares operam em uma única linha e retornam um único valor de resultado para cada linha.

Python não escalar

  • Notebook e trabalho sem servidor
  • compute clássico com modo de acesso padrão (Databricks Runtime 14.3 LTS e acima)
  • Lakeflow Pipelines (clássico e serverless)

Os UDFs não escalares incluem pandas_udf, mapInPandas, mapInArrow, applyInPandas. Pandas Os UDFs usam o Apache Arrow para transferir dados e o Pandas para trabalhar com os dados. As UDFs do Pandas suportam operações vetorizadas que podem aumentar muito o desempenho em relação às UDFs escalonadas linha a linha.

Python UDTFs

  • Notebook e trabalho sem servidor
  • compute clássico com modo de acesso padrão (Databricks Runtime 14.3 LTS e acima)
  • Lakeflow Pipelines (clássico e serverless)

Uma UDTF usa um ou mais argumentos de entrada e retorna várias linhas (e possivelmente várias colunas) para cada linha de entrada.

UDFs escalares em Scala

  • compute clássico com modo de acesso padrão (Databricks Runtime 13.3 LTS e acima)

As UDFs escalares operam em uma única linha e retornam um único valor de resultado para cada linha.

UDF Scala ou Java de um JAR

  • Notebook e trabalho sem servidor
  • Compute clássico com modo de acesso padrão (Databricks Runtime 18.3 e acima)

Registre uma classe UDF pré-compilada de um JAR usando spark.udf.registerJavaFunction. Consulte Registrar uma UDF Java de um JAR.

UDAFs em Scala

  • compute clássico com modo de acesso dedicado (Databricks Runtime 14.2 LTS e acima)

Os UDAFs operam em várias linhas e retornam um único resultado agregado.

Tipo de UDF

Com suporte compute

Descrição

Escalar Python

  • Notebook e trabalho sem servidor
  • compute clássico com modo de acesso padrão (Databricks Runtime 13.3 LTS e acima)
  • Lakeflow Pipelines (clássico e serverless)

As UDFs escalares operam em uma única linha e retornam um único valor de resultado para cada linha.

Python não escalar

  • Notebook e trabalho sem servidor
  • compute clássico com modo de acesso padrão (Databricks Runtime 14.3 LTS e acima)
  • Lakeflow Pipelines (clássico e serverless)

Os UDFs não escalares incluem pandas_udf, mapInPandas, mapInArrow, applyInPandas. Pandas Os UDFs usam o Apache Arrow para transferir dados e o Pandas para trabalhar com os dados. As UDFs do Pandas suportam operações vetorizadas que podem aumentar muito o desempenho em relação às UDFs escalonadas linha a linha.

Python UDTFs

  • Notebook e trabalho sem servidor
  • compute clássico com modo de acesso padrão (Databricks Runtime 14.3 LTS e acima)
  • Lakeflow Pipelines (clássico e serverless)

Uma UDTF usa um ou mais argumentos de entrada e retorna várias linhas (e possivelmente várias colunas) para cada linha de entrada.

UDFs escalares em Scala

  • compute clássico com modo de acesso padrão (Databricks Runtime 13.3 LTS e acima)

As UDFs escalares operam em uma única linha e retornam um único valor de resultado para cada linha.

UDF Scala ou Java de um JAR

  • Notebook e trabalho sem servidor
  • Compute clássico com modo de acesso padrão (Databricks Runtime 18.3 e acima)

Registre uma classe UDF pré-compilada de um JAR usando spark.udf.registerJavaFunction. Consulte Registrar uma UDF Java de um JAR.

UDAFs em Scala

  • compute clássico com modo de acesso dedicado (Databricks Runtime 14.2 LTS e acima)

Os UDAFs operam em várias linhas e retornam um único resultado agregado.

Considerações sobre o desempenho

  • As funções integradas e os UDFs do siteSQL são as opções mais eficientes.

  • As UDFs do Scala geralmente são mais rápidas do que as UDFs do Python.

    • Unisolated Scala Os UDFs são executados na máquina virtual Java (JVM), portanto, evitam a sobrecarga de mover dados para dentro e para fora do JVM.
    • UDFs Scala isoladas devem mover dados para dentro e para fora da JVM, mas ainda podem ser mais rápidas do que as UDFs Python porque gerenciam a memória de forma mais eficiente.
  • UDFs Python e UDFs pandas tendem a ser mais lentas que as UDFs Scala porque devem serializar dados e movê-los para fora da JVM para o interpretador Python.

    • As UDFs do Pandas são até 100 vezes mais rápidas do que as UDFs do Python porque usam o Apache Arrow para reduzir os custos de serialização.