As funções com valor de tabela definidas pelo usuário (UDTFs) permitem estender os recursos nativos do MaxCompute ao escrever funções personalizadas em Java ou Python. Uma UDTF lê uma linha de entrada e retorna várias linhas; a saída é tratada como uma tabela.
O MaxCompute inclui algumas UDTFs integradas, como EXPLODE. Para mais informações, consulte Outras funções e Funções de tipos complexos.
Quando usar UDTFs
Use uma UDTF quando as funções integradas não expressarem sua lógica — por exemplo, para emitir um número variável de linhas de saída por linha de entrada ou quando a transformação depender de estado acumulado entre linhas de uma partição.
As funções integradas são otimizadas para o mecanismo distribuído do MaxCompute e superam o desempenho das UDTFs em grande escala. Prefira as funções nativas sempre que atenderem ao seu caso de uso.
Linguagens compatíveis
|
Linguagem |
Versão |
|
Java |
— |
|
Python 2 |
2.7 |
|
Python 3 |
CPython 3.7.3 |
Para detalhes de implementação, consulte UDTFs Java, UDTF Python 2 e UDTFs Python 3.
Limitações
Acesso à Internet: Por padrão, as UDFs não acessam a Internet. Para ative esse acesso, preencha o formulário de 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 obter detalhes, consulte Processo de conexão de rede.
-
Proibição de outras colunas no mesmo
SELECT: InstruçõesSELECTque chamam uma UDTF não podem referenciar outras colunas ou expressões. A instrução a seguir é inválida:-- Invalid: mixes a UDTF with another column select value, user_udtf(key) as mycol ... -
Sem aninhamento: Não aninhe UDTFs dentro de outras UDTFs. A instrução a seguir é inválida:
-- Invalid: user_udtf2 is nested inside user_udtf1 select user_udtf1(user_udtf2(key)) as mycol...; -
Incompatibilidade com
GROUP BY,DISTRIBUTE BYeSORT BY: Não use uma UDTF na mesma instruçãoSELECTque contenha essas cláusulas. A instrução a seguir é inválida:-- Invalid: UDTF used with GROUP BY select user_udtf(key) as mycol ... group by mycol;
Observações de uso
Memória: Se um job de UDF processar grandes volumes de dados com data skew, ele poderá exceder a alocação padrão de memória da JVM. Execute o comando a seguir no nível da sessão para aumentar a memória:
set odps.sql.udf.joiner.jvm.memory=xxxx;
Para obter a lista completa de perguntas frequentes sobre UDFs, consulte Perguntas frequentes sobre UDFs do MaxCompute.
Conflitos de nomes: Se uma UDF tiver o mesmo nome de uma função integrada, o MaxCompute chamará a UDF. Para invocar explicitamente a função integrada, adicione o prefixo :::
select ::concat('ab', 'c');
Processo de desenvolvimento
As etapas variam ligeiramente entre Java e Python.
Java
|
Etapa |
Obrigatória |
Descrição |
Ferramenta |
|
1 |
Não |
Adicione a dependência do SDK Maven ao arquivo POM. Pesquise |
IntelliJ IDEA (Maven) |
|
2 |
Sim |
Escreva o código da UDTF. |
IntelliJ IDEA (Maven) ou MaxCompute Studio |
|
3 |
Sim |
Depure a UDTF na máquina local ou por meio de testes unitários. |
— |
|
4 |
Sim |
Empacote a UDTF em um arquivo JAR. |
— |
|
5 |
Sim |
Faça upload do arquivo JAR como resource para o projeto MaxCompute. |
|
|
6 |
Sim |
Registre a UDTF usando o arquivo JAR enviado. |
— |
|
7 |
Não |
Chame a UDTF em uma consulta SQL. |
— |
Para a etapa 2, consulte Desenvolver uma UDF em Java. Para a etapa 5, veja Adicionar resources e Crie uma função. Para empacotar e registrar em um único fluxo com o MaxCompute Studio, consulte Empacotar um programa Java, fazer upload do pacote e crie uma UDF do MaxCompute.

Python
|
Etapa |
Obrigatória |
Descrição |
Ferramenta |
|
1 |
Sim |
Escreva o código da UDTF. |
|
|
2 |
Sim |
Depure a UDTF na máquina local ou por meio de testes unitários. |
— |
|
3 |
Sim |
Envie arquivos Python ou resources necessários (resources de arquivo, resources de tabela, pacotes de terceiros) para o projeto MaxCompute. |
|
|
4 |
Sim |
Registre a UDTF com base nos arquivos enviados. |
— |
|
5 |
Não |
Chame a UDTF em uma consulta SQL. |
— |
Para a etapa 1, consulte Desenvolver uma UDF Python. Para a etapa 3, veja Adicionar resources e Crie uma função. Para enviar e registrar em um único fluxo com o MaxCompute Studio, consulte Enviar um programa Python e crie uma UDF do MaxCompute.

Chamar uma UDTF
No mesmo projeto: Invoque uma UDTF da mesma forma que uma função integrada.
Entre projetos: Para chamar uma UDTF do projeto B dentro do projeto A, use a sintaxe a seguir:
select B:udf_in_other_project(arg0, arg1) as res from table_t;
Para mais informações sobre compartilhamento de resources entre projetos, consulte Compartilhamento de resources entre projetos baseado em pacotes.