Todos os produtos
Search
Central de documentação

MaxCompute:Tabelas externas ORC

Última atualização: Sep 18, 2026

Este tópico descreve como criar, ler e gravar dados em tabelas externas ORC no OSS.

Restrições

Descrição de permissões

  • Ao acessar tabelas externas do OSS, os dados são acessados por meio da função especificada no parâmetro odps.properties.rolearn, independentemente do uso de uma conta Alibaba Cloud, um usuário RAM ou uma função RAM. Portanto, crie uma função RAM, conceda a ela permissões para acessar o bucket do OSS de destino e configure o ARN da função no parâmetro odps.properties.rolearn. Para mais informações, consulte Parâmetros.

  • É possível autorizar o acesso na mesma conta ou entre contas diferentes, conforme os requisitos do negócio. Recomendamos usar uma política de autorização personalizada para um controle de acesso mais refinado. Para mais informações, consulte Autorização para fontes de dados externas.

Criar uma tabela externa

Sintaxe

Se o schema do arquivo ORC e o schema da tabela externa não coincidirem, o MaxCompute trata as diferenças da seguinte forma:

  • Menos colunas no arquivo do que na tabela: as colunas ausentes são preenchidas com NULL.

  • Mais colunas no arquivo do que na tabela: as colunas extras são descartadas.

  • Incompatibilidade de tipo: o tipo STRING pode ler dados INT de arquivos ORC, mas essa prática não é recomendada. O tipo INT, ao ler dados STRING, converte valores não numéricos para NULL e aceita valores numéricos.

Use a sintaxe simplificada ou a sintaxe completa para criar uma tabela externa ORC.

Sintaxe simplificada (recomendada)

Use esta sintaxe para que o MaxCompute gerencie a autorização automaticamente por meio da função RAM padrão.

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
(
  <col_name> <data_type>,
  ...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
STORED AS orc
LOCATION '<oss_location>';

Sintaxe completa

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
(
  <col_name> <data_type>,
  ...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
WITH serdeproperties(
    'odps.properties.rolearn'='acs:ram::<uid>:role/<role_name>'
)
STORED AS orc
LOCATION '<oss_location>'
tblproperties (
    '<xxx>'='<yyy>'
);

Parâmetros comuns

Para mais informações sobre os parâmetros comuns, consulte Parâmetros de sintaxe básica.

Parâmetros específicos de formato

WITH serdeproperties

Propriedade

Quando usar

Valor

Padrão

mcfed.orc.schema.resolution

Os arquivos ORC na mesma tabela externa possuem schemas inconsistentes.

name — mapeia colunas por nome.

position — mapeia colunas por posição.

tblproperties

Propriedade

Quando usar

Descrição

Valor

Padrão

mcfed.orc.compress

Grave dados ORC no OSS em formato compactado.

Não é necessária nenhuma configuração adicional de parâmetros ao ler arquivos compactados.

Algoritmo de compactação para arquivos de saída ORC.

SNAPPY, ZLIB ou ZSTD

Nenhum

odps.external.data.output.prefix (também odps.external.data.prefix)

Adicione um prefixo personalizado aos arquivos de saída.

String de prefixo. Caracteres permitidos: letras, dígitos e underscores (a–z, A–Z, 0–9, _). Comprimento: 1 a 10 caracteres.

Exemplo: mc_

Nenhum

odps.external.data.enable.extension

Defina se os arquivos de saída incluem uma extensão de arquivo.

True exibe a extensão; False a oculta.

True ou False

False

odps.external.data.output.suffix

Adicione um sufixo personalizado aos arquivos de saída.

String de sufixo. Caracteres permitidos: letras, dígitos e underscores.

Exemplo: _hangzhou

Nenhum

odps.external.data.output.explicit.extension

Adicione uma extensão personalizada aos arquivos de saída. Essa propriedade tem prioridade sobre odps.external.data.enable.extension.

String de extensão. Caracteres permitidos: letras, dígitos e underscores. Comprimento: 1 a 10 caracteres.

Exemplo: jsonl

Nenhum

odps.ext.column.mapping

Adicione esta propriedade quando os nomes dos campos nos arquivos de dados do OSS contiverem caracteres especiais.

Essa propriedade define mapeamentos personalizados de nomes de colunas. Por exemplo, se os campos do arquivo OSS forem id BIGINT, $_test DOUBLE e =name STRING, defina o valor do parâmetro como t_test:$_test,t_name:=_name ao criar a tabela externa. Especifique mapeamentos apenas para campos que contêm caracteres especiais.

Sem valor fixo

Nenhum

odps.ext.column.mapping.delimiters

(Use apenas quando os caracteres nos nomes das colunas entrarem em conflito com os delimitadores padrão nos mapeamentos de nomes de colunas. Geralmente não recomendado.)

Adicione esta propriedade quando os nomes das colunas contiverem os caracteres especiais : ou ,

Essa propriedade personaliza os delimitadores intra-grupo e inter-grupo para pares chave-valor. O valor deve conter exatamente dois caracteres: o primeiro atua como delimitador chave-valor e o segundo como delimitador entre diferentes pares chave-valor.

Sem valor fixo. Exemplo: =|.

Valor padrão: ':,'

  • Por padrão, ':' é usado como delimitador entre chaves e valores.

  • A vírgula ',' é usada como delimitador entre diferentes pares chave-valor.

  • Espaços no início e no fim das chaves e dos valores são removidos durante a análise.

mcfed.orc.batch.size

Ajuste o uso de memória e o throughput de processamento.

Número de linhas processadas por lote (tamanho do lote ORC).

Inteiro não negativo

1000

Lista de permissões e lista de bloqueios

As tabelas externas do OSS no MaxCompute suportam filtragem por lista de permissões e lista de bloqueios. Ao definir os parâmetros de lista de permissões e lista de bloqueios em tblproperties, é possível filtrar quais arquivos ler de um diretório. Para mais detalhes, consulte Lista de permissões e lista de bloqueios.

Gravar dados

Para obter detalhes sobre a sintaxe de gravação no MaxCompute, consulte Sintaxe de gravação.

Consultar dados

  • Consulte Sintaxe de consulta para obter detalhes sobre a sintaxe SELECT.

  • Consulte Otimização de consulta para obter detalhes sobre a otimização de planos de consulta.

  • Ativar pushdown de predicado

    O pushdown de predicado (PPD) melhora o desempenho de consultas em tabelas externas ORC ao enviar as condições de filtro para a camada de varredura de dados. O PPD exige o modo nativo (odps.ext.oss.orc.native=true).

    Adicione as seguintes instruções antes da consulta SQL:

    -- Enable the ORC native reader
    SET odps.ext.oss.orc.native=true;
    
    -- Enable ORC predicate pushdown
    SET odps.storage.orc.use.predicate.pushdown=true;

Exemplo

Este exemplo cria uma tabela externa ORC com compactação SNAPPY, adiciona uma partição existente, lê dados e grava uma nova linha.

Pré-requisitos

  1. Você criou um projeto MaxCompute.

  2. Você preparou um bucket e um diretório no OSS. Para mais informações, consulte Criar um bucket e Gerenciar diretórios.

    Certifique-se de que o bucket esteja na mesma região do projeto MaxCompute.
  3. Conceda permissões.

    1. Você tem permissão para acessar o OSS. É possível acessar uma tabela externa do OSS usando uma conta Alibaba Cloud, um usuário RAM ou uma função RAM. Para mais informações sobre como conceder permissões, consulte Autorização no modo STS para o OSS.

    2. Você tem a permissão CreateTable no projeto MaxCompute. Para mais informações sobre permissões relacionadas a tabelas, consulte Permissões do MaxCompute.

Etapa 1: Preparar o arquivo de dados

Usando os dados de amostra fornecidos, crie o caminho da pasta orc_snappy/dt=20250526 no bucket oss-mc-test. Faça o upload do arquivo snappy para a pasta da partição dt=20250526.

Etapa 2: Criar a tabela externa

CREATE EXTERNAL TABLE orc_data_type_snappy
(
    vehicleId INT,
    recordId INT,
    patientId INT,
    calls INT,
    locationLatitute DOUBLE,
    locationLongitude DOUBLE,
    recordTime STRING,
    direction STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
WITH serdeproperties (
    'odps.properties.rolearn'='acs:ram::<uid>:role/<role_name>'
)
STORED AS ORC
LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/orc_snappy/'
tblproperties (
    'mcfed.orc.compress'='SNAPPY'
);

Etapa 3: Adicionar partições existentes

Para tabelas externas particionadas, execute MSCK REPAIR TABLE para registrar as partições existentes do OSS no MaxCompute. Para a sintaxe completa, consulte Adicionar partições a uma tabela externa do OSS.

MSCK REPAIR TABLE orc_data_type_snappy ADD PARTITIONS;

Etapa 4: Ler dados

SELECT * FROM orc_data_type_snappy WHERE dt = '20250526' LIMIT 10;

A consulta retorna:

+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
| vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongitude | recordtime     | direction  | dt         |
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
| 1          | 12         | 76         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:10 | SW         | 20250526   |
| 1          | 1          | 51         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:00 | S          | 20250526   |
| 1          | 2          | 13         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:01 | NE         | 20250526   |
| 1          | 3          | 48         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:02 | NE         | 20250526   |
| 1          | 4          | 30         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:03 | W          | 20250526   |
| 1          | 5          | 47         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:04 | S          | 20250526   |
| 1          | 6          | 9          | 1          | 46.81006         | -92.08174         | 9/14/2014 0:05 | S          | 20250526   |
| 1          | 7          | 53         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:06 | N          | 20250526   |
| 1          | 8          | 63         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:07 | SW         | 20250526   |
| 1          | 9          | 4          | 1          | 46.81006         | -92.08174         | 9/14/2014 0:08 | NE         | 20250526   |
| 1          | 10         | 31         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:09 | N          | 20250526   |
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+

Etapa 5: Gravar dados

INSERT INTO orc_data_type_snappy PARTITION (dt = '20250526')
  VALUES (1, 16, 76, 1, 46.81006, -92.08174, '9/14/2014 0:10', 'SW');

-- Verify the inserted row
SELECT * FROM orc_data_type_snappy WHERE dt = '20250526' AND recordid = 16;

A consulta retorna:

+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
| vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongitude | recordtime     | direction  | dt         |
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
| 1          | 16         | 76         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:10 | SW         | 20250526   |
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+

Tipos de dados suportados

Para uma lista completa dos tipos de dados do MaxCompute, consulte Tipos de dados versão 1.0 e Tipos de dados versão 2.0.

O MaxCompute suporta dois modos para a leitura de tabelas externas ORC:

  • Modo JNI (SET odps.ext.oss.orc.native=false;): Suporta operações de leitura e gravação.

  • Modo nativo (SET odps.ext.oss.orc.native=true;): Suporta apenas operações de leitura.

Tipo de dados

Modo JNI (leitura e gravação)

Modo nativo (somente leitura)

TINYINT

Sim

Sim

SMALLINT

Sim

Sim

INT

Sim

Sim

BIGINT

Sim

Sim

BINARY

Sim

Sim

FLOAT

Sim

Sim

DOUBLE

Sim

Sim

DECIMAL(precision,scale)

Sim

Sim

VARCHAR(n)

Sim

Sim

CHAR(n)

Sim

Sim

STRING

Sim

Sim

DATE

Sim

Sim

DATETIME

Não

Sim

TIMESTAMP

Não

Não

TIMESTAMP_NTZ

Sim

Não

BOOLEAN

Sim

Sim

ARRAY

Sim

Sim

MAP

Sim

Sim

STRUCT

Sim

Sim

JSON

Não

Não

Formatos de compactação suportados

Para ler ou gravar arquivos ORC compactados, adicione a propriedade mcfed.orc.compress à seção with serdeproperties ao criar a tabela. Consulte WITH serdeproperties.

Propriedades de compactação

Leitura

Gravação

ZSTD

Sim

Sim

SNAPPY(SnappyRawCodec)

Sim

Sim

SNAPPY(SnappyCodec)

Sim

Não

ZLIB

Sim

Sim

Evolução de schema suportada

As tabelas externas ORC suportam dois métodos para mapear colunas da tabela para campos de arquivos ORC: mapeamento por posição e mapeamento por nome.

  • Mapeamento por posição (padrão): Defina 'mcfed.orc.schema.resolution'='position' ou omita a propriedade. As colunas são correspondidas pela ordem; portanto, a ordem das colunas da tabela deve corresponder exatamente à ordem dos campos no arquivo ORC.

  • Mapeamento por nome: Defina 'mcfed.orc.schema.resolution'='name'. As colunas são correspondidas por nome, independentemente da ordem.

Nota

A tabela abaixo mostra quais operações de alteração de schema são compatíveis com cada método de mapeamento. "Compatível" significa que tanto os dados recém-gravados quanto os históricos podem ser lidos corretamente após a operação.

Alteração de schema

Modo de mapeamento

Suportado

Descrição

Compatibilidade de dados

Adicionar coluna

Por posição

Sim

  • Novas colunas são adicionadas no final. Não é possível especificar a posição.

  • Os valores padrão para as colunas adicionadas aplicam-se apenas aos dados gravados pelo MaxCompute após a alteração.

  • Novos dados que correspondem ao schema atualizado podem ser lidos normalmente.

  • Os dados históricos gravados antes da alteração são lidos com o novo schema.

Por exemplo, após a adição de uma coluna, as linhas históricas que não possuem a nova coluna retornam NULL para essa coluna.

Por nome

Sim

Excluir coluna

Por posição

Não

Não recomendado. O mapeamento por posição exige que a ordem das colunas no DDL corresponda à do arquivo. Após a exclusão de uma coluna, os schemas do DDL e do arquivo divergem, causando erros de leitura.

  • Novos dados que correspondem ao schema atualizado podem ser lidos normalmente.

  • Os dados históricos gravados antes da alteração são lidos usando o novo schema.

Por exemplo, após a exclusão de uma coluna, os dados históricos que ainda contêm a coluna excluída causam erros de leitura.

Por nome

Sim

O mapeamento por nome corresponde às colunas pelo nome, independentemente da ordem.

Compatível

Modificar ordem das colunas

Por posição

Não

Não recomendado. O mapeamento por posição exige que a ordem das colunas no DDL corresponda à do arquivo. Após a reordenação das colunas, os schemas do DDL e do arquivo divergem, causando erros de leitura.

  • Novos dados que correspondem ao schema atualizado podem ser lidos normalmente.

  • Os dados históricos gravados antes da alteração são lidos usando o novo schema.

Por exemplo, após a reordenação das colunas, os dados históricos mantêm a ordem original, causando desalinhamento entre schema e dados.

Por nome

Sim

O mapeamento por nome corresponde às colunas pelo nome, independentemente da ordem.

Compatível

Alterar tipo de dados da coluna

Por posição

Sim

Para conversões de tipo permitidas, consulte Alterar tipo de dados da coluna.

Compatível

Por nome

Sim

Renomear coluna

Por posição

Sim

Compatível

Por nome

Não

Não recomendado. O mapeamento por nome corresponde às colunas pelo nome. Após a renomeação de uma coluna, os arquivos existentes que usam o nome original não podem mais ser correspondidos.

  • Novos dados que correspondem ao schema atualizado podem ser lidos normalmente.

  • Os dados históricos gravados antes da alteração são lidos usando o novo schema.

Por exemplo, após a renomeação de uma coluna, se o schema do arquivo ORC ainda usar o nome original, a coluna retorna NULL na leitura.

Modificar comentário da coluna

Por posição

Sim

O comentário deve ser uma string válida com no máximo 1.024 bytes.

Compatível

Por nome

Sim

Modificar nulabilidade da coluna

Por posição

Não

Por padrão, as colunas aceitam valores nulos.

Não aplicável

Por nome

Não