Todos os produtos
Search
Central de documentação

MaxCompute:Perguntas frequentes sobre UDFs Python do MaxCompute

Última atualização: Jul 02, 2026

Este tópico responde a perguntas frequentes sobre funções definidas pelo usuário (UDFs) do MaxCompute escritas em Python.

Classes e recursos

Podem ocorrer os seguintes problemas relacionados a classes ou recursos:

  • Descrição do problema 1: Ao chamar uma UDF do MaxCompute, a seguinte mensagem de erro é relatada: function 'xxx' cannot be resolved.

    • Possíveis causas:

      • Causa 1: O projeto em uso não é aquele onde a UDF do MaxCompute foi registrada. Por exemplo, se você registrar uma UDF do MaxCompute em um projeto de desenvolvimento, mas chamá-la em um projeto de produção, o erro será relatado.

      • Causa 2: As classes ou os recursos da UDF do MaxCompute são inválidos.

      • Causa 3: O tipo de recurso do qual a UDF do MaxCompute depende é inválido. Por exemplo, você faz upload de um arquivo Python, que é do tipo PY. No entanto, get_cache_file no código da UDF do MaxCompute requer um recurso do tipo FILE.

      • Causa 4: Os dados de um recurso do qual a UDF do MaxCompute depende não estão atualizados. Se você fizer upload de um recurso para o MaxCompute usando o DataWorks, pode ocorrer um atraso. Nesse caso, os dados do recurso do qual a UDF depende não serão os mais recentes.

      • Causa 5: A versão do Python não é suportada. Por padrão, o MaxCompute usa Python 2 para executar jobs. Se existirem caracteres não ASCII no código Python, um erro será relatado durante a execução.

    • Soluções:

      • Solução 1: No cliente MaxCompute, execute o comando list functions; no projeto onde o erro foi relatado. Se a UDF do MaxCompute não aparecer na saída do comando, este não é o projeto onde ela foi registrada. Acesse o projeto correto onde a UDF está registrada e chame-a novamente.

      • Solução 2: No cliente MaxCompute, execute o comando desc function <function_name>; e verifique os valores de Class e Resources na saída do comando.

        Se o valor do parâmetro Class ou Resources for inválido, execute o comando create function <function_name> as <'package_to_class'> using <'resource_list'>; para registrar a UDF novamente. Configure o parâmetro package_to_class no formato nome_do_script_python.Nome_da_Classe. Use o parâmetro resource_list para especificar todos os recursos que deseja referenciar no MaxCompute, como arquivos, tabelas, pacotes compactados e pacotes de terceiros.

        Para obter mais informações sobre como registrar uma função, consulte Operações de função.

      • Solução 3: No cliente MaxCompute, execute o comando desc resource <resource_name>;. Verifique se o tipo de recurso especificado pelo parâmetro Type na saída do comando é válido. Se o tipo de recurso for inválido, execute o comando add <file_type> <file_name>; para fazer o upload do recurso novamente.

        • Se o método de referência de recurso usado no código da UDF do MaxCompute for get_cache_file, um arquivo estará sendo referenciado e o tipo de recurso deverá ser FILE.

        • Se o método de referência de recurso usado no código da UDF do MaxCompute for get_cache_table, uma tabela estará sendo referenciada e o tipo de recurso deverá ser TABLE.

        • Se o método de referência de recurso usado no código da UDF do MaxCompute for get_cache_archive, um pacote compactado estará sendo referenciado e o tipo de recurso deverá ser ARCHIVE.

        Para obter mais informações sobre como fazer upload de recursos, consulte Gerenciar recursos.

      • Solução 4: No cliente MaxCompute, execute o comando desc resource <resource_name>;. Verifique se os dados do recurso são os mais recentes com base no valor do parâmetro LastModifiedTime na saída do comando. É necessário usar o recurso mais recente na UDF do MaxCompute.

      • Solução 5: Adicione #coding:utf-8 ou # -*- coding: utf-8 -*- ao cabeçalho do código Python para declarar o formato de codificação. Também é possível adicionar o comando set odps.sql.python.version=cp37; antes da instrução SQL usada para chamar a UDF do MaxCompute e enviar o comando junto com a instrução SQL. Dessa forma, o Python 3 será usado para executar os jobs.

  • Descrição do problema 2: Ao chamar uma UDF do MaxCompute na qual get_cache_archive('xxx.zip') está configurado, um dos seguintes erros é relatado: IOError: Download resource: xxx.zip failed, odps.distcache.DistributedCacheError e fuxi job failed: Download resource failed: xxx.zip.

    • Possíveis causas:

      • Causa 1: O pacote compactado não existe. Ao registrar a UDF do MaxCompute, você não especificou um pacote compactado no comando.

      • Causa 2: O tipo de recurso do pacote compactado não é ARCHIVE.

      • Causa 3: O nome do pacote ou a extensão do arquivo no código é inconsistente com o nome real do pacote ou a extensão do arquivo. Por exemplo, xxx.zip é especificado no código, mas o arquivo enviado é xxx.tar.gz. Nesse caso, o sistema tenta descompactar o pacote no formato ZIP. Como resultado, a descompactação falha e um erro é relatado.

      • Causa 4: Duas UDFs que estão no mesmo job dependem de recursos com o mesmo nome. No entanto, esses recursos existem em projetos diferentes.

    • Soluções:

      • Solução 1: No cliente MaxCompute, execute o comando desc function <function_name>;. Verifique se o valor do parâmetro Resources na saída do comando contém o nome do pacote compactado mencionado na mensagem de erro.

        Se o nome do pacote compactado não existir, execute o comando create function <function_name> as <'package_to_class'> using <'resource_list'>; para registrar a UDF do MaxCompute novamente. Adicione o nome do pacote compactado ao parâmetro resource_list no comando.

        Para obter mais informações sobre como registrar uma função, consulte Operações de função.

      • Solução 2: No cliente MaxCompute, execute o comando desc resource <resource_name>;. Verifique se o valor do parâmetro Type na saída do comando é ARCHIVE.

        Se o valor do parâmetro Type não for ARCHIVE, execute o comando add archive <file_name>; para fazer o upload do pacote compactado novamente.

        Para obter mais informações sobre como fazer upload de recursos, consulte Gerenciar recursos.

      • Solução 3: No cliente MaxCompute, execute o comando desc function <function_name>;. Verifique se o nome do pacote e a extensão do arquivo no valor do parâmetro Resources na saída do comando correspondem ao nome real do pacote e à extensão do arquivo.

        Se houver inconsistência entre o nome do pacote ou a extensão do arquivo na saída do comando e os valores reais, execute o comando add archive <file_name>; para fazer o upload do pacote compactado novamente. Defina o parâmetro file_name com um valor consistente com o nome real do pacote e a extensão do arquivo.

      • Solução 4: Solucione problemas em todas as UDFs das quais o job depende, incluindo aquelas das quais uma view depende. Visualize os projetos aos quais as UDFs pertencem e os recursos correspondentes. Se existirem recursos com o mesmo nome em projetos diferentes, recomendamos modifique as UDFs das quais o job depende ou alterar o nome do recurso.

  • Descrição do problema 3: Ao chamar uma UDF do MaxCompute na qual get_cache_table(table_name) está configurado, a seguinte mensagem de erro é relatada: odps.distcache.DistributedCacheError: Table resource "xxx_table_name" not found.

    • Possíveis causas:

      • Causa 1: A tabela não existe. Ao registrar a UDF do MaxCompute, você não especificou uma tabela no comando.

      • Causa 2: O tipo de recurso da tabela não é TABLE.

    • Soluções:

      • Solução 1: No cliente MaxCompute, execute o comando desc function <function_name>;. Verifique se o valor do parâmetro Resources na saída do comando contém o nome da tabela mencionada na mensagem de erro.

        Se o nome da tabela não existir, execute o comando create function <function_name> as <'package_to_class'> using <'resource_list'>; para registrar a UDF do MaxCompute novamente. Adicione o nome da tabela ao parâmetro resource_list no comando.

        Para obter mais informações sobre como registrar uma função, consulte Operações de função.

      • Solução 2: No cliente MaxCompute, execute o comando desc resource <resource_name>;. Verifique se o valor do parâmetro Type na saída do comando é TABLE.

        Se o valor do parâmetro Type não for TABLE, execute o comando add table <table_name>; para fazer o upload da tabela novamente.

        Para obter mais informações sobre como fazer upload de recursos, consulte Gerenciar recursos.

  • Descrição do problema 4: Ao chamar uma UDF do MaxCompute que referencia um pacote de terceiros, a seguinte mensagem de erro é relatada: ImportError: No module named 'xxx'.

    • Possíveis causas:

      • Causa 1: O tipo de recurso do pacote de terceiros não é ARCHIVE.

      • Causa 2: Ao registrar a UDF do MaxCompute, você não especificou um pacote de terceiros no comando.

      • Causa 3: Você não especificou o caminho do pacote de terceiros no código da UDF do MaxCompute.

      • Causa 4: O pacote de terceiros é um arquivo WHEEL, mas sua extensão de arquivo é inválida. Baixe um arquivo WHEEL compatível com a versão do Python utilizada.

      • Causa 5: O pacote de terceiros não é um arquivo WHEEL nem um pacote Python puro, mas contém o arquivo setup.py.

      • Causa 6: O nome do arquivo Python da UDF do MaxCompute entra em conflito com o nome do módulo de terceiros referenciado pela UDF. Por exemplo, se o arquivo Python da UDF for A.py, a instrução "import A" no código importará o arquivo A.py em vez do módulo presente no pacote de terceiros.

    • Soluções:

      • Solução 1: No cliente MaxCompute, execute o comando desc resource <resource_name>;. Verifique se o valor do parâmetro Type na saída do comando é ARCHIVE.

        Se o valor do parâmetro Type não for ARCHIVE, execute o comando add archive <file_name>; para fazer o upload do pacote compactado novamente.

        Para obter mais informações sobre como fazer upload de recursos, consulte Gerenciar recursos.

      • Solução 2: No cliente MaxCompute, execute o comando desc function <function_name>;. Verifique se o valor do parâmetro Resources na saída do comando contém o nome do pacote de terceiros mencionado na mensagem de erro.

        Se o nome do pacote de terceiros não existir, execute o comando create function <function_name> as <'package_to_class'> using <'resource_list'>; para registrar a UDF do MaxCompute novamente. Adicione o nome do pacote de terceiros ao parâmetro resource_list no comando.

        Para obter mais informações sobre como registrar uma função, consulte Operações de função.

      • Solução 3: Verifique se o caminho do pacote de terceiros está configurado em sys.path.insert(0, 'work/caminho-do-pacote-de-terceiros') no código da UDF do MaxCompute. Por exemplo, suponha que o nome do módulo seja A e o arquivo Python seja A.py. Os exemplos a seguir mostram como determinar o caminho a ser configurado no código:

        • Exemplo 1: O arquivo Python está localizado na pasta resource_dir, e essa pasta foi compactada no pacote resource-of-A.zip. O caminho a ser configurado em sys.path.insert é work/resource-of-A.zip/resource_dir/.

        • Exemplo 2: O arquivo Python está localizado na pasta resource_dir, e todos os arquivos dessa pasta foram compactados no pacote resource-of-A.zip. O caminho a ser configurado em sys.path.insert é work/resource-of-A.zip/.

        • Exemplo 3: O arquivo Python está localizado na pasta resource_dir/path1/path2 e todos os arquivos da pasta resource_dir foram compactados no pacote resource-of-A.zip. O caminho a ser configurado em sys.path.insert é work/resource-of-A.zip/path1/path2/.

        Nota

        Por padrão, recursos do tipo ARCHIVE são colocados no caminho relativo ./work/ do caminho de execução da UDF do MaxCompute.

      • Solução 4: O arquivo WHEEL varia conforme a versão do Python. Se você usar Python 2, baixe o arquivo WHEEL cujo nome contenha cp27-cp27m-manylinux1_x86_64. Se usar Python 3, baixe o arquivo WHEEL cujo nome contenha cp37-cp37m-manylinux1_x86_64. É possível alterar a extensão do arquivo WHEEL baixado para .zip. Assim, não será necessário empacotar o arquivo WHEEL em um arquivo ZIP.

      • Solução 5: Em um ambiente Python compatível com o MaxCompute, compile o arquivo setup.py em um arquivo WHEEL. Em seguida, faça o upload dos recursos e registre a UDF do MaxCompute. Para obter mais informações sobre como compilar um pacote de terceiros, consulte Usar pacotes que exigem compilação.

      • Solução 6: Altere o nome do arquivo Python da UDF do MaxCompute.

  • Descrição do problema 5: Ao chamar uma UDF do MaxCompute que referencia uma biblioteca padrão do Python 3, a seguinte mensagem de erro é relatada: ImportError: No module named enum.

    • Causa: O Python 3 não está habilitado nos projetos do MaxCompute. Por padrão, o Python 2 é usado para chamar UDFs do MaxCompute. Portanto, a biblioteca padrão do Python 3 não pode ser identificada.

    • Solução: Adicione o comando set odps.sql.python.version=cp37; antes da instrução SQL usada para chamar a UDF do MaxCompute e envie o comando junto com a instrução SQL.

  • Descrição do problema 6: Ao chamar uma UDF do MaxCompute, a seguinte mensagem de erro é relatada: ModuleNotFoundError: No module named 'six'.

    • Causa: Ao usar um pacote de terceiros com uma UDF Python, o caminho do pacote não foi adicionado a sys.path. Como resultado, o pacote de terceiros não pode ser importado.

    • Solução: Altere include_package_path('six.zip') para sys.path.insert(0, 'work/six.zip'). Para obter mais informações, consulte Executar Scipy em uma UDF do MaxCompute.

  • Descrição do problema 7: Ao chamar uma UDF do MaxCompute, a seguinte mensagem de erro é relatada: failed to get Udf info from xxx.py.

    • Causa: No código da função com valor de tabela definida pelo usuário (UDTF) ou da função de agregação definida pelo usuário (UDAF), a instrução usada para importar a classe base é inválida. Por exemplo, se você usar import odps.udf.BaseUDTF ou import odps.udf.BaseUDAF, a mensagem de erro será relatada.

    • Solução: Altere a instrução para from odps.udf import BaseUDTF ou from odps.udf import BaseUDAF.

Desempenho

  • Descrição do problema: Ao chamar uma UDF do MaxCompute, a seguinte mensagem de erro é relatada: kInstanceMonitorTimeout.

  • Causa: O tempo de processamento da UDF é muito longo, causando timeout. Por padrão, há um limite de tempo imposto ao processamento de dados da UDF. Um lote de registros, tipicamente 1.024, deve ser processado dentro de 1.800 segundos. Esse limite aplica-se ao processamento de um pequeno lote de registros, e não ao tempo total de execução do worker. O SQL normalmente processa dados a uma taxa superior a 10.000 registros por segundo. Este limite existe apenas para evitar loops infinitos na UDF, que podem causar uso prolongado da CPU.

  • Soluções:

    • Adicione informações de log ao código da UDF do MaxCompute. Dessa forma, você poderá visualizar os logs para verificar se ocorre um loop infinito. Também é possível checar se a duração do processamento de um único registro pela UDF atende às suas expectativas com base nas informações de tempo registradas nos logs. Adicione as seguintes informações de log ao código. Após a execução do job, visualize os logs em StdOut da interface Logview.

      • Python 2

        sys.stdout.write('your log')
        sys.stdout.flush()
      • Python 3

        print('your log', flush=True)
    • Se o volume de dados for grande, a UDF do MaxCompute pode ser executada por um longo período. Ajuste os seguintes parâmetros para evitar o erro de timeout.

      Parâmetro

      Descrição

      set odps.function.timeout=xxx;

      O período de timeout da UDF do MaxCompute. Valor padrão: 1800s. Defina este parâmetro com um valor maior conforme suas necessidades de negócio. Valores válidos: 1s a 3600s.

      set odps.sql.executionengine.batch.rowcount=xxx;

      O número de linhas de dados que a UDF do MaxCompute processa por vez. Valor padrão: 1024. Defina este parâmetro com um valor menor conforme suas necessidades de negócio.

Rede

  • Descrição do problema: Ao chamar uma UDF do MaxCompute para acessar a Internet, um erro é relatado.

  • Causa: As UDFs do MaxCompute não suportam acesso à Internet.

  • Solução: Preencha e envie o formulário de solicitação de conexão de rede de acordo com suas necessidades de negócio. A equipe de suporte técnico do MaxCompute entrará em contato com você para estabelecer a conexão de rede. Para obter mais informações sobre como preencher o formulário de solicitação, consulte Processo de conexão de rede.

Sandbox

  • Descrição do problema: Ao chamar uma UDF do MaxCompute, a seguinte mensagem de erro é relatada: RuntimeError: xxx has been blocked by sandbox.

  • Causa: Algumas chamadas a UDFs Python são bloqueadas por sandboxes.

  • Soluções:

    • Adicione o comando set odps.isolation.session.enable=true; antes da instrução SQL usada para chamar uma UDF Python e envie o comando junto com a instrução SQL.

    • Por padrão, odps.isolation.session.enable está definido como true para UDFs Python 3.

Codificação

Podem ocorrer os seguintes problemas de codificação:

  • Descrição do problema 1: Ao chamar uma UDF do MaxCompute, a seguinte mensagem de erro é relatada: SyntaxError: Non-ASCII character '\xe8' in file xxx. on line yyy.

    • Causa: O arquivo Python da UDF do MaxCompute contém caracteres não ASCII e está sendo executado em Python 2.

    • Soluções:

      • Adicione o comando set odps.sql.python.version=cp37; antes da instrução SQL usada para chamar a UDF do MaxCompute e envie o comando junto com a instrução SQL. Dessa forma, o Python 3 será usado para executar os jobs.

      • Adicione as seguintes informações ao início do arquivo Python. Isso alterará o formato de codificação padrão do Python 2 para UTF-8.

        import sys
        reload(sys)
        sys.setdefaultencoding('utf-8')
  • Descrição do problema 2: Ao chamar uma UDF do MaxCompute escrita em Python 2, a seguinte mensagem de erro é relatada: UnicodeEncodeError: 'ascii' code can't encode characters in position x-y: ordinal not in range(128).

    • Causa: O tipo de valor de retorno especificado na assinatura da função é STRING. No entanto, a UDF do MaxCompute retorna um objeto Python do tipo UNICODE. Por exemplo, se o objeto Python for chamado ret, o MaxCompute usa str(ret) para converter o valor de retorno ret em um valor do tipo STR. Se ret estiver dentro do intervalo de codificação ASCII, ele poderá ser convertido para o tipo STR. Porém, se ret não estiver dentro desse intervalo, a conversão falhará e um erro será relatado.

    • Solução: Adicione a seguinte instrução ao método evaluate no código Python:

      return ret.encode('utf-8')
  • Descrição do problema 3: Ao chamar uma UDF do MaxCompute escrita em Python 3, a seguinte mensagem de erro é relatada: UnicodeDecodeError: 'utf-8' codec can't decode byte xxx in position xxx: invalid continuation byte.

    • Causa: O tipo de parâmetro de entrada especificado na assinatura da função é STRING. No entanto, a string inserida ao chamar a UDF Python 3 não pode ser decodificada no formato UTF-8 para um objeto Python do tipo STR.

    • Soluções:

      • Não grave strings codificadas em formatos diferentes de UTF-8 nas tabelas do MaxCompute.

        Uma UDF Python 2 retorna um objeto Python baseado em GBK do tipo STR. Esse objeto pode ser gravado normalmente em uma tabela do MaxCompute, mas não pode ser lido por uma UDF Python 3. Portanto, recomendamos codificar o objeto Python no formato UTF-8 antes de retorná-lo pela UDF Python 2. Por exemplo, use ret.decode('gbk').encode('utf-8') para codificar o objeto Python ret.

      • Use a função interna is_encoding em uma instrução SQL para filtrar dados codificados em formatos diferentes de UTF-8. Instrução de exemplo:

        select py_udf(input_col) from example_table where is_encoding(input_col, 'utf-8', 'utf-8') = true;
      • Altere o tipo de parâmetro de entrada especificado na assinatura da função do código Python para BINARY. Em seguida, converta o tipo de dados das colunas do tipo STRING para o tipo BINARY na instrução SQL e use essas colunas como parâmetros de entrada da UDF Python 3. Instrução de exemplo:

        select py_udf(cast(input_col as binary)) from example_table;
  • Assinatura de função

    Podem ocorrer os seguintes problemas relacionados à assinatura de função:

    • Descrição do problema 1: Ao chamar uma UDF do MaxCompute, a seguinte mensagem de erro é relatada: resolve annotation of class xxx for UDTF/UDF/UDAF yyy contains invalid content '<EOF>'.

      • Causa: Os parâmetros de entrada ou saída de uma UDF do MaxCompute são de um tipo de dados complexo, e as informações relacionadas na assinatura da função são inválidas.

      • Solução: Modifique as informações sobre o tipo de dados complexo na assinatura da função para garantir que ela seja válida. Para obter mais informações sobre assinaturas de função, consulte Assinaturas de função e tipos de dados.

    • Descrição do problema 2: Ao chamar uma UDF do MaxCompute, a seguinte mensagem de erro é relatada: TypeError: expected <class 'xxx'> but <class 'yyy'> found, value:zzz.

      • Causa: O tipo de valor de retorno especificado na assinatura da função é inconsistente com o tipo de dados retornado pela UDF do MaxCompute.

      • Solução: Confirme o tipo de dados esperado e modifique a assinatura da função ou o código da UDF do MaxCompute para garantir a consistência.

    • Descrição do problema 3: Ao chamar uma UDF do MaxCompute, a seguinte mensagem de erro é relatada: Semantic analysis exception - evaluate function in class xxx.yyy for user defined function zz does not match annotation ->.

      • Causa: O número de parâmetros de entrada especificados na assinatura da função é inconsistente com o número de parâmetros de entrada do método relacionado no código da UDF do MaxCompute.

      • Solução: Confirme o número real de parâmetros de entrada e modifique a assinatura da função ou o código da UDF do MaxCompute para garantir a consistência.

    Pacotes de terceiros

    • Descrição do problema: Ao chamar uma UDF do MaxCompute, a seguinte mensagem de erro é relatada: GLIBCXX_x.x.x not found.

    • Causa: A versão GLIBCXX da qual o arquivo de biblioteca .so depende é posterior à versão suportada pelo MaxCompute. O mesmo problema pode ocorrer com versões glibc e CXXABI.

    • Solução: Use um pacote wheel compatível ou recompile o arquivo de biblioteca .so em um ambiente compatível com o MaxCompute. O MaxCompute suporta as seguintes versões máximas das quais arquivos executáveis binários ou arquivos de biblioteca .so dependem:

      GLIBC <= 2.17
      CXXABI <= 1.3.8
      GLIBCXX <= 3.4.19
      GCC <= 4.2.0

    UDTFs

    • Descrição do problema: Ao chamar uma UDTF do MaxCompute, a seguinte mensagem de erro é relatada: Semantic analysis exception - expect 2 aliases but have 0.

    • Causa: Nenhum nome de coluna de saída foi especificado no código da UDTF Python.

    • Solução: Use a cláusula AS para especificar nomes de colunas na instrução SELECT usada para chamar a UDTF Python. Instrução de exemplo:

      select my_udtf(col0, col1) as (ret_col0, ret_col1, ret_col2) from tmp1;

    UDAFs

    • Descrição do problema 1: Ao chamar uma UDAF do MaxCompute, a seguinte mensagem de erro é relatada: Script exception - ValueError: unmarshallable object.

      • Causa: O valor do parâmetro buffer no código da UDAF Python é um objeto não serializável (unmarshallable). Para obter mais informações, consulte Marshal.

      • Solução: Ao atribuir um valor a buffer, certifique-se de que o valor seja um objeto serializável (marshallable). Se quiser usar dois buffers dos tipos LIST e DICT na UDAF Python, use return [list(), dict()] no método new_buffer. Ao usar buffer or pbuffer no método iterate, merge, or terminate, o buffer do tipo LIST corresponde a buffer[0] or pbuffer[0], e o buffer do tipo DICT corresponde a buffer[1] or pbuffer[1]. Se os elementos de um buffer forem dos tipos LIST ou DICT, esses elementos também devem ser objetos serializáveis.

    • Descrição do problema 2: Ao chamar uma UDAF do MaxCompute, a seguinte mensagem de erro é relatada: Python UDAF buffer size overflowed: 2821486749.

      • Causa: O tamanho do buffer no código da UDAF Python excede 2 GB após a operação de marshaling. O tamanho do buffer está sendo processado incorretamente. Como resultado, o tamanho do buffer aumenta proporcionalmente ao volume de dados.

      • Solução: Reescreva a lógica do código da UDAF Python para que o tamanho do buffer não aumente conforme o volume de dados. Por exemplo, se um buffer for uma list, não adicione dados ao buffer nas fases de iteration e merging. Para obter mais informações sobre UDAFs Python, consulte Visão geral da UDAF.