Todos os produtos
Search
Central de documentação

MaxCompute:Perguntas frequentes sobre lakehouse e tabelas externas

Última atualização: Sep 07, 2026

Este tópico responde às perguntas mais frequentes sobre tabelas externas.

Categoria

Perguntas frequentes

Tabela externa do Object Storage Service (OSS)

Tabela externa do Hologres

Como resolver o erro ODPS-0130071 ao ler dados do Hologres diretamente do MaxCompute?

Problemas de desempenho

Como solucionar problemas de lentidão em jobs SQL de tabelas externas?

Erro ODPS-0123131: Leitura de tipos DATETIME com extratores personalizados

  • Problema

    Ao usar um extrator personalizado para ler dados não estruturados, o sistema retorna o seguinte erro se um campo de dados for do tipo DATETIME, como 2019-11-11 06:43:36.

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    java.lang.IllegalArgumentException
        at java.sql.Date.valueOf(Date.java:143)
        at com.aliyun.odps.udf.example.text.TextExtractor.textLineToRecord(TextExtractor.java:194)
        at com.aliyun.odps.udf.example.text.TextExtractor.extract(TextExtractor.java:153)
        at com.aliyun.odps.udf.ExtractorHandler.extract(ExtractorHandler.java:120)       
  • Causa

    No código Date.valueOf(parts[i]), a função java.sql.Date.valueOf() aceita apenas parâmetros STRING no formato "yyyy-[m]m-[d]d" e não oferece suporte a parâmetros DATETIME.

  • Solução

    1. Adicione a dependência Joda-Time ao seu projeto e importe as classes necessárias para o código.

      -- Dependency.
      <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10</version>
      </dependency> 
      -- Import information.
      import org.joda.time.DateTime;
      import org.joda.time.format.DateTimeFormat;                           
    2. Use a função DateTimeFormat.forPattern() para converter um valor do tipo DATETIME para o tipo STRING durante a leitura.

      record.setDate(index, new Date(DateTime.parse(parts[i], DateTimeFormat.forPattern("yyyy-MM-dd HH:mi:ss")).getMillis()));                           

    Exemplo:

    1. Faça upload do arquivo JAR do projeto do extrator usando o cliente MaxCompute.

      add jar /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar      

      O caminho /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar corresponde ao local de armazenamento do arquivo JAR gerado.

    2. Envie o arquivo JAR de terceiros Joda-Time por meio do cliente MaxCompute.

      add jar /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar                         

      O caminho /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar indica a localização local do arquivo JAR de terceiros Joda-Time.

    3. Transfira os dados de teste para o diretório especificado no OSS. Para um arquivo chamado video_play_log.txt, os dados de exemplo são os seguintes.

      5c661071dba64d5080c91da085ff1073^Music-Click-Fast forward^26.12.XX.XX^2019-11-11 06:43:36                           
    4. Leia os dados da tabela externa.

      select * from <project_name>.video_play_log;
      +------+-------+---+----------------+
      | uuid  | action  | ip  | time      |
      +------+-------+---+----------------+
      | 5c661071dba64d5080c91da085ff1073 | Music-Click-Fast forward | 26.12.XX.XX | 2019-11-11 06:43:36 |
      +------+-------+---+----------------+     

Estouro de memória com UDFs em tabelas externas do OSS

  • Problema

    Ocorre um erro de estouro de memória ao acessar uma tabela externa do OSS com uma UDF, mesmo que a função tenha passado nos testes locais.

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    java.lang.OutOfMemoryError: Java heap space        

    Mesmo após definir os parâmetros abaixo, o tempo de execução aumenta, mas o erro persiste.

    set odps.stage.mapper.mem = 2048; 
    set odps.stage.mapper.jvm.mem = 4096;       
  • Causa

    A tabela externa contém muitos arquivos de objetos, o que consome uma grande quantidade de memória. Além disso, nenhuma partição foi configurada.

  • Solução

    • Consulte um volume menor de dados.

    • Use partições para reduzir a quantidade de dados verificados em cada consulta.

Erro: Dados inline excedem o tamanho máximo permitido

  • Problema

    O erro Inline data exceeds the maximum allowed size ocorre durante o processamento de dados no Object Storage Service (OSS).

  • Causa

    Ao gravar dados em uma tabela externa do OSS, o MaxCompute pode tentar criar um único arquivo que ultrapassa o limite operacional de tamanho.

  • Solução

    Ajuste as propriedades a seguir para controlar o plano de execução. Isso garante que os arquivos individuais gravados na tabela externa do OSS não ultrapassem o limite de tamanho.

    -- Adjust the amount of data read by each mapper. Unit: MB.
    SET odps.sql.mapper.split.size=256; 
    -- Adjust the number of workers in the reduce phase.
    SET odps.stage.reducer.num=100; 

Mesclar arquivos pequenos em tabelas externas do OSS

Verifique no log do Logview se o último operador no plano de execução SQL é um Reducer ou um Joiner. Caso seja um Reducer, execute a instrução set odps.stage.reducer.num=1;. Se for um Joiner, execute a instrução set odps.stage.joiner.num=1;.

Erro ODPS-0130071: Leitura de dados do Hologres via MaxCompute

  • Problema

    Ao ler dados diretamente do Hologres, o sistema retorna o erro "ODPS-0130071 Failed to split to equal size...max count: 7777". Exemplo:

    ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777
  • Causa

    Esse erro ocorre porque a estratégia padrão de divisão de mappers do MaxCompute (volume de dados de entrada / split.size = 256 MB) faz com que o número de mappers simultâneos exceda o limite máximo de 7.777.

    Nota

    Esse limite impede que os usuários enviem jobs que geram um grande número de mappers, o que poderia afetar a estabilidade do Hologres ou da conexão de rede.

  • Solução

    Defina os parâmetros a seguir para resolver o erro.

    -- Increase the mapper concurrency limit. The maximum value is 10,000.
    SET odps.external.holo.mapper.instances=10000; 
    -- Adjust task concurrency by increasing the split size. The maximum value is 512 MB.
    SET odps.sql.mapper.split.size=512; 

Jobs SQL lentos em tabelas externas

Diversos fatores comuns podem causar lentidão em jobs SQL executados em tabelas externas:

  • Leitura lenta de arquivos compactados GZ em tabela externa do OSS

    • Problema

      A leitura de um arquivo grande e compactado (como um arquivo GZ de 200 GB) a partir de uma tabela externa do OSS apresenta lentidão.

    • Causa

      O job fica lento porque formatos compactados como GZ não permitem divisão, forçando o MaxCompute a usar apenas um único mapper.

    • Solução

      • Para melhorar o desempenho, divida o arquivo compactado grande em vários arquivos menores no OSS. Isso permite que o MaxCompute use múltiplos mappers em paralelo, aumentando o throughput de leitura.

        -- Sets the data split size for each mapper in MB.
        SET odps.sql.mapper.split.size=256;       
      • Para dados não estruturados, verifique se o caminho da tabela externa do Object Storage Service (OSS) contém apenas um arquivo. Se houver somente um arquivo, o sistema gera apenas um Mapper, pois dados não estruturados compactados não podem ser divididos, tornando o processamento mais lento. Divida o arquivo grande do OSS em arquivos menores no caminho da tabela externa do OSS. Essa ação aumenta o número de Mappers e melhora a velocidade de leitura.

  • Consulta lenta de dados em tabela externa do MaxCompute via SDK

    • Problema

      A consulta de dados em uma tabela externa do MaxCompute usando um SDK apresenta lentidão.

    • Solução

      Tabelas externas suportam apenas varreduras completas de tabela, o que pode ser lento. Recomendamos o uso de tabelas internas do MaxCompute.

  • Consulta lenta de dados em tabela externa do Tablestore

    • Problema

      Uma consulta em uma tabela externa do Tablestore é significativamente mais lenta do que uma consulta equivalente em uma tabela interna do MaxCompute contendo os mesmos dados.

    • Solução

      Essa diferença de desempenho é esperada, pois consultar uma tabela externa envolve leituras remotas de dados. Para obter melhor desempenho, importe primeiro os dados para uma tabela interna do MaxCompute e depois execute suas consultas.

  • Erro "Couldn't connect to server" em tabelas externas do OSS

    • Problema

      Ao ler dados de uma tabela externa do OSS, o sistema retorna o seguinte erro: ODPS-0123131:User defined function exception - common/io/oss/oss_client.cpp(95): OSSRequestException: req_id: , http status code: -998, error code: HttpIoError, message: Couldn't connect to server.

    • Causas

      • Motivo 1: Durante a criação da tabela externa do OSS, utilizou-se um endpoint público para o oss_endpoint no oss_location, em vez de um endpoint interno.

      • Motivo 2: Ao criar a tabela externa do OSS, o oss_endpoint especificado no caminho oss_location pertence a uma região diferente.

    • Solução

      • Para o Motivo 1:

        Verifique o parâmetro oss_location na instrução CREATE TABLE da tabela externa do OSS. Se o oss_endpoint for público, altere-o para um endpoint interno. Para mais informações sobre os parâmetros, consulte Parameter description.

        Por exemplo, se você estiver na região Indonesia (Jakarta) e usar o endpoint oss://oss-ap-southeast-5.aliyuncs.com/<bucket>/.... para criar uma tabela externa, altere-o para o endpoint interno correspondente: oss://oss-ap-southeast-5-internal.aliyuncs.com/<bucket>/.....

      • Para o Motivo 2:

        Confirme se o oss_endpoint no parâmetro oss_location da instrução CREATE TABLE da tabela externa do OSS corresponde ao endpoint da região que você deseja acessar. Para mais informações sobre nomes de domínio de rede clássica do OSS, consulte Regions and Endpoints.

    Erro "Network is unreachable (connect failed)" durante a criação de tabela

    • Problema

      Ao criar uma tabela externa para o Object Storage Service (OSS), o sistema retorna o seguinte erro:ODPS-0130071:[1,1] Semantic analysis exception - external table checking failure, error message: Cannot connect to the endpoint 'oss-cn-beijing.aliyuncs.com': Connect to bucket.oss-cn-beijing.aliyuncs.com:80 [bucket.oss-cn-beijing.aliyuncs.com] failed: Network is unreachable (connect failed).

    • Causa

      Durante a criação da tabela externa do OSS, o oss_endpoint no endereço oss_location utiliza um endpoint público, e não um endpoint interno.

    • Solução

      Verifique a instrução CREATE TABLE da tabela externa do OSS para confirmar se o oss_endpoint especificado no parâmetro oss_location é um endpoint interno. Caso seja um endpoint público, altere-o para um endpoint interno. Para mais informações sobre os parâmetros, consulte Parameter description.

      Por exemplo, na região China (Beijing), se você usar o endpoint oss://oss-cn-beijing.aliyuncs.com/<bucket>/.... para criar uma tabela externa, altere-o para o endpoint interno correspondente: oss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/.....