O MaxCompute oferece diversas funções integradas para atender aos requisitos do seu negócio. Caso as funções integradas do MaxCompute não sejam suficientes, escreva código para criar funções definidas pelo usuário (UDFs) seguindo o processo de desenvolvimento e os exemplos descritos neste tópico.
Informações básicas
No sentido amplo, as funções definidas pelo usuário incluem três tipos: função escalar definida pelo usuário (UDF), função com valor de tabela definida pelo usuário (UDTF) e função de agregação definida pelo usuário (UDAF). No sentido estrito, o termo UDF refere-se apenas às funções escalares definidas pelo usuário. A tabela a seguir descreve os tipos de UDF compatíveis com o MaxCompute.
|
Tipo de UDF |
Nome |
Cenário |
|
função escalar definida pelo usuário |
Aplicável a cenários em que os dados de entrada e saída têm um mapeamento de um para um. Estabelece uma relação direta entre a entrada e a saída: a cada linha de dados lida, a UDF retorna um único valor de saída. |
|
|
função com valor de tabela definida pelo usuário, também conhecida como UDF de tabela |
Aplicável a cenários com mapeamento de um para muitos entre os dados de entrada e saída. Estabelece uma relação de um para muitos: a cada linha de dados lida, a UDTF retorna múltiplos valores, tratados como uma tabela. |
|
|
função de agregação definida pelo usuário |
Estabelece um mapeamento de muitos para um entre os dados de entrada e saída. A função agrega múltiplos registros de entrada para gerar um único valor de saída. |
Além das UDFs mencionadas, o MaxCompute oferece as seguintes UDFs para cenários específicos.
|
Tipo de UDF |
Cenário |
|
Para simplificar o processo de desenvolvimento de UDFs do MaxCompute e visualizar a lógica do código, incorpore código Java ou Python diretamente em scripts SQL. |
|
|
Se o seu código contiver trechos duplicados, utilize UDFs SQL para aumentar a taxa de reutilização de código e simplificar o desenvolvimento. |
|
|
Utilize funções geoespaciais do Hive para analisar dados espaciais no MaxCompute. |
Limites
-
Acesso à Internet por meio de UDFs
Por padrão, o MaxCompute não permite o acesso à Internet por meio de UDFs. Caso precise acessar a Internet usando UDFs, preencha o formulário de solicitação de conexão de rede de acordo com as necessidades do seu negócio e envie a solicitação. A equipe de suporte técnico do MaxCompute entrará em contato prontamente para habilitar a conectividade de rede. Para obter mais informações sobre como preencher o formulário de solicitação de conexão de rede, consulte Network connection process.
-
Acesso a uma VPC por meio de UDFs
Por padrão, o MaxCompute não permite o acesso a recursos em VPCs por meio de UDFs. Para acessar recursos de uma VPC usando UDFs, é necessário estabelecer uma conexão de rede entre o MaxCompute e a VPC. Para mais detalhes sobre as operações relacionadas, consulte Access VPC resources from a UDF.
-
Leitura de dados de tabelas por meio de UDFs, UDAFs ou UDTFs
Não é possível usar UDFs, UDAFs ou UDTFs para ler dados dos seguintes tipos de tabelas:
Tabelas com evolução de schema
Tabelas com tipos de dados complexos
Tabelas com tipos de dados JSON
Tabelas transacionais
Precauções
Antes de usar UDFs, observe os seguintes pontos:
As UDFs não superam as funções integradas em desempenho. Priorize o uso de funções integradas para implementar a lógica do seu negócio.
Ao usar uma UDF em instruções SQL, o consumo de memória de um job de computação pode exceder o tamanho de memória alocado por padrão ao processar um grande volume de dados com ocorrência de data skew (distorção de dados). Nessa situação, execute o comando
set odps.sql.udf.joiner.jvm.memory=xxxx;no nível da sessão para resolver o problema. Para mais informações sobre UDFs, consulte FAQ about MaxCompute UDFs.Se o nome de uma UDF for igual ao de uma função integrada, o sistema prioriza a chamada da UDF. Por exemplo, se a UDF CONCAT e a função integrada CONCAT existirem simultaneamente no MaxCompute, o sistema chamará automaticamente a UDF CONCAT em vez da função integrada. Para chamar a função integrada, adicione o símbolo
::antes da função integrada. Por exemplo, useselect ::concat('ab', 'c');.
Desenvolvimento de UDFs: ferramentas compatíveis e processo geral
Esta seção descreve como desenvolver uma UDF, UDTF ou UDAF.
O processo de desenvolvimento de Code-embedded UDFs, UDFs (SQL user-defined functions) e Geospatial UDFs é diferente. Para mais informações, consulte a documentação relacionada.
Usar Java para desenvolver UDFs
A figura a seguir ilustra o processo de desenvolvimento de uma UDF do MaxCompute em Java.

Procedimento | Descrição | Plataforma | Precauções ou referências | |
1 | Opcional | Antes de usar o Maven para escrever código, adicione as dependências do SDK relacionadas ao arquivo POM. Isso garante a compilação do código. O exemplo a seguir mostra uma dependência do SDK: Pesquise por |
| Nenhuma. |
2 | Obrigatório | Escreva o código da UDF de acordo com as necessidades do seu negócio. |
| Ao usar Java para desenvolver UDFs, cumpra os requisitos das especificações de desenvolvimento de UDFs em Java. Para mais informações, consulte UDF development specifications and general process (Java). |
3 | Obrigatório | Depure a UDF: execute-a na sua máquina local ou realize testes de unidade para verificar se o resultado atende às expectativas. | ||
4 | Obrigatório | Depure o código da UDF para garantir o empacotamento em um arquivo JAR após a execução bem-sucedida na sua máquina local. | ||
5 | Obrigatório | Envie o arquivo JAR como recurso para o seu projeto do MaxCompute. | Use um dos três métodos a seguir para enviar recursos e registrar funções:
| |
6 | Obrigatório | Crie uma UDF com base no arquivo JAR que você enviou. | ||
7 | Opcional | Chame a UDF no código de consulta de dados. | Nenhuma. | |
Usar Python para desenvolver UDFs
A figura a seguir ilustra o processo de desenvolvimento de uma UDF do MaxCompute em Python.
Procedimento | Descrição | Plataforma | Precauções ou referências | |
1 | Obrigatório | Escreva uma UDF de acordo com as necessidades do seu negócio. | Ao usar Python para desenvolver UDFs, cumpra os requisitos das especificações de desenvolvimento de UDFs em Python. Para mais informações, consulte UDF development specifications and general process (Python 3) ou UDF development specifications and general process (Python 2). | |
2 | Obrigatório | Depure a UDF: execute-a na sua máquina local ou realize testes de unidade para verificar se o resultado atende às expectativas. | ||
3 | Obrigatório | Envie arquivos Python ou os recursos necessários, como recursos de arquivo, recursos de tabela e pacotes de terceiros, para um projeto do MaxCompute. | Use um dos três métodos a seguir para enviar recursos e registrar funções:
| |
4 | Obrigatório | Crie uma UDF com base nos arquivos Python ou nos recursos necessários que você enviou. | ||
5 | Opcional | Chame a UDF no código de consulta de dados. | Nenhuma. | |
Referência de desenvolvimento: SDK do MaxCompute
A tabela a seguir descreve os SDKs fornecidos pelo MaxCompute. Para mais informações sobre os pacotes incluídos em cada SDK e as classes nesses pacotes, consulte o SDK do MaxCompute.
|
Nome do SDK |
Descrição |
|
odps-sdk-core |
Fornece classes para gerenciar os recursos básicos do MaxCompute. |
|
odps-sdk-commons |
Fornece utilitários comuns para Java. |
|
odps-sdk-udf |
Fornece a interface principal para a funcionalidade de UDFs. |
|
odps-sdk-mapred |
Fornece a API do MapReduce. |
|
odps-sdk-graph |
Fornece a API do Graph. |
Chamar uma UDF
Depois de desenvolver e registrar uma UDF no MaxCompute, use-a no processo subsequente de desenvolvimento de jobs. Use os seguintes métodos para chamar uma UDF:
Usar uma UDF em um projeto do MaxCompute: o método é semelhante ao uso de built-in functions. Use uma função definida pelo usuário da mesma forma que usaria uma função integrada.
Usar uma UDF entre projetos: use uma UDF do Projeto B no Projeto A. A instrução a seguir mostra um exemplo:
select B:udf_in_other_project(arg0, arg1) as res from table_t;. Para mais informações sobre o compartilhamento entre projetos, consulte Cross-project resource access based on packages.