O MaxCompute oferece diversas funções integradas para atender às suas necessidades de negócios. Caso essas funções 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
Em sentido amplo, as funções definidas pelo usuário abrangem 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). Em 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 |
Adequada para cenários em que os dados de entrada e saída possuem um mapeamento de um para um. Cada vez que a UDF lê uma linha de dados, ela retorna um único valor de saída. |
|
|
função com valor de tabela definida pelo usuário, também conhecida como UDF de tabela |
Indicada quando há um mapeamento de um para muitos entre entrada e saída. Ao ler uma linha de dados, 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. Vários registros de entrada são agregados para gerar um único valor de saída. |
Além das UDFs mencionadas acima, o MaxCompute disponibiliza outras opções para cenários específicos.
|
Tipo de UDF |
Cenário |
|
Para simplificar o desenvolvimento de UDFs no MaxCompute e visualizar a lógica do código, incorpore código Java ou Python diretamente em scripts SQL. |
|
|
Caso seu código contenha trechos duplicados, utilize UDFs SQL para aumentar a taxa de reutilização e facilitar 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 bloqueia o acesso à Internet via UDFs. Se precisar desse acesso, preencha o formulário de solicitação de conexão de rede conforme suas necessidades de negócios e envie a solicitação. A equipe de suporte técnico do MaxCompute entrará em contato prontamente para habilitar a conectividade de rede. Para mais detalhes sobre como preencher o formulário, consulte Network connection process.
-
Acesso a uma VPC por meio de UDFs
Por padrão, o MaxCompute não permite que UDFs acessem recursos em VPCs. Para permitir esse acesso, estabeleça uma conexão de rede entre o MaxCompute e a VPC. Para mais informações sobre os procedimentos necessários, consulte Access VPC resources from a UDF.
-
Leitura de dados de tabelas por meio de UDFs, UDAFs ou UDTFs
Não é possível utilizar 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 utilizar UDFs, observe os pontos abaixo:
As UDFs não oferecem o mesmo desempenho que as funções integradas. Dê preferência às funções nativas para implementar sua lógica de negócios sempre que possível.
Ao usar uma UDF em instruções SQL, o uso de memória de um job de computação pode exceder o tamanho padrão alocado se houver processamento de grandes volumes de dados e ocorrência de data skew. Nesse caso, 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 uma UDF tiver o mesmo nome de uma função integrada, a UDF terá prioridade na chamada. Por exemplo, se existirem simultaneamente a UDF CONCAT e a função integrada CONCAT no MaxCompute, o sistema chamará automaticamente a UDF CONCAT. Para invocar a função integrada, adicione o símbolo
::antes do nome da função. Exemplo:select ::concat('ab', 'c');.
Desenvolvimento de UDFs: ferramentas suportadas e processo geral
Esta seção descreve como desenvolver uma UDF, UDTF ou UDAF.
Os processos de desenvolvimento de Code-embedded UDFs, UDFs (SQL user-defined functions) e Geospatial UDFs são diferentes. Para mais detalhes, consulte a documentação correspondente.
Usar Java para desenvolver UDFs
A figura a seguir ilustra o fluxo de desenvolvimento de uma UDF do MaxCompute em Java.

Procedimento | Descrição | Plataforma | Precauções ou referências | |
1 | Opcional | Antes de escrever código com Maven, adicione as dependências do SDK relevantes ao arquivo POM para garantir a compilação correta. Veja abaixo um exemplo de dependência do SDK: Pesquise por |
| Nenhuma. |
2 | Obrigatório | Escreva o código da UDF conforme suas necessidades de negócios. |
| Ao desenvolver UDFs em Java, certifique-se de cumprir os requisitos das especificações de desenvolvimento de UDF Java. Para mais informações, consulte UDF development specifications and general process (Java). |
3 | Obrigatório | Depure a UDF executando-a localmente ou realizando testes unitários para validar se o resultado atende às expectativas. | ||
4 | Obrigatório | Depure o código da UDF para garantir que ele seja empacotado em um arquivo JAR após a execução bem-sucedida em ambiente local. | ||
5 | Obrigatório | Faça upload do arquivo JAR como recurso para o seu projeto MaxCompute. | Você pode usar os três métodos a seguir para fazer upload de recursos e registrar funções:
| |
6 | Obrigatório | Crie uma UDF com base no arquivo JAR enviado. | ||
7 | Opcional | Chame a UDF no código de consulta de dados. | Nenhuma. | |
Usar Python para desenvolver UDFs
A figura a seguir ilustra o fluxo de desenvolvimento de uma UDF do MaxCompute em Python.
Procedimento | Descrição | Plataforma | Precauções ou referências | |
1 | Obrigatório | Desenvolva a UDF de acordo com suas necessidades de negócios. | Ao desenvolver UDFs em Python, assegure-se de atender aos requisitos das especificações de desenvolvimento de UDF Python. Para mais detalhes, consulte UDF development specifications and general process (Python 3) ou UDF development specifications and general process (Python 2). | |
2 | Obrigatório | Depure a UDF executando-a localmente ou por meio de testes unitários para verificar se o resultado corresponde ao esperado. | ||
3 | Obrigatório | Envie arquivos Python ou recursos necessários, como recursos de arquivo, recursos de tabela e pacotes de terceiros, para um projeto MaxCompute. | Você pode usar os três métodos a seguir para fazer upload de recursos e registrar funções:
| |
4 | Obrigatório | Crie uma UDF com base nos arquivos Python enviados ou nos recursos necessários. | ||
5 | Opcional | Chame a UDF no código de consulta de dados. | Nenhuma. | |
Referência de desenvolvimento: MaxCompute SDK
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 correspondentes, consulte MaxCompute SDK.
|
Nome do SDK |
Descrição |
|
odps-sdk-core |
Fornece classes para gerenciar recursos básicos do MaxCompute. |
|
odps-sdk-commons |
Disponibiliza utilitários comuns para Java. |
|
odps-sdk-udf |
Oferece a interface principal para funcionalidades de UDF. |
|
odps-sdk-mapred |
Disponibiliza a API MapReduce. |
|
odps-sdk-graph |
Oferece a API Graph. |
Chamar uma UDF
Após desenvolver e registrar uma UDF no MaxCompute, utilize-a nas etapas subsequentes do desenvolvimento de jobs. Os métodos abaixo mostram como chamar uma UDF:
Uso dentro de um projeto MaxCompute: O procedimento é semelhante ao uso de built-in functions. Utilize a função definida pelo usuário da mesma forma que uma função integrada.
Uso entre projetos: Utilize uma UDF do Projeto B no Projeto A. Exemplo de instrução:
select B:udf_in_other_project(arg0, arg1) as res from table_t;. Para mais informações sobre compartilhamento entre projetos, consulte Cross-project resource access based on packages.