O MaxCompute oferece funções integradas para tarefas comuns de processamento de dados. Quando essas funções não expressam sua lógica, estenda o MaxCompute com funções definidas pelo usuário (UDFs).
As funções integradas têm desempenho superior ao das UDFs. Use-as sempre que possível e crie uma UDF apenas quando as funções integradas não atenderem à sua lógica.
Quando usar uma UDF
Use uma UDF quando a lógica de transformação não puder ser expressa com funções integradas. Os cenários mais comuns incluem:
Análise personalizada de strings ou transformações específicas do negócio
Análise de dados espaciais
Pipelines de processamento de dados entre projetos
Para agregações padrão, operações de string e aritmética, prefira as funções integradas. Elas não exigem implantação e apresentam desempenho significativamente melhor em escala.
Se uma UDF e uma função integrada tiverem o mesmo nome, o MaxCompute chama a UDF. Para chamar a função integrada, adicione o prefixo::. Exemplo:select ::concat('ab', 'c');
Tipos de UDF
Em sentido amplo, as UDFs incluem funções escalares definidas pelo usuário (UDF), funções de agregação definidas pelo usuário (UDAF) e funções com valor de tabela definidas pelo usuário (UDTF). Em sentido estrito, o termo UDF refere-se apenas às funções escalares definidas pelo usuário.
O MaxCompute suporta três tipos principais de UDF.
|
Tipo |
Mapeamento de entrada-saída |
Comportamento |
|
UDF (função escalar definida pelo usuário) |
Um para um |
Cada linha de entrada retorna um valor de saída |
|
UDTF (função com valor de tabela definida pelo usuário) |
Um para muitos |
Cada linha de entrada retorna múltiplos valores como uma tabela |
|
UDAF (função de agregação definida pelo usuário) |
Muitos para um |
Várias linhas de entrada são agregadas em um único valor de saída |
O MaxCompute também fornece tipos especializados de UDF para cenários específicos.
|
Tipo |
Caso de uso |
|
Incorpora código Java ou Python diretamente em scripts SQL para simplificar o desenvolvimento e melhorar a legibilidade |
|
|
Encapsula lógica SQL reutilizável para reduzir a duplicação de código |
|
|
Aplica funções geoespaciais do Hive para analisar dados espaciais no MaxCompute |
Restrições e considerações
Limites rígidos
Acesso à Internet — Por padrão, as UDFs não acessam a 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 entrará em contato para estabelecer a conexão. Para mais detalhes, consulte Network Connection Request FormProcesso de conexão de rede.
Acesso à VPC — Por padrão, as UDFs não acessam recursos em uma virtual private cloud (VPC). Para permitir o acesso à VPC, estabeleça uma conexão de rede entre o MaxCompute e a VPC. Para mais detalhes, consulte Usar UDFs para acessar recursos em VPCs.
Tipos de tabela não suportados — UDFs, UDAFs e UDTFs não leem dados dos seguintes tipos de tabela:
Tabelas com evolução de schema
Tabelas com tipos de dados complexos
Tabelas com tipos de dados json
Tabelas transacionais
Considerações
Uso de memória — Ao processar grandes conjuntos de dados com skew de dados, o job de computação pode exceder a alocação padrão de memória da JVM. Para aumentar o limite de memória, execute o seguinte comando no nível da sessão:
set odps.sql.udf.joiner.jvm.memory=xxxx;
Para mais informações, consulte FAQ sobre UDFs do MaxCompute.
Desenvolver uma UDF
O processo de desenvolvimento para UDFs com código incorporado, UDFs SQL e UDFs geoespaciais difere do fluxo de trabalho padrão de UDF, UDTF e UDAF. Consulte a documentação vinculada para esses tipos.
Java
A figura a seguir ilustra o fluxo de trabalho de desenvolvimento de UDF em Java.

|
Etapa |
Obrigatório |
Ação |
Plataforma |
Observações |
|
1 |
Opcional |
Adicione a dependência |
IntelliJ IDEA (Maven) |
Pesquise por |
|
2 |
Obrigatório |
Escreva o código da UDF |
IntelliJ IDEA (Maven), MaxCompute Studio |
Siga as Especificações de desenvolvimento de UDF e processo geral (Java) |
|
3 |
Obrigatório |
Depure na máquina local ou execute testes unitários |
— |
Verifique se a saída corresponde ao esperado |
|
4 |
Obrigatório |
Empacote o código em um arquivo JAR |
— |
— |
|
5 |
Obrigatório |
Faça upload do JAR como recurso para o projeto MaxCompute |
Três métodos disponíveis: console do DataWorks (visual), cliente MaxCompute (SQL) ou MaxCompute Studio (código). Consulte os guias específicos da plataforma vinculados. |
|
|
6 |
Obrigatório |
Crie a UDF a partir do JAR enviado |
— |
— |
|
7 |
Opcional |
Chame a UDF nas consultas |
— |
— |
Python
A figura a seguir ilustra o fluxo de trabalho de desenvolvimento de UDF em Python.

|
Etapa |
Obrigatório |
Ação |
Plataforma |
Observações |
|
1 |
Obrigatório |
Escreva o código da UDF |
Siga as Especificações de desenvolvimento de UDF e processo geral (Python 3) ou Python 2 |
|
|
2 |
Obrigatório |
Depure na máquina local ou execute testes unitários |
— |
Verifique se a saída corresponde ao esperado |
|
3 |
Obrigatório |
Envie arquivos Python e quaisquer recursos necessários (recursos de arquivo, recursos de tabela, pacotes de terceiros) para o projeto MaxCompute |
Três métodos disponíveis: console do DataWorks (visual), cliente MaxCompute (SQL) ou MaxCompute Studio (código). Consulte os guias específicos da plataforma vinculados. |
|
|
4 |
Obrigatório |
Crie a UDF a partir dos arquivos enviados |
— |
— |
|
5 |
Opcional |
Chame a UDF nas consultas |
— |
— |
Referência de SDK
Os SDKs a seguir suportam o desenvolvimento de UDFs em Java. Para detalhes sobre pacotes e classes, consulte o SDK do MaxCompute.
|
SDK |
Descrição |
|
odps-sdk-core |
Gerencia recursos básicos do MaxCompute |
|
odps-sdk-commons |
Utilitários comuns para Java |
|
odps-sdk-udf |
APIs de UDF |
|
odps-sdk-mapred |
API MapReduce |
|
odps-sdk-graph |
API Graph |
Chamar uma UDF
Após registrar uma UDF, chame-a da mesma forma que uma função integrada.
Dentro de um projeto — Chame a UDF diretamente, como qualquer função integrada.
-
Entre projetos — Para usar uma UDF do projeto B no projeto A, referencie-a com o prefixo do projeto:
select B:udf_in_other_project(arg0, arg1) as res from table_t;Para configurar o compartilhamento entre projetos, consulte Acesso a recursos entre projetos baseado em pacotes.
Próximos passos
Explore exemplos completos para ver o desenvolvimento de UDFs na prática: