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.

|
Etapa |
Obrigatória |
Descrição |
Plataforma |
Referências |
|
1 |
Não |
Adicione a dependência do SDK |
IntelliJ IDEA (Maven) |
— |
|
2 |
Sim |
Escreva a UDAF. |
IntelliJ IDEA (Maven) e MaxCompute Studio |
|
|
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.

|
Etapa |
Obrigatória |
Descrição |
Plataforma |
Referências |
|
1 |
Sim |
Escreva a UDAF. |
MaxCompute Studio |
|
|
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.