Todos os produtos
Search
Central de documentação

MaxCompute:Tabelas externas do Hologres

Última atualização: Sep 22, 2026

Este tópico descreve como criar uma tabela externa do Hologres, incluindo como especificar uma source de dados do Hologres, conceder acesso por meio de uma função RAM ou função vinculada ao service, mapear uma tabela de destino e definir configurações do driver JDBC na instrução CREATE TABLE.

Visão geral

O Hologres é um data warehouse analítico interativo em tempo real, compatível com o protocolo PostgreSQL e integrado de forma nativa ao MaxCompute. Você pode criar tabelas externas do Hologres no MaxCompute para consultar uma source de dados do Hologres usando o driver PostgreSQL JDBC e Hologres RAM role authentication. Esse método elimina o armazenamento redundante, dispensa importações ou exportações de dados e entrega resultados de consulta com rapidez.

Limitações

  • Manipulação de dados (DML)

    • O MaxCompute não oferece suporte a operações UPDATE ou DELETE em tabelas externas do Hologres.

    • Tabelas externas do Hologres não oferecem suporte à instrução INSERT OVERWRITE.

      Para sobrescrever dados em uma tabela do Hologres com dados do MaxCompute, execute uma instrução INSERT OVERWRITE no Hologres. Essa instrução lê dados de uma tabela externa no Hologres mapeada para uma tabela do MaxCompute. Para mais informações, consulte INSERT OVERWRITE.

  • Risco na gravação de dados

    Ao gravar grandes volumes de dados em uma tabela externa do Hologres, processos paralelos de escrita são utilizados. Em casos raros, um desses processos pode reescrever dados, o que pode causar duplicação.

  • Partições

    Tabelas particionadas no Hologres e no MaxCompute não possuem mapeamento direto entre si. Tabelas externas do Hologres não oferecem suporte a partições. No entanto, no modo de leitura direta, ao consultar uma tabela externa do Hologres mapeada para uma tabela-pai particionada do Hologres, o partition pruning é aplicado quando o filtro da consulta inclui uma condição na coluna de partição de uma tabela-filha particionada subjacente.

  • Tabelas externas do Hologres não oferecem suporte ao atributo cluster.

  • Tabelas externas do Hologres não oferecem suporte ao mapeamento para uma Dynamic Table do Hologres.

  • Consulte a lista de Supported data types.

Criar uma tabela externa do Hologres

Você pode criar uma tabela externa do Hologres por meio do RAM role authorization for Hologres ou do service-linked role authorization mode.

Considerações

Diretrizes para criação de tabelas externas

  • Se a sua instância do Hologres utiliza uma lista de permissões de IP para acesso externo, atualize-a para uma versão compatível:

    • Para o modo de autorização por função RAM, atualize para o Hologres V3.2 ou posterior.

    • Para o modo de autorização por service-linked role, atualize para o Hologres V2.0.28 ou posterior.

    Após a atualização, o Hologres confia automaticamente nos IPs dos nós do MaxCompute com base na identidade do service MaxCompute ou na service-linked role. Não é mais necessário adicionar os endereços IP dos nós elásticos do MaxCompute à lista de permissões de IP da sua instância do Hologres.

  • É possível mapear tanto tabelas pai quanto tabelas filhas do Hologres para uma tabela externa. No entanto, uma tabela externa mapeada para uma tabela pai permite apenas leitura, não escrita.

  • Ao gravar dados em uma tabela externa do Hologres, o mecanismo INSERT ON CONFLICT (UPSERT) não é suportado. Se a tabela de origem do Hologres possuir uma chave primária, evite gravar dados que causem conflitos de chave primária.

  • Nomes de tabelas e nomes de colunas não diferenciam maiúsculas de minúsculas. Não é possível forçar a diferenciação de maiúsculas e minúsculas ao criar ou consultar tabelas e colunas.

Compatibilidade de schema

Se o schema da tabela de origem do Hologres não corresponder ao schema da tabela externa, observe os seguintes pontos:

  • Quantidade de colunas divergente: Se a tabela de origem tiver menos colunas que a tabela externa, a leitura de dados falha com um erro como column "xxx" does not exist. Se a tabela de origem tiver mais colunas que a tabela externa, as colunas excedentes são ignoradas.

  • Tipos de colunas divergentes: O MaxCompute não consegue mapear uma coluna STRING de uma tabela de origem do Hologres para uma coluna INT na tabela externa. O mapeamento de uma coluna INT para uma coluna STRING é suportado, mas não recomendado.

Sintaxe

Ao criar uma tabela externa, especifique o StorageHandler na instrução DDL CREATE TABLE, configure a autorização por função RAM ou por service-linked role e forneça a URL de conexão JDBC para acessar a fonte de dados do Hologres.

Modo de função RAM

Para obter um exemplo de código completo, consulte Create a Hologres external table (RAM role authorization mode).

CREATE EXTERNAL TABLE [IF NOT EXISTS] <table_name>(
  <col1_name> <data_type>,
  <col2_name> <data_type>,
  ......
)
stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
WITH serdeproperties (
  'odps.properties.rolearn'='<role_arn>')
location 'jdbc:postgresql://<endpoint>:<port>/<database>?
  ApplicationName=MaxCompute&[currentSchema=<schema>&]
  [useSSL={true|false}&]table=<holo_table_name>/' 
tblproperties (
  'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 
  'odps.federation.jdbc.target.db.type'='holo',
-- When Hologres and MaxCompute column names differ, add the odps.federation.jdbc.colmapping parameter to map columns. 
-- This parameter can be omitted if column names are identical.
  ['odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, 
                                     <table_column2>:<source_column2>,...']
);

Modo de service-linked role

Para obter um exemplo de código completo, consulte Create a Hologres external table (service-linked role authorization mode).

O modo de autorização por service-linked role permite que o mesmo usuário RAM acesse tabelas autorizadas tanto no MaxCompute quanto no Hologres sem autorização manual. Esse modo também oferece suporte ao recurso de lista de permissões de IP do Hologres.

-- Create an external table
CREATE EXTERNAL TABLE [IF NOT EXISTS]  <table_name>(
  <col1_name> <data_type>,
  <col2_name> <data_type>,
  ......
)
STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
LOCATION 'jdbc:postgresql://<endpoint>:<port>/<database>?
  ApplicationName=MaxCompute&[currentSchema=<schema>&]
  [useSSL={true|false}&]table=<holo_table_name>/' 
tblproperties (
  'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 
  'odps.federation.jdbc.target.db.type'='holo',
-- When Hologres and MaxCompute column names differ, add the odps.federation.jdbc.colmapping parameter to map columns. 
-- This parameter can be omitted if column names are identical.
   ['odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, 
                                      <table_column2>:<source_column2>,...']
);

Parâmetros

Clique para ver os detalhes dos parâmetros

Parâmetro

Obrigatório

Descrição

IF NOT EXISTS

Não

  • Se você não especificar a opção IF NOT EXISTS e já existir uma tabela com o mesmo nome, um erro será reportado.

  • Ao especificar IF NOT EXISTS, a instrução é executada com sucesso independentemente de existir uma tabela com o mesmo nome. Os metadados da tabela existente não são modificados, mesmo que o schema seja diferente do que está sendo criado.

table_name

Sim

O nome da tabela externa do Hologres a ser criada no MaxCompute.

col_name

Sim

O nome de uma coluna na tabela externa do Hologres.

data_type

Sim

O tipo de dado de uma coluna na tabela externa do Hologres.

STORED BY

Sim

O StorageHandler que define como consultar a tabela externa do Hologres.

Defina o valor como com.aliyun.odps.jdbc.JdbcStorageHandler para utilizar o método de conexão JDBC.

role_arn

Sim

Este parâmetro é obrigatório ao criar uma tabela externa do Hologres no modo de autorização por função RAM. Trata-se do ARN da função RAM especificada, utilizado para configurar a autenticação durante a criação de tabelas externas. Para mais informações sobre como criar uma função RAM e conceder permissões, consulte Hologres RAM role authorization.

  1. Faça login no RAM console.

  2. No painel de navegação à esquerda, selecione Identities > Roles.

  3. Na página Roles, clique em no Role Name desejado para acessar a página de detalhes da função.

  4. Na seção Basic Information, obtenha o ARN.

Não

Este parâmetro não é obrigatório no modo de service-linked role.

LOCATION

Sim

A string de conexão JDBC da instância do Hologres. Ela contém os seguintes parâmetros:

  • endpoint: Obrigatório. O nome de domínio da rede clássica da instância do Hologres.

    Importante

    Atualmente, a conexão com o Hologres é possível apenas pela rede clássica. Conexões via VPC não são suportadas.

  • port: Obrigatório. A porta de rede da instância do Hologres.

    1. Faça login no Hologres management console. No canto superior esquerdo, selecione uma região.

    2. No painel de navegação à esquerda, clique em Instances.

      Na página Instances, clique em no nome da instância desejada.

    3. Na seção Network Information, localize o nome de domínio da rede clássica e a porta da instância do Hologres.

  • database: Obrigatório. O nome do banco de dados de destino do Hologres. Para mais informações, consulte CREATE DATABASE.

  • ApplicationName: Obrigatório. O valor padrão é MaxCompute. Não é necessário alterar esse valor.

  • schema: Opcional. Esse parâmetro pode ser omitido se o nome da tabela for exclusivo dentro do banco de dados ou se a tabela de origem estiver no schema padrão. Para mais informações, consulte CREATE SCHEMA.

  • holo_table_name: Obrigatório. O nome da tabela de origem do Hologres. Para mais informações, consulte CREATE TABLE.

  • useSSL: Opcional. Especifica a configuração de segurança para o acesso entre o MaxCompute e o Hologres pela rede clássica da Alibaba Cloud.

    • true: ativa o SSL para usar uma conexão criptografada segura.

    • false: desativa o SSL.

tblproperties

Sim

  • mcfed.mapreduce.jdbc.driver.class: Obrigatório.

    O driver para conexão com o banco de dados do Hologres. O valor deve ser org.postgresql.Driver.

  • odps.federation.jdbc.target.db.type: Obrigatório.

    O tipo de banco de dados. O valor deve ser holo.

  • odps.federation.jdbc.colmapping: Opcional.

    O mapeamento entre as colunas da tabela externa e as colunas da tabela de origem do Hologres.

    • Se este parâmetro não estiver configurado, as colunas são mapeadas por nome entre as tabelas de origem e externa.

    • Ao configurar este parâmetro apenas para algumas colunas, as colunas especificadas são mapeadas conforme definido, enquanto as demais são mapeadas por nome. Um erro ocorre se os nomes ou tipos de dados dessas colunas mapeadas automaticamente não corresponderem.

    • Se o nome de uma coluna do Hologres contiver letras maiúsculas, coloque o nome da coluna entre aspas duplas (""). Formato: MaxCompute_column_1:"Hologres_column_1"[,MaxCompute_column_2:"Hologres_column_2",...].

      Nota

      Suponha que a tabela de origem do Hologres contenha as colunas c bool, map_B string, a bigint, e a tabela externa contenha as colunas a bigint, x string, c bool.

      Se a configuração de colmapping for definida como 'x: "map_B"', o mapeamento e a consulta dos dados do Hologres serão realizados com sucesso.

  • mcfed.mapreduce.jdbc.input.query: Opcional.

    Lê dados de uma tabela de fonte de dados do Hologres. As colunas, os nomes de colunas e os tipos de dados da tabela externa devem corresponder aos da tabela de origem — ou ao alias, caso um tenha sido utilizado. O formato de select_sentence é SELECT xxx FROM <holo_database_name>.<holo_schema_name>.<holo_table_name>.

  • mcfed.holo.read.freshness.seconds: Opcional.

    • Ao ler o Hologres no modo de leitura direta, utilize o parâmetro de freshness para controlar a atualidade dos dados. Isso significa que o snapshot gerado contém pelo menos todos os dados até o momento de now() - freshness, o que pode reduzir a geração de arquivos pequenos e melhorar o desempenho das consultas até certo ponto.

    • Valor padrão: 60. Unidade: segundos. Intervalo de valores: ≥ -1 e ≤ 86400.

    • Esse parâmetro também pode ser definido no nível da sessão adicionando SET odps.external.holo.read.freshness.seconds = <num>; antes da instrução SQL.

    • Prioridade de configuração do parâmetro: nível de sessão > nível de tblproperties (tabela) > valor padrão do GUC do Hologres (60 segundos).

Exemplos

Etapa 1: Preparar os dados do Hologres

Pule esta etapa caso já possua um banco de dados, uma tabela e dados de teste no Hologres.

Criar um banco de dados no Hologres

  1. Acesse o console de gerenciamento do Hologres. No canto superior esquerdo, selecione uma região.

  2. No painel de navegação à esquerda, clique em Instances.

  3. Se você não possuir uma instância, primeiro é necessário purchase a Hologres instance.

    Na página Instances, clique em o nome da instância desejada.

  4. Na página de detalhes da instância, clique em Connect to Instance.

  5. Clique em a aba Metadata Management.

    Clique em Create Database, insira o Database Name na caixa de diálogo exibida e mantenha os demais parâmetros com seus valores padrão.

Criar uma tabela no Hologres

  1. Na página de detalhes da instância, clique em Connect to Instance.

  2. Clique em a aba SQL Editor.

  3. Execute as instruções a seguir para criar uma tabela e inserir dados:

    CREATE TABLE IF NOT EXISTS holo (
        id   INT PRIMARY KEY,
        name TEXT
    );
    INSERT INTO holo (id, name) VALUES
        (1, 'kate'),
        (2, 'mary'),
        (3, 'bob'),
        (4, 'tom'),
        (5, 'lulu'),
        (6, 'mark'),
        (7, 'haward'),
        (8, 'lilei'),
        (9, 'hanmeimei'),
        (10, 'lily'),
        (11, 'lucy');
    SELECT * FROM holo ORDER BY id;

Etapa 2: Criar uma tabela externa do Hologres

RAM role

Neste modo, o criador da tabela externa incorpora uma função RAM com permissões de acesso aos dados do Hologres na definição da tabela externa. Outros usuários do MaxCompute podem então receber permissões sobre essa tabela externa. Ao acessar a tabela externa, o sistema utiliza a função RAM vinculada para acessar os dados na tabela mapeada do Hologres.

O Hologres não oferece suporte à adição de uma função RAM entre contas a uma instância de banco de dados. Portanto, o Hologres no modo de função RAM suporta apenas funções RAM da mesma conta. Da mesma forma, quando o MaxCompute acessa o Hologres por meio de uma tabela externa ou schema externo, apenas funções RAM da mesma conta são suportadas.

Pré-requisitos

  1. Você concluiu installed and configured the MaxCompute client.

  2. Você possui um projeto MaxCompute de destino no qual deseja criar a tabela externa do Hologres.

    Para mais informações, consulte Create MaxCompute project.

  3. Você criou e autorizou uma função RAM. Para mais informações, consulte Authorize a RAM Role for Hologres.

Criar a tabela externa no MaxCompute

  1. Acesse o cliente MaxCompute e mude para o projeto MaxCompute de destino.

  2. Execute a instrução a seguir para criar a tabela externa do Hologres.

    O exemplo a seguir utiliza os dados preparados em Step 1: Prepare Hologres data:

    • Nome do banco de dados do Hologres: holo_external_test.

    • Schema do banco de dados do Hologres: public.

    • Nome da tabela do Hologres: holo.

    • Endpoint de rede clássica do Hologres: hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80.

    CREATE EXTERNAL TABLE IF NOT EXISTS my_table_holo_jdbc
    (
      user_id bigint,
      user_name string
    )
    stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' 
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::139699392458****:role/<role name>')
    location 'jdbc:postgresql://hgprecn-cn-oew210ut****-cn-<region>-internal.hologres.aliyuncs.com:80
      /<holo database name>?ApplicationName=MaxCompute
      &currentSchema=public&table=<table name>/'
    tblproperties (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo',
    -- When the column names of the Hologres source table differ from those of the Hologres external table,
    -- add the odps.federation.jdbc.colmapping parameter for column mapping.
    -- This parameter can be omitted when the column names are identical.
      'odps.federation.jdbc.colmapping'='user_id:id,user_name:name'
    );
  3. Execute os comandos a seguir para consultar a tabela source do Hologres por meio da tabela externa recém-criada.

    -- The following properties are required to access Hologres external tables.
    SET odps.sql.split.hive.bridge=true;
    SET odps.sql.hive.compatible=true;
    SET odps.table.api.enable.holo.table=true; --Enable JDBC direct read access 
    -- Query data from the Hologres external table.
    SELECT * FROM my_table_holo_jdbc limit 10;
    -- The command returns the following result.
    +------------+------------+
    | user_id    | user_name  |
    +------------+------------+
    | 9          | hanmeimei  | 
    | 4          | tom        | 
    | 7          | haward     | 
    | 2          | mary       | 
    | 5          | lulu       | 
    | 8          | lilei      | 
    | 10         | lily       | 
    | 1          | kate       | 
    | 6          | mark       | 
    | 11         | lucy       | 
    +------------+------------+
  4. Utilize a tabela externa do Hologres para trocar dados com o Hologres e realizar análises federadas.

    • Grave dados processados no MaxCompute no Hologres por meio da tabela externa para acelerar análises e serviços on-line.

      -- The following properties are required to access Hologres external tables.
      SET odps.sql.split.hive.bridge=true;
      SET odps.sql.hive.compatible=true;
      SET odps.table.api.enable.holo.table=true; --Enable JDBC direct read access 
      -- Insert data into the Hologres external table.
      INSERT INTO my_table_holo_jdbc VALUES (12,'alice');
      -- Query data from the Hologres external table.
      SELECT * FROM my_table_holo_jdbc;
      -- The command returns the following result.
      +------------+------------+
      | user_id    | user_name  |
      +------------+------------+
      | 9          | hanmeimei  | 
      | 4          | tom        | 
      | 7          | haward     | 
      | 2          | mary       | 
      | 5          | lulu       | 
      | 12         | alice      | 
      | 8          | lilei      | 
      | 10         | lily       | 
      | 1          | kate       | 
      | 11         | lucy       | 
      | 6          | mark       | 
      | 3          | bob        | 
      +------------+------------+
    • Armazene tabelas de dimensão atualizadas com frequência no Hologres para possibilitar atualizações em tempo real. O MaxCompute acessa a tabela de dimensão por meio de uma tabela externa e a combina (join) com uma tabela de fatos no MaxCompute para análise federada.

      -- The following properties are required to access Hologres external tables.
      SET odps.sql.split.hive.bridge=true;
      SET odps.sql.hive.compatible=true;
      -- Create a MaxCompute internal table.
      CREATE TABLE holo_test AS SELECT * FROM my_table_holo_jdbc;
      -- Join the MaxCompute internal table with the Hologres external table for analysis.
      SELECT * FROM my_table_holo_jdbc t1 INNER JOIN holo_test t2 ON t1.id=t2.id;
      -- The command returns the following result.
      +------------+------------+------------+------------+
      | user_id    | user_name  |user_id2    | user_name2 |
      +------------+------------+------------+------------+
      | 9          | hanmeimei  | 9          | hanmeimei  | 
      | 4          | tom        | 4          | tom        | 
      | 7          | haward     | 7          | haward     | 
      | 2          | mary       | 2          | mary       | 
      | 5          | lulu       | 5          | lulu       | 
      | 12         | alice      | 12         | alice      | 
      | 8          | lilei      | 8          | lilei      | 
      | 10         | lily       | 10         | lily       | 
      | 1          | kate       | 1          | kate       | 
      | 11         | lucy       | 11         | lucy       | 
      | 6          | mark       | 6          | mark       | 
      | 3          | bob        | 3          | bob        | 
      +------------+------------+------------+------------+

Service-linked role

Neste modo, é necessário criar uma função vinculada ao service para acessar os dados do Hologres. Para evitar acessos não autorizados, esse modo encaminha a identidade do usuário ao Hologres para autenticação. Assim, o usuário precisa ter permissões tanto na tabela externa quanto na tabela subjacente do Hologres.

Pré-requisitos

  1. Você concluiu installed and configured the MaxCompute client.

  2. Você possui um projeto MaxCompute de destino no qual deseja criar a tabela externa do Hologres.

    Para mais informações, consulte Create MaxCompute project.

  3. Uma conta com o mesmo nome da sua conta MaxCompute existe no Hologres, e essa conta possui permissões de leitura e gravação na tabela de destino.

  4. Esse modo de autorização por função vinculada ao service é compatível apenas com o Hologres V1.3 e versões posteriores. Atualmente, esse modo suporta apenas a leitura de tabelas externas do Hologres, e não a gravação.

Criar a tabela externa no MaxCompute

  1. Acesse o cliente MaxCompute e mude para o projeto MaxCompute de destino.

  2. Execute a instrução a seguir para criar a tabela externa do Hologres.

    O exemplo a seguir utiliza os dados preparados em Step 1: Prepare Hologres data:

    • Nome do banco de dados do Hologres: holo_external_test.

    • Schema do banco de dados do Hologres: public.

    • Nome da tabela do Hologres: holo.

    • Endpoint de rede clássica do Hologres: hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80.

    CREATE EXTERNAL TABLE IF NOT EXISTS holo_mc_external_dbl
    (
      user_id int,
      user_name string
    )
    STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
    location 'jdbc:postgresql://hgpostcn-cn-****-cn-<region>-internal.hologres.aliyuncs.com:80
      /<holo database name>?ApplicationName=MaxCompute
      &currentSchema=public&table=<table name>/'
    TBLPROPERTIES (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo',
    -- When the column names of the Hologres source table differ from those of the Hologres external table,
    -- add the odps.federation.jdbc.colmapping parameter for column mapping.
    -- This parameter can be omitted when the column names are identical.
      'odps.federation.jdbc.colmapping'='user_id:id,user_name:name'
    );
  3. Consulte a tabela externa.

    SELECT * FROM holo_mc_external_dbl;
    -- The command returns the following result.
    +------------+------------+
    | user_id    | user_name  | 
    +------------+------------+
    | 9          | hanmeimei  | 
    | 4          | tom        | 
    | 7          | haward     | 
    | 2          | mary       | 
    | 5          | lulu       | 
    | 12         | alice      | 
    | 8          | lilei      | 
    | 10         | lily       | 
    | 1          | kate       | 
    | 11         | lucy       | 
    | 6          | mark       | 
    | 3          | bob        | 
    +------------+------------+

Ativar leitura direta para tabelas externas do Hologres

Por padrão, o MaxCompute lê dados de tabelas externas do Hologres por meio de uma conexão JDBC. Para melhorar o desempenho, é possível ativar o modo de leitura direta, que permite ao MaxCompute acessar a camada de armazenamento do Hologres diretamente. Esse modo oferece os seguintes benefícios:

  • Estabilidade na leitura de tabelas.

  • Redução significativa da latência de leitura, acelerando as consultas de dados.

  • Funciona em conjunto com predicate pushdown para enviar condições de filtro ao lado do Hologres, reduzindo o volume de dados varridos e diminuindo custos.

  • Diminui drasticamente o número de conexões ao FE do Hologres, minimizando a sobrecarga de desempenho na instância — a maioria das consultas exige apenas uma única conexão.

Limitações

Ao ativar o modo de leitura direta para o Hologres, as seguintes limitações se aplicam. Se essas condições não forem atendidas, a consulta retorna automaticamente ao modo JDBC.

  1. Requisitos de versão

    A instância do Hologres deve estar na versão V1.3.34 ou posterior. O recurso de leitura direta não é compatível com versões anteriores.

  2. Restrições de tipo de tabela

    • O modo de leitura direta não é compatível com tabelas de armazenamento frio do Hologres.

    • Tabelas orientadas a linhas do Hologres também não são compatíveis com o modo de leitura direta.

  3. Limitações de mapeamento de tipos de dados

    Ao utilizar o modo de leitura direta, o mapeamento de um tipo Timestamp With Time Zone no Hologres para um tipo TIMESTAMP no MaxCompute pode causar pequenas discrepâncias de horário. As diferenças são as seguintes:

    • Discrepância no valor do horário

      • Para timestamps anteriores a 1900-12-31 15:54:15, o horário retornado pelo MaxCompute está adiantado em 5 minutos e 44 segundos.

      • Para timestamps entre 1900-12-31 15:54:16 e 1969-12-31 23:59:58, o horário retornado pelo MaxCompute está adiantado em 1 segundo.

      • Para timestamps posteriores a 1969-12-31 23:59:59, os horários no Hologres e no MaxCompute são idênticos.

    • Deslocamento de fuso horário

      • Por exemplo, se o fuso horário do MaxCompute for UTC+8 e uma coluna Timestamp With Time Zone no Hologres contiver 2000-01-01 00:00:00, o MaxCompute retorna 2000-01-01 08:00:00.

      • Outro exemplo: se o fuso horário do MaxCompute for UTC+8 e uma coluna Timestamp With Time Zone no Hologres contiver 1969-01-01 00:00:00, o MaxCompute retorna 1969-01-01 08:00:01.

  4. Restrição de mesma região

    Devido a restrições de conectividade de rede, o MaxCompute pode acessar apenas instâncias do Hologres na mesma região. O acesso entre regiões falha com o seguinte erro: FAILED: ODPS-0010000:System internal error - fuxi job failed, caused by: Pangu request failed with error code 3.

  5. Se a instância do Hologres utilizar uma arquitetura primária/secundária, especifique apenas a instância primária na URL de conexão, e não uma instância secundária.

  6. Limitação adicional para o modo Foreign Server: é necessário ativar a opção de sintaxe no nível de schema para o projeto MaxCompute.

Ativar o modo de leitura direta

Para ativar o modo de leitura direta na sua sessão, adicione o seguinte comando antes da consulta SQL no MaxCompute:

SET odps.table.api.enable.holo.table=true;

Também é possível ativar ou desativar o modo de leitura direta no nível do projeto.

-- You can enable direct read and disable JDBC fallback at the project level.
-- Enable direct read at the project level: 
setproject odps.table.api.enable.holo.table=true; -- Set to true to enable, false to disable.
-- Disable the default fallback to JDBC: 
setproject odps.table.api.allow.fallback.jdbc=false; -- Set to true to allow fallback, false to prevent it.

Verificar o modo de leitura direta

Para verificar se uma consulta utilizou o modo de leitura direta, confira os logs no Logview. Para mais informações sobre como usar o Logview, consulte Use Logview 2.0 to view job running information.

Na aba Summary do Logview, localize o campo external holo tables. O formato é o seguinte:

<project_name>.<table_name>:<access mode>[<(fallback reason)>]

Parâmetros:

Parâmetro

Descrição

project_name

Nome do projeto.

table_name

Nome da tabela.

access mode

Modo de acesso da tabela externa. Valores válidos:

  • Optimized: indica que o modo de leitura direta está em uso. Veja o exemplo a seguir no Logview. Optimized: indica que o modo de otimização de leitura direta está ativado. Na seção Summary do Logview, a mensagem external holo tables: <project_name>.<table_name>:Optimized é exibida, indicando que a tabela externa do Hologres utilizou o caminho otimizado de leitura direta.

  • Fallback: indica que o sistema reverteu para o modo JDBC. Veja o exemplo a seguir no Logview. Na aba Summary, se a seção external holo tables exibir uma mensagem de Fallback, como aliorc_test.holo_lineitem:Fallback (Column type map error Column name l_orderkey Odps type 3 Holo type 4), isso indica que o modo de leitura direta não foi utilizado. Em vez disso, o sistema reverteu para o modo Fallback devido a um erro de mapeamento de tipo de coluna. Para detalhes sobre o motivo do fallback, consulte Fallback Displayed in Direct Read Mode.

Quando um job que utiliza o modo de leitura direta encontra uma limitação, ele reverte automaticamente para o modo JDBC. Sob cargas de trabalho intensas, esse fallback pode consumir recursos significativos do pool de conexões do Hologres, e a transferência de dados no modo JDBC é muito menos eficiente do que no modo de leitura direta. Consequentemente, esses recursos podem ser liberados lentamente, aumentando a carga na instância do Hologres.

Em casos extremos, fallbacks frequentes podem impactar outros services críticos que dependem da mesma instância do Hologres. Para evitar isso, desative o mecanismo de fallback automático adicionando o parâmetro set odps.table.api.allow.fallback.jdbc=false; aos seus jobs. Com isso, os jobs falham em vez de reverter silenciosamente, prevenindo degradação inesperada de desempenho.

Pushdown de predicados para tabelas externas do Hologres

Ao acessar tabelas externas do Hologres, o MaxCompute consegue enviar as condições de filtro da consulta diretamente ao Hologres para execução (pushdown de predicados). Dessa forma, os dados são filtrados antecipadamente no lado do Hologres, o que reduz a transferência de dados e melhora o desempenho das consultas. Os seguintes cenários são suportados:

  • Hologres Snapshot PPD: A expressão de filtro é convertida em uma cláusula SQL WHERE e enviada ao servidor do Hologres por meio do parâmetro filter de holo_create_table_snapshot().

  • Hologres JDBC PPD: A condição WHERE é adicionada à instrução SQL JDBC, e o Hologres filtra os dados na camada SQL.

  • ORC row group column-level filtering: Filtragem em nível de arquivo no lado do MaxCompute. Para cada arquivo ORC, um SearchArgument é construído e passado ao leitor ORC, que utiliza estatísticas de coluna (min/max/count) para ignorar grupos de linhas que não correspondem ao filtro.

Os seguintes cenários terão suporte no futuro:

  • Poda de partições: Para tabelas fisicamente particionadas do Hologres, a expressão de filtro é avaliada em relação a cada valor de partição antes da criação do snapshot. Partições que não correspondem ao filtro são ignoradas, e nenhum snapshot é criado para elas.

  • Filtragem por chave de segmento: Após o retorno do snapshot pelo Hologres, o MaxCompute analisa os valores min/max da chave de segmento nos metadados de cada arquivo e compara o intervalo com a expressão de filtro. Se o intervalo da chave de segmento de um arquivo não tiver nenhuma sobreposição com o filtro, o arquivo é ignorado.

  • Filtragem por ID de distribuição: Suportada apenas para Liquid Tables. Cada arquivo pode conter linhas com múltiplos IDs de distribuição. Após a leitura de um RecordBatch, as linhas são filtradas pelo intervalo de ID de distribuição.

Uso

Cenário 1: PPD de Snapshot do Hologres

Em cenários de leitura direta do Hologres, as expressões de filtro são convertidas em cláusulas SQL WHERE para tabelas de partição lógica e enviadas ao servidor do Hologres como parâmetro filter de holo_create_table_snapshot(). Isso permite que o Hologres descarte arquivos que não correspondem ao filtro no lado do servidor durante a criação do snapshot, reduzindo a quantidade de arquivos retornados ao MaxCompute e minimizando a transferência de dados.

Cenário

Suporte a PPD em cenários de leitura direta do Hologres

Parâmetro principal

Valores válidos para o parâmetro predicate_pushdown_mode:

  • off: Desativa o pushdown de predicados e lê todos os dados. Utilize essa configuração para depuração e comparação em ambiente de desenvolvimento.

  • on: Ativa o pushdown de predicados para criar apenas snapshots filtrados. Recomendado para ambientes de produção.

  • Debug: Cria dois snapshots para comparação de desempenho. Pode ser usado para testes de desempenho e solução de problemas.

Exemplo de sintaxe:

set odps.external.holo.read.table.rules="{predicate_pushdown_mode:on}";

Tipos suportados

INT、BIGINT、STRING、DATE、TIMESTAMP、BINARY

Limitações

O pushdown de predicados não suporta os seguintes casos:

  • Funções definidas pelo usuário (UDFs) ou funções integradas.

  • Expressões CAST durante conversão implícita.

  • O tipo de dados jsonb.

  • Tabelas de chave primária do Hologres.

Cenários aplicáveis

Instâncias do Hologres que suportam PPD. A versão da instância deve atender a um dos seguintes requisitos:

  • >=3.1.36

  • >=3.2.18

  • >=4.0.7

Cenário 2: PPD via JDBC do Hologres

Quando a leitura direta do Hologres está desativada (odps.table.api.enable.holo.table=false), as consultas são executadas pelo caminho JDBC. Nesse caso, o PPD funciona adicionando a cláusula WHERE à instrução SQL JDBC enviada ao Hologres, que realiza a filtragem na camada SQL. Essa abordagem difere do PPD em cenários de leitura direta do Hologres:

  • PPD de leitura direta: filtra arquivos no nível do snapshot

  • PPD via JDBC: filtra linhas no nível da consulta SQL

Cenário

Suporte a PPD em cenários de leitura JDBC do Hologres

Parâmetro principal

Valores do parâmetro odps.external.hive.scan.ppd.enabled:

  • true: ativa o pushdown de predicados.

  • false: desativa o pushdown de predicados.

Exemplo de sintaxe do parâmetro:

set odps.external.hive.scan.ppd.enabled=true;

Tipos suportados

INT、BIGINT、DOUBLE、FLOAT、STRING、DATE、TIMESTAMP、TIMESTAMP_NTZ

Limitações

O pushdown de predicados não suporta os seguintes casos:

  • Funções definidas pelo usuário (UDFs) ou funções integradas.

  • Expressões CAST.

  • O tipo de dados jsonb.

  • Tabelas de chave primária do Hologres.

Cenários aplicáveis

  • Funciona como solução alternativa para cenários de leitura direta do Hologres.

  • O PPD não é suportado na instância atual do Hologres.

Cenário 3: Filtragem em nível de coluna por grupo de linhas ORC

Filtragem em nível de arquivo no lado do MaxCompute. Para cada arquivo ORC, um SearchArgument é construído e passado ao leitor ORC. O leitor ORC utiliza as estatísticas de coluna (min/max/count) de cada stripe/grupo de linhas para determinar se o grupo de linhas inteiro pode ser ignorado.

  • A poda em nível de arquivo é realizada no lado do MaxCompute

  • Depende de o parâmetro de PPD estar ativado no lado do Hologres.

  • Tabelas não particionadas, tabelas fisicamente particionadas e tabelas logicamente particionadas são todas suportadas.

Cenário

Filtragem em nível de coluna por grupo de linhas ORC

Parâmetro principal

odps.external.holo.use.predicate.pushdown

  • true: ativa a filtragem.

  • false: desativa a filtragem. Este é o valor padrão.

Tipos suportados

BOOLEAN、INT、BIGINT、FLOAT、DOUBLE、DECIMAL、STRING、DATE、TIMESTAMP

Exemplos

Hologres Snapshot PPD

  1. Prepare os dados. Na sua instância Hologres, crie uma tabela de teste e insira dados.

    CREATE TABLE test_multi_type_ppd (
      c_id INT NOT NULL,
      c_boolean BOOLEAN,
      c_int INT,
      c_bigint BIGINT,
      c_double DOUBLE precision,
      c_float REAL,
      c_string TEXT,
      c_date DATE,
      c_timestamp_tz TIMESTAMPTZ,
      c_timestamp_ntz TIMESTAMP
    )
    WITH (SEGMENT_KEY = 'c_id');
    -- Insert 10 rows of data.
    INSERT INTO test_multi_type_ppd VALUES
    (1,  true,   10,  1000,   1.25,  1.5,  'alpha',   '2023-01-01', '2023-01-01 10:00:00+08', '2023-01-01 02:00:00'),
    (2,  false,  20,  2000,  -2.50,  2.5,  'beta',    '2023-01-02', '2023-01-02 10:00:00+08', '2023-01-02 02:00:00'),
    (3,  true,   30,  3000,   3.75, -3.5,  'gamma',   '2023-01-03', '2023-01-03 10:00:00+08', '2023-01-03 02:00:00'),
    (4,  false,  40,  4000,   4.00,  4.5,  'delta',   '2023-01-04', '2023-01-04 10:00:00+08', '2023-01-04 02:00:00'),
    (5,  true,   50,  5000,   5.50,  5.5,  'epsilon', '2023-01-05', '2023-01-05 10:00:00+08', '2023-01-05 02:00:00'),
    (6,  false,  60,  6000,   6.60,  6.0,  'zeta',    '2023-01-06', '2023-01-06 10:00:00+08', '2023-01-06 02:00:00'),
    (7,  true,   70,  7000,   7.70, -7.0,  'eta',     '2023-01-07', '2023-01-07 10:00:00+08', '2023-01-07 02:00:00'),
    (8,  false,  80,  8000,   8.80,  8.0,  'theta',   '2023-01-08', '2023-01-08 10:00:00+08', '2023-01-08 02:00:00'),
    (9,  true,   90,  9000,  -9.90,  9.0,  'iota',    '2023-01-09', '2023-01-09 10:00:00+08', '2023-01-09 02:00:00'),
    (10, false, 100, 10000,  10.10, 10.0,  'kappa',   '2023-01-10', '2023-01-10 10:00:00+08', '2023-01-10 02:00:00');
    SELECT * FROM test_multi_type_ppd;
  2. Crie uma tabela externa Hologres no MaxCompute.

    CREATE EXTERNAL TABLE test_multi_type_ppd
    (
      c_id int,
      c_boolean boolean,
      c_int int,
      c_bigint bigint,
      c_double double,
      c_float float,
      c_string string,
      c_date date,
      c_timestamp_tz timestamp,
      c_timestamp_ntz timestamp_ntz
    )
    STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
    WITH serdeproperties ('odps.properties.rolearn'='acs:ram::139****:role/<role name>')
    LOCATION 'jdbc:postgresql://<holo-endpoint>/<db>?currentSchema=public&table=test_multi_type_ppd'
    TBLPROPERTIES (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo'
    );
  3. Consulte a tabela externa.

    -- Enable Hologres direct read.
    SET odps.table.api.enable.holo.table=true;
    -- Set the PPD mode (off, on, or debug).
    SET odps.external.holo.read.table.rules="{predicate_pushdown_mode:on}";
    -- Configure the type system.
    SET odps.sql.type.system.odps2=true;
    SET odps.sql.decimal.odps2=true;
    -- Allow expressions to be pushed down to TableScan. This is typically enabled by default.
    SET odps.use.builtin.function.input.range=true;
    -- set odps.mcqa.disable=true;
    SELECT * FROM test_multi_type_ppd WHERE c_id = 3;
    -- The query returns the following result.
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    | c_id | c_boolean | c_int | c_bigint   | c_double   | c_float | c_string | c_date | c_timestamp_tz | c_timestamp_ntz |
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    | 3    | true      | 30    | 3000       | 3.75       | -3.5    | gamma    | 2023-01-03 | 2023-01-03 10:00:00 | 2023-01-03 02:00:00 |
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    -- Check the Summary section in Logview. The following information is displayed:
    external holo tables:
    	**.default.test_multi_type_ppd:Optimized
      Holo-side PPD enabled -->   Filter pushdown applied successfully
      Snapshot Id: 56-1-100***
      With-filter file count: 2
      With-filter create snapshot duration: 19ms

Hologres JDBC PPD

  1. Prepare os dados. Na sua instância Hologres, crie uma tabela de teste e insira dados.

    CREATE TABLE test_multi_type_ppd (
      c_id INT NOT NULL,
      c_boolean BOOLEAN,
      c_int INT,
      c_bigint BIGINT,
      c_double DOUBLE precision,
      c_float REAL,
      c_string TEXT,
      c_date DATE,
      c_timestamp_tz TIMESTAMPTZ,
      c_timestamp_ntz TIMESTAMP
    )
    WITH (SEGMENT_KEY = 'c_id');
    -- Insert 10 rows of data.
    INSERT INTO test_multi_type_ppd VALUES
    (1,  true,   10,  1000,   1.25,  1.5,  'alpha',   '2023-01-01', '2023-01-01 10:00:00+08', '2023-01-01 02:00:00'),
    (2,  false,  20,  2000,  -2.50,  2.5,  'beta',    '2023-01-02', '2023-01-02 10:00:00+08', '2023-01-02 02:00:00'),
    (3,  true,   30,  3000,   3.75, -3.5,  'gamma',   '2023-01-03', '2023-01-03 10:00:00+08', '2023-01-03 02:00:00'),
    (4,  false,  40,  4000,   4.00,  4.5,  'delta',   '2023-01-04', '2023-01-04 10:00:00+08', '2023-01-04 02:00:00'),
    (5,  true,   50,  5000,   5.50,  5.5,  'epsilon', '2023-01-05', '2023-01-05 10:00:00+08', '2023-01-05 02:00:00'),
    (6,  false,  60,  6000,   6.60,  6.0,  'zeta',    '2023-01-06', '2023-01-06 10:00:00+08', '2023-01-06 02:00:00'),
    (7,  true,   70,  7000,   7.70, -7.0,  'eta',     '2023-01-07', '2023-01-07 10:00:00+08', '2023-01-07 02:00:00'),
    (8,  false,  80,  8000,   8.80,  8.0,  'theta',   '2023-01-08', '2023-01-08 10:00:00+08', '2023-01-08 02:00:00'),
    (9,  true,   90,  9000,  -9.90,  9.0,  'iota',    '2023-01-09', '2023-01-09 10:00:00+08', '2023-01-09 02:00:00'),
    (10, false, 100, 10000,  10.10, 10.0,  'kappa',   '2023-01-10', '2023-01-10 10:00:00+08', '2023-01-10 02:00:00');
    SELECT * FROM test_multi_type_ppd;
  2. Crie uma tabela externa Hologres no MaxCompute.

    CREATE EXTERNAL TABLE test_multi_type_ppd
    (
      c_id int,
      c_boolean boolean,
      c_int int,
      c_bigint bigint,
      c_double double,
      c_float float,
      c_string string,
      c_date date,
      c_timestamp_tz timestamp,
      c_timestamp_ntz timestamp_ntz
    )
    STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::122**79014:role/<role name>')
    LOCATION 'jdbc:postgresql://hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute&currentSchema=public&useSSL=true&table=<table name>/'
    TBLPROPERTIES (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo'
    );
  3. Consulte a tabela externa.

    -- Disable Hologres direct read and use the JDBC path.
    SET odps.table.api.enable.holo.table=false;
    SET odps.table.api.enable.holo.table.auto.fallback=false;
    
    -- Enable JDBC PPD.
    SET odps.external.hive.scan.ppd.enabled=true;
    
    -- Allow expressions to be pushed down to TableScan. 
    -- This is enabled by default in most cases.
    SET odps.use.builtin.function.input.range=true;
    
    -- Enable common table.
    SET odps.sql.common.table.planner.ext.hive.bridge=true;
    SET odps.sql.common.table.planner.ext.hive.bridge.v2=true;
    
    -- After PPD is enabled, TableScan reads only one record.
    SELECT * FROM test_multi_type_ppd WHERE c_id = 3;
    
    -- The query result is as follows:
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    | c_id | c_boolean | c_int | c_bigint   | c_double   | c_float | c_string | c_date | c_timestamp_tz | c_timestamp_ntz |
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    | 3    | true      | 30    | 3000       | 3.75       | -3.5    | gamma    | 2023-01-03 | 2023-01-03 10:00:00 | 2023-01-03 02:00:00 |
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    
    -- Check the stdout details of the instance in Logview. The following messages are displayed:
    [2026-07-22 10:02:41] Volcano instance executor [MainThreadID: 222960]
    Jdbc HoloRecordReader query conditions: (c_id = 3)
    JDBC HoloRecordReader: Query predicate pushdown succeeded.
    JdbcShardRecordReader getSelectQuery: SELECT c_id, c_boolean, c_int, c_bigint, c_double, c_float, c_string, c_date, c_timestamp_tz, c_timestamp_ntz FROM test_multi_type_ppd0721 AS test_multi_type_ppd0721 WHERE ( hg_shard_id = 9) AND ((c_id = 3))

ORC row group column-level filtering

Este método é indicado para cenários com grandes volumes de dados. Cada row group no ORC contém 10.000 linhas, portanto o efeito da filtragem não é perceptível quando o volume de dados é muito pequeno.

  1. Prepare os dados. Crie uma tabela de teste na instância Hologres.

    DROP TABLE IF EXISTS test_2m_data;
    
    BEGIN;
    CREATE TABLE test_2m_data (
        id   INT    NOT NULL,
        name TEXT   NOT NULL
    );
    
    -- Set a distribution key to avoid data skew and improve batch write performance.
    CALL set_table_property('test_2m_data', 'distribution_key', 'id');
    COMMIT;
    
    INSERT INTO test_2m_data (id, name)
    SELECT 
        g AS id,
        'user_' || g AS name
    FROM generate_series(1, 2000000) AS g;
    
    SELECT COUNT(*) FROM test_2m_data;
  2. Crie uma tabela externa Hologres no MaxCompute.

    CREATE EXTERNAL TABLE ext_holo_test_2m_data
    (
        id          INT  ,
        name        STRING 
    )
    STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::*****:role/<role_name>')
    LOCATION 'jdbc:postgresql://hgpostcn-cn-2bj4lnv16008-cn-<region>-internal.hologres.aliyuncs.com:80/<holo_database>?currentSchema=public&table=test_2m_data'
    TBLPROPERTIES (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo'
    );
  3. Consulte os dados da tabela externa.

    -- Enable Hologres direct read
    SET odps.table.api.enable.holo.table=true;
    -- Enable PPD
    SET odps.external.holo.use.predicate.pushdown=true;
    -- Set the PPD mode
    SET odps.external.holo.read.table.rules="{predicate_pushdown_mode:on}";
    SELECT * FROM ext_holo_test_2m_data where id>100 and id<100000;

    Verifique os detalhes de stdout da instância no LogView. A filtragem foi bem-sucedida se as seguintes condições forem atendidas:

    • Os campos IOCount e IOLatencyPercentiles aparecem no TableScan1.

    • O valor de ReadRowCount é menor que o de RequestedRowCount no TableScan1.

    37  Filter1                                          99899           0                99998998
        {"PMS":{"S":24584}}
    38  GlobalInit                                       0               769              0
        {"CallBack":{"T":1},"CodeGenDCE":{"T":6393},"CodeGenMajorPass":{"T":13954},"CreateCursor":{"T":41350},
        "CreateOperator":{"T":309351},"JitFunction":{"T":13027},"LoadAndParseIR":{"T":38273},"OpenShuffleRW":{"T":30},
        "parseTableScanInfo":{"T":4551}}
    39  TableScan1                                       163840          1634             100269
        {"PMS":{"S":20480},"actualSplitFileCount":0,"actualSplitFileStats":{"avg":0,"max":0,"min":9223372036854775807},
        "plannedSplitFileCount":0,"plannedSplitFileStats":{"avg":0,"max":0,"min":9223372036854775807}}
        {"DecodingCount":320,"DecodingInBytes":147068,"DecodingLatencyUs":1224,"DecodingOutBytes":1310720,
        "DeltaFileInclusiveLatencyUs":76,"IOBlockingLatencyUs":424255,"IOCount":60,"IOLatencyPercentiles":
        "{\"Count\":\"60\",\"Percentiles\":\"[[0,2835], [0.5,6183], [0.9,6183], [0.95,6183], [0.99,6183], [0.999,6752], [1,
        15206]]\",\"Total\":\"495889\"}","IOReadBytes":27988440,"MaxMemoryUsageBytes":1936240,"ReadRawSize":2346495,
        "ReadRowCount":163840,"ReaderCount":1,"ReaderInclusiveLatencyUs":447950,"RequestedRowCount":2000000,
        "StringDirectReadOutBytes":169113,"Type":"OrcReader","VectorBatchConversionLatencyUs":1636}
    40  TableScan1@CommonTableReader                     0               0                nan
        {"PMS":{"S":19456}}
    41  fuxi                                             0               0                nan
        {"PMS":{"S":0}}
    42  inst                                             0               0                nan
        {"APMS":{"S":0},"PMFM":{"S":1073741824},"PMS":{"S":3246003}}

    Na saída acima, o operador TableScan1 contém os campos IOCount e IOLatencyPercentiles, e o valor de ReadRowCount (163840) é menor que o de RequestedRowCount (2000000). Isso indica que a filtragem por predicate pushdown foi bem-sucedida.

Importação e exportação de dados do Hologres

  • Para importar dados do Hologres para uma tabela ou partição do MaxCompute, utilize LOAD.

  • Para exportar dados de um projeto MaxCompute para o Hologres e disponibilizá-los a outros mecanismos de computação, utilize UNLOAD.

Tipos de dados compatíveis

  • Limitações do tipo decimal

    Em tabelas externas do Hologres criadas no MaxCompute, o tipo de dados DECIMAL é fixado em decimal(38,18) e não pode ser alterado. Se a tabela source tiver menos casas decimais, defina a coluna como tipo STRING na tabela externa do MaxCompute e, em seguida, utilize a função CAST para converter explicitamente os dados no momento do uso.

  • Limitações de tipos complexos

    Tabelas externas do Hologres criadas no MaxCompute não oferecem suporte a tipos de dados complexos como Array, Map ou Struct.

  • Outros tipos incompatíveis

    Tipos de dados do Hologres, como MONEY, não são compatíveis porque não existem tipos de dados correspondentes no MaxCompute.

A tabela a seguir apresenta o mapeamento de tipos de dados entre o Hologres e o MaxCompute.

Tipo do Hologres

Tipo do MaxCompute

Leitura JDBC

Escrita JDBC

Leitura direta (odps.table.api.enable.holo.table=true)

Descrição

INTEGER (alias: INT ou INT4)

INT

Supported

Supported

Supported

Inteiro com sinal de 32 bits.

TEXT

STRING, VARCHAR

Supported

Supported

Supported

Tipo de string com limite de comprimento de 8 MB.

SMALLINT

SMALLINT

Supported

Supported

Supported

Inteiro com sinal de 16 bits.

INT2

SMALLINT

Supported

Supported

Supported

Número inteiro com sinal de 16 bits.

BIGINT (alias: INT8)

BIGINT

Supported

Supported

Supported

Inteiro com sinal de 64 bits.

BYTEA

BINARY

Supported

Supported

Supported

Atualmente, o tipo de dado binário possui limite de 8 MB. O tipo de dado BINARY do Hologres suporta um tamanho máximo de 1 GB.

REAL (alias: FLOAT4)

FLOAT

Supported

Supported

Supported

Número de ponto flutuante binário de 32 bits.

DOUBLE PRECISION (alias: FLOAT8)

DOUBLE

Supported

Supported

Supported

Número de ponto flutuante binário de 64 bits.

BOOLEAN (alias: BOOL)

BOOLEAN

Supported

Supported

Supported

Tipo BOOLEAN.

TIMESTAMP

TIMESTAMP_NTZ

Supported

Not supported

Supported

O tipo TIMESTAMP do Hologres possui precisão de microssegundos e não inclui fuso horário.

Ele corresponde ao tipo TIMESTAMP_NTZ do MaxCompute, que possui precisão de nanossegundos. A diferença de precisão pode causar discrepâncias.

TIMESTAMP WITH TIME ZONE (alias: TIMESTAMPTZ)

TIMESTAMP

Supported

Not supported

Supported

O tipo de dado timestamp possui precisão de nanossegundos e utiliza o formato yyyy-mm-dd hh:mm:ss.xxxxxxxxx.

A conversão de precisão subjacente é tratada automaticamente.

DECIMAL (alias: NUMERIC)

DECIMAL(precision,scale)

Supported

Supported

Supported

Tipo numérico exato de base 10.

  • precision: especifica o número máximo de dígitos. Intervalo de valores: 1 <= precision <= 38.

  • scale: especifica o número de casas decimais. Intervalo de valores: 0 <= scale <= 18.

No MaxCompute, o tipo de dado DECIMAL assume o padrão (38,18) quando nenhuma precisão é especificada. Ao criar uma tabela com a instrução IMPORT FOREIGN SCHEMA, o sistema converte a precisão automaticamente.

CHAR(n)

CHAR(n)

Supported

Supported

Supported

No MaxCompute, CHAR(n) é um tipo de caractere com comprimento fixo. n especifica o comprimento, cujo valor máximo é 255. Strings mais curtas são preenchidas com espaços.

No Hologres, o tamanho máximo do tipo de dado CHAR(n) é 1 GB.

VARCHAR(n)

VARCHAR(n)

Supported

Supported

Supported

O tipo de dado VARCHAR(n) do MaxCompute é um tipo de caractere com comprimento variável. O parâmetro n especifica o comprimento, que varia de 1 a 65535.

No Hologres, o tamanho máximo de VARCHAR(n) é 1 GB.

DATE

DATE

Supported

Supported

Supported

O tipo de dados é date no formato yyyy-mm-dd.

INT4[]

ARRAY<INT>

Supported

Not supported

Supported

Os arrays do Hologres são mapeados para os tipos ARRAY correspondentes do MaxCompute. Observe que a gravação de arrays no Hologres não é compatível via JDBC.

INT8[]

ARRAY<BIGINT>

Supported

Not supported

Supported

FLOAT4[]

ARRAY<FLOAT>

Supported

Not supported

Supported

FLOAT8[]

ARRAY<DOUBLE>

Supported

Not supported

Supported

BOOLEAN[]

ARRAY<BOOLEAN>

Supported

Not supported

Supported

TEXT[]

ARRAY<STRING>

Supported

Not supported

Supported

JSONB

JSON

Not supported

Not supported

Supported

O tipo JSONB do Hologres é mapeado para o tipo JSON do MaxCompute. Esse mapeamento só é compatível no modo de leitura direta.

JSON

STRING

Supported

Not supported

Not supported

Ao utilizar JDBC, o tipo JSON do Hologres é mapeado para o tipo STRING do MaxCompute, com limite de tamanho de 8 MB.

SERIAL (auto-increment)

INT

Supported

Not supported

Supported

O MaxCompute lê os campos SERIAL do Hologres como valores INT. O comportamento de autoincremento não é compatível em operações de gravação.

RoaringBitmap

Not supported

Not supported

Not supported

Not supported

Não existe um tipo correspondente no MaxCompute.

RoaringBitmap64

Not supported

Not supported

Not supported

Not supported

O MaxCompute não possui um tipo equivalente.

BIT(n)

Not supported

Not supported

Not supported

Not supported

Esse tipo não tem correspondente no MaxCompute.

VARBIT(n)

Not supported

Not supported

Not supported

Not supported

Não há tipo correspondente no MaxCompute.

INTERVAL

Not supported

Not supported

Not supported

Not supported

O MaxCompute não oferece suporte a esse tipo de dados.

TIMETZ

Not supported

Not supported

Not supported

Not supported

Não existe tipo equivalente no MaxCompute.

TIME

Not supported

Not supported

Not supported

Not supported

Tipo sem correspondência no MaxCompute.

INET

Not supported

Not supported

Not supported

Not supported

Não há um tipo correspondente no MaxCompute.

MONEY

Não suportado

Não suportado

Não suportado

Não suportado

Não existe um tipo correspondente no MaxCompute.

OID

Não suportado

Não suportado

Não suportado

Não suportado

O MaxCompute não possui um tipo equivalente.

UUID

Não suportado

Não suportado

Não suportado

Não suportado

Nenhum tipo correspondente existe no MaxCompute.

FAQ

Erro ODPS-0130071 ao ler dados do Hologres diretamente

  • Problema

    Ao ler dados do Hologres no modo de leitura direta, o job falha com um erro semelhante a ODPS-0130071 Failed to split to equal size...max count: 7777. Por exemplo:

    ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777
  • Causa

    Quando o MaxCompute lê dados do Hologres, a estratégia padrão de divisão de dados pode fazer com que o número de instâncias de mapper exceda o limite de concorrência de 7.777.

    Nota

    Esse limite impede a execução de jobs com um número excessivo de mappers, protegendo a estabilidade dos arquivos e das conexões de rede do Hologres.

  • Solução

    Para resolver esse erro, defina os parâmetros a seguir.

    SET odps.external.holo.mapper.instances=10000; -- Increase the concurrency limit. The maximum value is 10,000.
    SET odps.sql.mapper.split.size=512; -- Adjust the job concurrency. The maximum value is 512 MB.

Jobs SQL lentos em tabelas externas do Hologres

  • Problema

    O desempenho é lento ao usar o SDK para pesquisar dados em uma tabela externa do MaxCompute.

  • Solução

    Tabelas externas apresentam lentidão porque suportam apenas varredura completa da tabela. Para obter melhor desempenho, utilize uma tabela interna do MaxCompute.

Erro quando o nome de uma coluna é uma palavra reservada

  • Problema

    Se o nome de uma coluna na tabela do Hologres for uma palavra reservada, as consultas podem falhar com os seguintes erros caso não haja configuração especial:

    ODPS-0123131:User defined function exception - SQLException in nextKeyValue

    Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near ","

  • Solução

    Adicione o parâmetro odps.federation.jdbc.colmapping para mapear as colunas da tabela source do Hologres para as colunas da tabela externa do Hologres.

    Por exemplo, se a tabela source do Hologres contém a palavra reservada "offset" como nome de coluna, adicione o parâmetro 'odps.federation.jdbc.colmapping'='offset:"offset"' ao criar a tabela externa do Hologres.

Erro password authentication failed for user "mcslr$STS.**" no modo de função vinculada ao service

  • Problema

    Quando um usuário RAM ou uma função RAM lê uma tabela externa do Hologres utilizando o modo de autorização por função vinculada ao service, o job pode falhar com o erro password authentication failed for user "mcslr$STS.******". Veja a seguir um exemplo de mensagem de erro:

    Caused by: java.lang.RuntimeException: java.lang.RuntimeException: org.postgresql.util.PSQLException: 
      ERROR: pooler: c0a981a2413b5: password authentication failed for user "*******$V2#****#TMP.3KvMuCpXhuMbeZsbpaE****m738WfEw73rze
      ohJUeXxhsKza1khCxdKSJQAU5CFac*****qDCA#STS.NZFkZ3TbJNmAjS2TKLdUHHdiW#**.*.*.***"
    	at org.apache.hadoop.mapreduce.lib.db.DBInputFormat.setConf(DBInputFormat.java:171)
    	at com.aliyun.odps.jdbc.wrapper.InputFormatWrapper.checkAndInitDbInputFormat(InputFormatWrapper.java:48)
    	... 45 more
    Caused by: java.lang.RuntimeException: org.postgresql.util.PSQLException: ERROR: pooler: c0a981a2413b5: 
      password authentication failed for user "*******$V2#****#TMP.3KvMuCpXhuMbeZsbpaE****m738WfEw73rzeohJUeXxhsKza1khCxdKSJQAU
      5CFac*****qDCA#STS.NZFkZ3TbJNmAjS2TKLdUHHdiW#**.*.*.***"
    	at org.apache.hadoop.mapreduce.lib.db.DBInputFormat.createConnection(DBInputFormat.java:205)
    	at com.aliyun.odps.jdbc.impl.JdbcDBInputFormat.superCreateConnection(JdbcDBInputFormat.java:69)
    	at com.aliyun.odps.jdbc.impl.JdbcDBInputFormat.createConnection(JdbcDBInputFormat.java:56)
    	at org.apache.hadoop.mapreduce.lib.db.DBInputFormat.setConf(DBInputFormat.java:164)
  • Causa

    O modo de autorização por função vinculada ao service falhou.

  • Solução

    Adicione o parâmetro set odps.external.holo.enable.slr = force; antes da instrução SQL para forçar a ativação do modo de autorização por função vinculada ao service.

Erro Holo-side PPD disabled --> The Holo snapshot PPD mode is enabled, but FAILED to push down the filter into Holo no modo de leitura direta

  • Mensagem de erro

    Holo-side PPD disabled --> The Holo snapshot PPD mode is enabled, 
    but FAILED to push down the filter into Holo, 
    errorMsg[storage/table/src/holo/snapshot.cpp(319): 
    StorageException: Create/Get snapshot failed for table: test_multi_type_ppd partition:  
    Query:select holo_create_table_snapshot('public.test_multi_type_ppd', 259200, filter=>$$c_id = 3$$) with error ERROR:  
    internal error: Failed to build fragment dag desc: node type 65 is not supported
  • Solução

    Verifique se a tabela interna do Hologres atende aos requisitos descritos em Usage notes.

Fallback exibido no modo de leitura direta

Na aba Summary do Logview, se informações de Fallback aparecerem na seção external holo tables, isso indica que o modo de leitura direta não foi utilizado e o sistema retornou ao modo JDBC. Os erros e causas mais comuns estão listados abaixo:

Detalhes do erro

Causa raiz

Resolução

Column name <col> Odps type <X> Holo type <Y>, manifestado especificamente como:

  • Column name created_at Odps type DATETIME Holo type TIMESTAMP

  • Column name create_date Odps type STRING Holo type TIMESTAMP

  • Column name create_time Odps type STRING Holo type TIMESTAMP_NTZ

  • Column name manual_enabled Odps type INT Holo type BIGINT

  • Column name cpa_bid Odps type DECIMAL(38,18) Holo type DECIMAL(38,10)

  • Column name details Odps type STRING Holo type JSON

  • Column name history_score_median Odps type STRING Holo type DOUBLE

  • Column name l_orderkey Odps type 3 Holo type 4

Erro no mapeamento de tipo de coluna

Os tipos de coluna dos campos da tabela externa do Hologres não correspondem aos da tabela source. Modifique o tipo de dados da tabela externa de acordo com a data type mapping para ativar o modo de leitura direta.

Odps table schema invalid

Erro de generalização: consulte os logs de erro no Logview para obter detalhes.

  • Causa possível 1: Erro na configuração de Column Mapping — formato de texto inválido, múltiplas colunas mapeadas para a mesma coluna do Hologres, apontamento para coluna inexistente, ou Mapping não configurado quando o nome da coluna não existe no Hologres.

  • Causa possível 2: Colunas ausentes — verifique se os DDLs da tabela externa e da tabela source do Hologres coincidem.

Holo connection error

Exceção na conexão com a instância do Hologres

Informações de permissão incorretas ou status anormal da instância do Hologres. Verifique se o usuário atual tem permissão para acessar o banco de dados correspondente do Hologres, ou confira se a instância do Hologres está em estado operacional.

Select hg_version error/Hologres version check error/Fetch hg_version data error

Versão incorreta da instância do Hologres

Atualize a instância do Hologres para a versão V1.3.34 ou posterior. Para detalhes sobre como atualizar a versão da instância, consulte Upgrade an instance.

Referências

Para mais informações sobre problemas comuns com tabelas externas do Hologres, consulte Lakehouse and Foreign Table FAQ.