Todos os produtos
Search
Central de documentação

MaxCompute:Visão geral da UDAF

Última atualização: Jun 26, 2026

Uma função de agregação definida pelo usuário (UDAF) mapeia vários registros de entrada para um único valor de saída. Utilize UDAFs quando nenhuma função de agregação nativa atender à sua lógica de agregação. O MaxCompute oferece suporte a UDAFs escritas em Java ou Python.

Quando usar uma UDAF

As funções nativas são otimizadas para processamento distribuído e apresentam desempenho superior ao das UDAFs. Sempre que uma função nativa cobrir seu caso de uso, dê preferência a ela.

Desenvolva uma UDAF apenas quando não for possível expressar sua lógica de agregação com as funções nativas, como em modelos estatísticos personalizados, pontuações específicas de domínio ou agregações ponderadas com múltiplos campos.

Tipos de UDAF

Tipo

Linguagem

Runtime

UDAF Java

Java

JVM

UDAF Python 2

Python

Python 2.7

UDAF Python 3

Python

CPython 3.7.3

Para obter detalhes sobre a implementação, consulte UDAFs Java, UDAF Python 2 e UDAF Python 3.

Processo de desenvolvimento

UDAF Java

A figura a seguir ilustra o fluxo de trabalho de desenvolvimento de uma UDAF Java.

Write a UDF in Java

Etapa

Obrigatória

Descrição

Plataforma

Referências

1

Não

Adicione a dependência do SDK odps-sdk-udf ao seu arquivo POM. Exemplo: <dependency><groupId>com.aliyun.odps</groupId><artifactId>odps-sdk-udf</artifactId><version>0.29.10-public</version></dependency>. Pesquise a versão mais recente nos repositórios Maven.

IntelliJ IDEA (Maven)

2

Sim

Escreva a UDAF.

IntelliJ IDEA (Maven) e MaxCompute Studio

Desenvolver uma UDF em Java

3

Sim

Depure a UDAF na máquina local ou por meio de testes unitários.

4

Sim

Empacote o código em um arquivo JAR.

5

Sim

Faça upload do arquivo JAR como resource para o seu projeto MaxCompute.

Cliente MaxCompute (odpscmd), MaxCompute Studio, DataWorks

Cliente MaxCompute: Adicionar resources, Criar uma UDF; MaxCompute Studio: Empacotar um programa Java, fazer upload do pacote e criar uma UDF do MaxCompute; DataWorks: Criar e usar resources do MaxCompute, Criar e usar uma função do MaxCompute

6

Sim

Crie uma UDF com base no arquivo JAR enviado.

7

Não

Chame a UDAF em uma consulta.

UDAF Python

A figura a seguir ilustra o fluxo de trabalho de desenvolvimento de uma UDAF Python.

Write a UDF in Python

Etapa

Obrigatória

Descrição

Plataforma

Referências

1

Sim

Escreva a UDAF.

MaxCompute Studio

Desenvolver uma UDF Python

2

Sim

Depure a UDAF na máquina local ou por meio de testes unitários.

3

Sim

Faça upload dos arquivos Python e de quaisquer resources necessários (resources de arquivo, resources de tabela, pacotes de terceiros) para o seu projeto MaxCompute.

Cliente MaxCompute (odpscmd), MaxCompute Studio, DataWorks

Cliente MaxCompute: Adicionar resources, Criar uma UDF; MaxCompute Studio: Fazer upload de um programa Python e criar uma UDF do MaxCompute; DataWorks: Usar resources para registrar funções

4

Sim

Crie uma UDF com base nos arquivos Python enviados ou nos resources necessários.

5

Não

Chame a UDAF em uma consulta.

Limites

As UDAFs não têm acesso à Internet. Para ative esse acesso, envie uma solicitação de conexão de rede. Após a aprovação, a equipe de suporte técnico do MaxCompute ajudará você a configurar a conexão. Para mais detalhes, consulte Processo de conexão de rede.

Observações de uso

  • Desempenho: As funções nativas superam as UDAFs em termos de performance. Sempre que uma função nativa atender ao seu caso de uso, utilize-a.

  • Memória: Caso uma instrução SQL que utilize uma UDAF exceda a alocação padrão de memória devido a grandes volumes de dados ou skew de dados, execute o comando abaixo no nível da sessão para aumentar o limite:

    set odps.sql.udf.joiner.jvm.memory=xxxx;

    Para mais informações, consulte Perguntas frequentes sobre UDFs do MaxCompute.

  • Conflito de nomes: Se uma UDAF tiver o mesmo nome de uma função nativa, o MaxCompute chamará a UDAF. Para invocar a função nativa nesse cenário, adicione o prefixo ::. Exemplo: select ::concat('ab', 'c');

Chamar uma UDAF

No mesmo projeto: Invoque a UDAF da mesma forma que você chama uma função nativa.

Entre projetos: Utilize o nome do projeto como prefixo. O exemplo a seguir chama udf_in_other_project do projeto B dentro do projeto A:

select B:udf_in_other_project(arg0, arg1) as res from table_t;

Para configurar o compartilhamento de resources entre projetos, consulte Acesso a resources entre projetos com base em pacotes.