Todos os produtos
Search
Central de documentação

MaxCompute:Tabelas externas ORC

Última atualização: Oct 20, 2026

Este tópico descreve como criar, ler e gravar dados em tabelas externas ORC para 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 de você usar uma conta Alibaba Cloud, um usuário RAM ou uma função RAM. Portanto, é necessário criar uma função RAM, conceder a ela permissões para acessar o bucket OSS de destino e configurar o ARN da função no parâmetro odps.properties.rolearn. Para mais informações, consulte Parameters.

  • É possível autorizar acesso na mesma conta ou entre contas diferentes, conforme a necessidade do seu negócio. Recomendamos o uso de uma política de autorização personalizada para um controle de acesso mais granular. Para mais informações, consulte Authorization for external data sources.

Criar uma tabela externa

Sintaxe

Se o esquema do arquivo ORC e o esquema 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 excedentes são descartadas.

  • Incompatibilidade de tipo: O tipo STRING consegue 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.

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

Sintaxe simplificada (recomendada)

Use esta sintaxe quando desejar que o MaxCompute gerencie a autorização automaticamente, utilizando a 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 parâmetros comuns, consulte Basic syntax parameters.

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 esquemas inconsistentes.

name — mapeia colunas por nome.

position — mapeia colunas por posição.

tblproperties

Propriedade

Quando usar

Descrição

Valor

Padrão

mcfed.orc.compress

Gravar dados ORC no OSS em formato compactado.

Não é necessária configuração adicional de parâmetros para 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)

Adicionar um prefixo personalizado aos arquivos de saída.

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

Exemplo: mc_

Nenhum

odps.external.data.enable.extension

Controlar 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

Adicionar um sufixo personalizado aos arquivos de saída.

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

Exemplo: _hangzhou

Nenhum

odps.external.data.output.explicit.extension

Adicionar uma extensão personalizada aos arquivos de saída. Tem prioridade sobre odps.external.data.enable.extension.

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

Exemplo: jsonl

Nenhum

odps.ext.column.mapping

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

Esta 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. É necessário especificar mapeamentos apenas para campos que contenham caracteres especiais.

Sem valor fixo

Nenhum

odps.ext.column.mapping.delimiters

(Use apenas quando 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 ,

Esta propriedade personaliza os delimitadores intra-grupo e inter-grupo para pares chave-valor. O valor deve conter exatamente dois caracteres: o primeiro caractere serve como delimitador chave-valor, e o segundo caractere serve 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 à esquerda e à direita nas chaves e valores são removidos durante a análise.

mcfed.orc.batch.size

Ajustar 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 MaxCompute OSS suportam filtragem por lista de permissões e lista de bloqueios. Ao definir parâmetros de lista de permissões e lista de bloqueios em tblproperties, é possível filtrar quais arquivos devem ser lidos de um diretório. Para detalhes, consulte Whitelist and blacklist.

Gravar dados

Para detalhes sobre a sintaxe de gravação no MaxCompute, consulte Write syntax.

Consultar dados

  • Consulte Query syntax para detalhes sobre a sintaxe SELECT.

  • Consulte Query optimization para detalhes sobre 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 empurrar as condições de filtro para a camada de varredura de dados. O PPD requer o modo nativo (odps.ext.oss.orc.native=true).

    Adicione as seguintes instruções antes da sua 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ê possui created a MaxCompute project.

  2. Um bucket e um diretório OSS foram preparados. Para mais informações, consulte Create a bucket e Manage directories.

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

    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 STS-mode authorization for OSS.

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

Etapa 1: Preparar o arquivo de dados

Usando o sample data fornecido, crie o caminho de pasta orc_snappy/dt=20250526 no bucket oss-mc-test. Carregue o snappy file na 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 partições OSS existentes no MaxCompute. Para a sintaxe completa, consulte Adding partitions to an OSS external table.

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 obter a lista completa de tipos de dados do MaxCompute, consulte Data type version 1.0 e Data type version 2.0.

O MaxCompute suporta dois modos para 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 dado

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 esquema suportada

Tabelas externas ORC suportam dois métodos para mapear colunas da tabela para campos de arquivo ORC: mapeamento baseado em posição e mapeamento baseado em nome.

  • Mapeamento baseado em 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 baseado em nome: Defina 'mcfed.orc.schema.resolution'='name'. As colunas são correspondidas pelo nome, independentemente da ordem.

Nota

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

Alteração de esquema

Modo de mapeamento

Suportado

Descrição

Compatibilidade de dados

Adicionar coluna

Por posição

Sim

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

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

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

  • Dados históricos gravados antes da alteração são lidos usando o novo esquema.

Por exemplo, após adicionar uma coluna, 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 baseado em posição exige que a ordem das colunas no DDL corresponda à do arquivo. Após excluir uma coluna, os esquemas do DDL e do arquivo divergem, causando erros de leitura.

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

  • Dados históricos gravados antes da alteração são lidos usando o novo esquema.

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

Por nome

Sim

O mapeamento baseado em nome corresponde às colunas pelo nome, independentemente da ordem das colunas.

Compatível

Modificar ordem das colunas

Por posição

Não

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

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

  • Dados históricos gravados antes da alteração são lidos usando o novo esquema.

Por exemplo, após reordenar as colunas, os dados históricos mantêm a ordem original, causando desalinhamento entre esquema e dados.

Por nome

Sim

O mapeamento baseado em nome corresponde às colunas pelo nome, independentemente da ordem das colunas.

Compatível

Alterar tipo de dado da coluna

Por posição

Sim

Para conversões de tipo permitidas, consulte Change column data type.

Compatível

Por nome

Sim

Renomear coluna

Por posição

Sim

Compatível

Por nome

Não

Não recomendado. O mapeamento baseado em nome corresponde às colunas pelo nome. Após renomear uma coluna, arquivos existentes que usam o nome original não conseguem mais fazer a correspondência.

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

  • Dados históricos gravados antes da alteração são lidos usando o novo esquema.

Por exemplo, após renomear uma coluna, se o esquema do arquivo ORC ainda usar o nome original, a coluna retornará 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

As colunas aceitam nulos por padrão.

Não aplicável

Por nome

Não