Este tópico descreve como criar, ler e gravar dados em tabelas externas ORC no OSS.
Restrições
As tabelas externas do OSS não suportam a propriedade de cluster.
O tamanho de um único arquivo não pode exceder 2 GB. Divida os arquivos maiores que 2 GB.
O MaxCompute e o OSS devem estar na mesma região.
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âmetroodps.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 |
|
|
Os arquivos ORC na mesma tabela externa possuem schemas inconsistentes. |
|
|
tblproperties
Propriedade | Quando usar | Descrição | Valor | Padrão |
| 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. |
| Nenhum |
| 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: | Nenhum |
| Defina se os arquivos de saída incluem uma extensão de arquivo. |
|
|
|
| Adicione um sufixo personalizado aos arquivos de saída. | String de sufixo. Caracteres permitidos: letras, dígitos e underscores. | Exemplo: | Nenhum |
| Adicione uma extensão personalizada aos arquivos de saída. Essa propriedade tem prioridade sobre | String de extensão. Caracteres permitidos: letras, dígitos e underscores. Comprimento: 1 a 10 caracteres. | Exemplo: | 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 | 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:
|
| 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 |
|
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
-
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.
-
Conceda permissões.
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.
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.
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 |
|
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. |
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. |
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. |
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 |