O MaxCompute permite criar uma tabela externa do Paimon para mapear um diretório de tabelas Paimon armazenado no Object Storage Service (OSS) e acessar os dados contidos nele. Este tópico descreve como criar uma tabela externa do Paimon e acessá-la no MaxCompute.
Visão geral
Apache Paimon é um formato de armazenamento para data lakehouse que suporta processamento em lote e em streaming, oferecendo gravações de alto throughput e consultas de baixa latência. Totalmente integrado a engines de computação populares como Spark, Hive e Trino, bem como ao Realtime Compute for Apache Flink e ao E-MapReduce, o Apache Paimon permite construir rapidamente um data lake no OSS e conectá-lo ao MaxCompute para análise de dados. O recurso de filtragem de metadados melhora ainda mais o desempenho das consultas, ignorando arquivos de diretório desnecessários no OSS durante operações de leitura.
Limitações
-
Limitações de schema
As tabelas externas do Paimon não atualizam automaticamente seus schemas para refletir alterações nos arquivos Paimon subjacentes.
-
Limitações de propriedades da tabela
Não é possível definir propriedades de cluster em uma tabela externa do Paimon.
Não é possível definir uma chave primária.
As tabelas externas do Paimon não suportam o repasse de propriedades de tabelas Paimon.
-
Operações de gravação, atualização e consulta de dados
Use as instruções
INSERT INTOouINSERT OVERWRITEpara gravar dados em uma tabela externa do Paimon.Não há suporte para gravação de dados em tabelas de buckets dinâmicos nem em tabelas entre partições.
As operações
UPDATEeDELETEnão são suportadas em tabelas externas do Paimon.Consultas de time-travel que acessam versões históricas de dados não são suportadas para tabelas externas do Paimon.
Não grave dados diretamente em tabelas externas do Paimon. Em vez disso, utilize métodos como UNLOAD para exportar dados ao OSS.
O MaxCompute e o OSS precisam estar na mesma região.
Para mais informações, consulte Supported data types.
Descrição de permissões
Ao acessar tabelas externas do OSS, o acesso aos dados é feito 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, crie uma função RAM e conceda a ela permissões para acessar o bucket OSS de destino e, em seguida, configure o ARN da função no parâmetroodps.properties.rolearn. Para mais informações, consulte Parameters.Você pode autorizar acesso na mesma conta ou entre contas diferentes conforme os requisitos do seu negócio. Recomendamos usar 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 do Paimon
Sintaxe
Para detalhes sobre a sintaxe de criação de tabelas externas em diferentes formatos, consulte OSS external tables.
CREATE EXTERNAL TABLE [if NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
STORED BY 'org.apache.paimon.hive.PaimonStorageHandler'
WITH serdeproperties (
'odps.properties.rolearn'='acs:ram::<uid>:role/<role_name>'
)
LOCATION '<oss_location>';
Parâmetros comuns
Para mais informações sobre os parâmetros comuns, consulte Basic syntax parameters.
Gravar dados
Para detalhes sobre a sintaxe de gravação no MaxCompute, consulte Write syntax.
Consultar e analisar dados
A lógica de fragmentação (split) de dados para tabelas Paimon difere da utilizada em tabelas nativas do MaxCompute. O formato Paimon possui seus próprios mecanismos internos de organização e fragmentação de arquivos, que não se alinham completamente aos parâmetros do MaxCompute.
Para a sintaxe do SELECT, consulte Query syntax.
Para otimizar planos de consulta, consulte Query optimization.
Para mais informações sobre como ignorar linhas inválidas, consulte BadRowSkipping.
Exemplo
Etapa 1: Pré-requisitos
Você concluiu created a MaxCompute project.
-
Prepare um bucket e um diretório no OSS. Para mais informações, consulte Create a bucket e Manage directories.
Certifique-se de que o bucket esteja na mesma região do seu projeto MaxCompute.
-
Conceda as permissões necessárias.
Você tem permissão para acessar o OSS. O acesso a uma tabela externa do OSS pode ser feito por meio de 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ê tem a permissão CreateTable no projeto MaxCompute. Para mais informações sobre permissões relacionadas a tabelas, consulte MaxCompute permissions.
Etapa 2: Preparar dados no Flink
Crie um catalog do Paimon e uma tabela Paimon e, em seguida, insira dados na tabela.
Se você já tiver dados de tabelas Paimon no OSS, ignore esta etapa.
-
Criar um filesystem catalog do Paimon
Acesse o console do real-time compute for Apache Flink e selecione uma região no canto superior esquerdo.
Clique no nome do workspace de destino e, no painel de navegação à esquerda, selecione Data Management.
-
Na página catalog list , clique em Create Catalog . Na caixa de diálogo Create Catalog , selecione Apache Paimon, clique em Next e configure os seguintes parâmetros:
Parameter
Required
Description
metastore
Yes
The metastore type. In this example, select
filesystem.catalog name
Yes
A custom catalog name, such as
paimon-catalog.warehouse
Yes
The warehouse directory in OSS. In this example, the directory is
oss://paimon-fs/paimon-test/.fs.oss.endpoint
Yes
The endpoint of the OSS service. For example, the endpoint for the China (Hangzhou) region is
oss-cn-hangzhou-internal.aliyuncs.com.fs.oss.accessKeyId
Yes
The AccessKey ID used to access OSS.
fs.oss.accessKeySecret
Yes
The AccessKey secret used to access OSS.
-
Criar uma tabela Paimon
Acesse o console do real-time compute for Apache Flink e selecione uma região no canto superior esquerdo.
Clique no nome do workspace de destino e, no painel de navegação à esquerda, selecione .
-
Na aba Query Script, clique em
para criar um novo script de consulta.Insira e execute os seguintes comandos:
CREATE TABLE `paimon_catalog`.`default`.test_tbl ( id BIGINT, data STRING, dt STRING, PRIMARY KEY (dt, id) NOT ENFORCED ) PARTITIONED BY (dt); INSERT INTO `paimon-catalog`.`default`.test_tbl VALUES (1,'CCC','2024-07-18'), (2,'DDD','2024-07-18');
-
Para jobs SQL concluídos automaticamente, como aqueles que executam uma instrução
INSERT INTO ... VALUES ..., realize as seguintes operações:Clique no nome do workspace de destino. No painel de navegação à esquerda, escolha .
Na página Deployments, clique no job de destino para abrir a página deployment details.
-
Na seção Parameters, clique em Edit. Em seguida, na seção Other Configuration, defina
execution.checkpointing.checkpoints-after-tasks-finish.enabled: truee salve as alterações.Para mais informações sobre como configurar parâmetros de runtime de um job, consulte Configure job deployment information.
Etapa 3: Criar uma tabela externa do Paimon
Execute a seguinte instrução SQL no MaxCompute para criar uma tabela externa do Paimon:
CREATE EXTERNAL TABLE oss_extable_paimon_pt
(
id BIGINT,
data STRING
)
PARTITIONED BY (dt STRING )
STORED BY 'org.apache.paimon.hive.PaimonStorageHandler'
WITH serdeproperties (
'odps.properties.rolearn'='acs:ram::<uid>:role/<role_name>'
)
LOCATION 'oss://oss-cn-<your region>-internal.aliyuncs.com/<table_path>'
;
Na instrução acima, table_path é o caminho para a tabela Paimon criada no Flink, como paimon-fs/paimon-test/default.db/test_tbl. Para localizar esse caminho, siga as etapas abaixo:
Acesse o console do real-time compute for Apache Flink e selecione uma região no canto superior esquerdo.
Clique no nome do workspace de destino e, no painel de navegação à esquerda, selecione Data Management.
Na página Catalogs, no catalog de destino, clique em default. Na página default, localize a tabela de destino e clique em View na coluna Actions.
Na aba Table Schema, copie o valor do parâmetro path na seção Properties. Em table_path, insira o caminho sem o prefixo
oss://.
Etapa 4: Carregar dados de partição
Se a tabela externa do OSS criada for uma tabela particionada, carregue suas partições. Para mais informações, consulte OSS external tables.
MSCK REPAIR TABLE oss_extable_paimon_pt ADD PARTITIONS;
Etapa 5: Consultar a tabela externa do Paimon
Execute os seguintes comandos no MaxCompute para consultar a tabela externa do Paimon oss_extable_paimon_pt.
SET odps.sql.common.table.planner.ext.hive.bridge = true;
SET odps.sql.hive.compatible = true;
SELECT * FROM oss_extable_paimon_pt WHERE dt='2024-07-18';
O seguinte resultado é retornado:
+------------+------------+------------+
| id | data | dt |
+------------+------------+------------+
| 1 | CCC | 2024-07-18 |
| 2 | DDD | 2024-07-18 |
+------------+------------+------------+
Se o schema nos arquivos Paimon diferir do schema da tabela externa:
Divergência na contagem de colunas: Se os arquivos Paimon tiverem menos colunas do que o DDL da tabela externa, o MaxCompute lerá as colunas ausentes como NULL. Se os arquivos tiverem mais colunas, o MaxCompute as ignorará.
Divergência no tipo de coluna: Não é possível ler dados de uma coluna STRING do Paimon em uma coluna INT do MaxCompute. A leitura de dados de uma coluna INT em uma coluna STRING é suportada, mas não recomendada.
Tipos de dados suportados
Para mais informações sobre os tipos de dados do MaxCompute, consulte Data type editions 1.0 e 2.0.
Tipo de dado Paimon | Tipo de dado MaxCompute 2.0 | Suporte a leitura/gravação | Descrição |
TINYINT | TINYINT | Inteiro com sinal de 8 bits. | |
SMALLINT | SMALLINT | Inteiro com sinal de 16 bits. | |
INT | INT | Inteiro com sinal de 32 bits. | |
BIGINT | BIGINT | Inteiro com sinal de 64 bits. | |
BINARY(MAX_LENGTH) | BINARY | Tipo de dado binário. O comprimento máximo atual é 8 MB. | |
FLOAT | FLOAT | Número de ponto flutuante binário de 32 bits. | |
DOUBLE | DOUBLE | Número de ponto flutuante binário de 64 bits. | |
DECIMAL(precision,scale) | DECIMAL(precision,scale) | Tipo numérico decimal exato. O padrão é
| |
VARCHAR(n) | VARCHAR(n) | Tipo de caractere de comprimento variável. O parâmetro n especifica o comprimento, que varia de 1 a 65.535. | |
CHAR(n) | CHAR(n) | Tipo de caractere de comprimento fixo. O parâmetro n especifica o comprimento, que varia de 1 a 255. | |
VARCHAR(MAX_LENGTH) | STRING | Tipo string. O comprimento máximo atual é 8 MB. | |
DATE | DATE | Tipo data. O formato é | |
TIME, TIME(p) | Not supported | O tipo de dado TIME do Paimon representa um horário sem fuso horário, composto por horas, minutos e segundos, com precisão de nanossegundos. TIME(p) especifica a precisão de segundos fracionários de 0 a 9. O valor padrão é 0. Não existe tipo correspondente no MaxCompute. | |
TIMESTAMP, TIMESTAMP(p) | TIMESTAMP_NTZ | Tipo timestamp sem fuso horário com precisão de nanossegundos. Para ler este tipo de dado, desative o bridge JNI nativo executando o seguinte comando: | |
TIMESTAMP WITH LOCAL TIME_ZONE(9) | TIMESTAMP |
| |
TIMESTAMP WITH LOCAL TIME_ZONE(9) | DATETIME | Tipo timestamp com precisão de nanossegundos. O formato é | |
BOOLEAN | BOOLEAN | Tipo BOOLEAN. | |
ARRAY | ARRAY | Tipo complexo. | |
MAP | MAP | Tipo complexo. | |
ROW | STRUCT | Tipo complexo. | |
MULTISET<t> | Not supported | Não existe tipo correspondente no MaxCompute. | |
VARBINARY, VARBINARY(n), BYTES | BINARY | Tipo de dado de strings binárias de comprimento variável. |
Solução de problemas
Erro kSIGABRT ao ler uma tabela externa do Paimon
-
Mensagem de erro:
ODPS-0123144: Fuxi job failed - kSIGABRT(errCode:6) at Odps/*****_SQL_0_1_0_job_0/M1@f01b17437.cloud.eo166#3. Detail error msg: CRASH_CORE, maybe caused by jvm crash, please check your java udf/udaf/udtf. | fatalInstance: Odps/*****_SQL_0_1_0_job_0/M1#0_0 -
Causa:
Esse erro ocorre ao ler uma coluna TIMESTAMP_NTZ no modo JNI.
-
Solução:
Desative o bridge JNI executando o seguinte comando antes da consulta:
SET odps.sql.common.table.jni.disable.native=true;
Artigos relacionados
Você também pode usar um catalog do Flink personalizado para gerenciar tabelas externas do Paimon no MaxCompute, permitindo gravar dados pelo Flink e consultá-los no MaxCompute. Para mais informações, consulte Create a MaxCompute Paimon external table by using Flink.