Este tópico descreve como criar, ler e gravar dados em tabelas externas ORC para OSS.
Restrições
Tabelas externas do OSS não suportam a propriedade de cluster.
O tamanho de um único arquivo não pode exceder 2 GB. Arquivos maiores que 2 GB devem ser divididos.
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 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âmetroodps.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 |
|
|
Os arquivos ORC na mesma tabela externa possuem esquemas inconsistentes. |
|
|
tblproperties
Propriedade | Quando usar | Descrição | Valor | Padrão |
| 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. |
| Nenhum |
| 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: | Nenhum |
| Controlar se os arquivos de saída incluem uma extensão de arquivo. |
|
|
|
| Adicionar um sufixo personalizado aos arquivos de saída. | String de sufixo. Caracteres permitidos: letras, dígitos e sublinhados. | Exemplo: | Nenhum |
| Adicionar uma extensão personalizada aos arquivos de saída. Tem prioridade sobre | String de extensão. Caracteres permitidos: letras, dígitos e sublinhados. Comprimento: 1–10 caracteres. | Exemplo: | 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 | 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:
|
| 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 |
|
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
Você possui created a MaxCompute project.
-
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.
-
Conceda as permissões necessárias.
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.
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.
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 |
|
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. |
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. |
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. |
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 |