Tous les produits
Search
Centre de documentation

MaxCompute:Tables externes Hologres

Dernière mise à jour :Aug 10, 2026

Cette rubrique explique comment créer une table externe Hologres. Elle détaille la spécification d'une source de données Hologres, l'octroi d'accès via un rôle RAM ou un rôle lié au service, le mappage d'une table cible ainsi que la configuration des paramètres du pilote JDBC dans l'instruction CREATE TABLE.

Présentation

Hologres est un entrepôt de données analytique interactif en temps réel, compatible avec le protocole PostgreSQL et étroitement intégré à MaxCompute. Vous pouvez créer des tables externes Hologres dans MaxCompute pour interroger une source de données Hologres en utilisant le pilote JDBC PostgreSQL et l'authentification par rôle RAM Hologres. Cette méthode élimine le stockage redondant, ne nécessite aucune importation ni exportation de données et offre des résultats de requête rapides.

Limites

  • Manipulation des données (DML)

    • MaxCompute ne prend pas en charge les opérations UPDATE ou DELETE sur les tables externes Hologres.

    • Les tables externes Hologres ne prennent pas en charge l'instruction INSERT OVERWRITE.

      Pour écraser les données d'une table Hologres avec des données provenant de MaxCompute, exécutez une instruction INSERT OVERWRITE directement dans Hologres. Cette instruction lit les données depuis une table externe dans Hologres qui est mappée à une table MaxCompute. Pour plus d'informations, consultez la section INSERT OVERWRITE.

  • Risque lors de l'écriture de données

    Lorsque vous écrivez de grands volumes de données dans une table externe Hologres, des processus d'écriture parallèles sont utilisés. Dans de rares cas, l'un de ces processus peut réécrire des données, ce qui peut entraîner des duplications.

  • Partitions

    Les tables partitionnées dans Hologres et MaxCompute ne se correspondent pas directement. Les tables externes Hologres ne prennent pas en charge les partitions. Toutefois, en mode de lecture directe, lorsque vous interrogez une table externe Hologres mappée à une table parente partitionnée dans Hologres, l'élagage des partitions (partition pruning) s'applique si le filtre de la requête inclut une condition sur la colonne de partition d'une table enfant partitionnée sous-jacente.

  • Les tables externes Hologres ne prennent pas en charge l'attribut cluster.

  • Les tables externes Hologres ne peuvent pas être mappées à une Dynamic Table Hologres.

  • Consultez la liste des Types de données pris en charge.

Créer une table externe Hologres

Vous pouvez créer une table externe Hologres en utilisant soit l'autorisation par rôle RAM pour Hologres, soit le mode d'autorisation par rôle lié au service.

Considérations importantes

Directives pour la création de tables externes

  • Si votre instance Hologres utilise une liste blanche d'adresses IP pour l'accès externe, mettez-la à niveau vers une version prise en charge :

    • Pour le mode d'autorisation par rôle RAM, effectuez la mise à niveau vers Hologres V3.2 ou ultérieur.

    • Pour le mode d'autorisation par rôle lié au service, effectuez la mise à niveau vers Hologres V2.0.28 ou ultérieur.

    Après la mise à niveau, Hologres approuve automatiquement les adresses IP des nœuds MaxCompute en fonction de l'identité du service MaxCompute ou du rôle lié au service. Il n'est plus nécessaire d'ajouter les adresses IP des nœuds élastiques MaxCompute à la liste blanche d'IP de votre instance Hologres.

  • Vous pouvez mapper des tables parentes et des tables enfants de Hologres vers une table externe. Cependant, vous pouvez uniquement lire les données, et non y écrire, depuis une table externe mappée à une table parente.

  • Lorsque vous écrivez des données dans une table externe Hologres, le mécanisme INSERT ON CONFLICT (UPSERT) n'est pas pris en charge. Si la table source Hologres possède une clé primaire, évitez d'écrire des données susceptibles de provoquer des conflits de clé primaire.

  • Les noms de tables et de colonnes ne sont pas sensibles à la casse. Vous ne pouvez pas forcer la sensibilité à la casse lors de la création ou de l'interrogation de tables et de colonnes.

Compatibilité du schéma

Si le schéma de la table source Hologres ne correspond pas au schéma de la table externe, tenez compte des points suivants :

  • Nombre de colonnes incompatible : Si la table source contient moins de colonnes que la table externe, la lecture des données échoue avec une erreur telle que column "xxx" does not exist. Si la table source contient plus de colonnes que la table externe, les colonnes supplémentaires sont ignorées.

  • Types de colonnes incompatibles : MaxCompute ne peut pas mapper une colonne STRING d'une table source Hologres vers une colonne INT dans la table externe. Le mappage d'une colonne INT vers une colonne STRING est pris en charge mais déconseillé.

Syntaxe

Lors de la création d'une table externe, spécifiez le StorageHandler dans l'instruction DDL CREATE TABLE, configurez l'autorisation par rôle RAM ou par rôle lié au service, et fournissez l'URL de connexion JDBC pour accéder à la source de données Hologres.

Mode rôle RAM

Pour un exemple de code complet, consultez la section Créer une table externe Hologres (mode d'autorisation par rôle RAM).

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>,...']
);

Mode rôle lié au service

Pour un exemple de code complet, consultez la section Créer une table externe Hologres (mode d'autorisation par rôle lié au service).

Le mode d'autorisation par rôle lié au service permet à un même utilisateur RAM d'accéder aux tables autorisées dans MaxCompute et Hologres sans autorisation manuelle. Ce mode prend également en charge la fonctionnalité de liste blanche d'IP 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>,...']
);

Paramètres

Cliquez pour afficher les détails des paramètres

Paramètre

Obligatoire

Description

IF NOT EXISTS

Non

  • Si vous ne spécifiez pas l'option IF NOT EXISTS et qu'une table portant le même nom existe déjà, une erreur est renvoyée.

  • Si vous spécifiez IF NOT EXISTS, l'instruction aboutit, qu'une table portant le même nom existe ou non. Les métadonnées de la table existante ne sont pas modifiées, même si son schéma diffère de celui que vous créez.

table_name

Oui

Nom de la table externe Hologres à créer dans MaxCompute.

col_name

Oui

Nom d'une colonne dans la table externe Hologres.

data_type

Oui

Type de données d'une colonne dans la table externe Hologres.

STORED BY

Oui

Le StorageHandler qui définit la méthode d'interrogation de la table externe Hologres.

Définissez la valeur sur com.aliyun.odps.jdbc.JdbcStorageHandler pour utiliser la méthode de connexion JDBC.

role_arn

Oui

Ce paramètre est requis lors de la création d'une table externe Hologres en mode d'autorisation par rôle RAM. Il s'agit de l'ARN du rôle RAM spécifié, utilisé pour configurer l'authentification lors de la création de tables externes. Pour plus d'informations sur la création d'un rôle RAM et l'octroi d'autorisations, consultez la section Autorisation par rôle RAM Hologres.

  1. Connectez-vous à la console RAM.

  2. Dans le volet de navigation de gauche, sélectionnez Identities > Roles.

  3. Sur la page Roles, cliquez sur le Role Name cible pour accéder à la page des détails du rôle.

  4. Dans la section Basic Information, vous pouvez obtenir l'ARN.

Non

Ce paramètre n'est pas requis en mode rôle lié au service.

LOCATION

Oui

Chaîne de connexion JDBC pour l'instance Hologres. Elle contient les paramètres suivants :

  • endpoint : Obligatoire. Le nom de domaine réseau classique de l'instance Hologres.

    Important

    Actuellement, vous ne pouvez vous connecter à Hologres que via le réseau classique. Les connexions via un VPC ne sont pas prises en charge.

  • port : Obligatoire. Le port réseau de l'instance Hologres.

    1. Connectez-vous à la console de gestion Hologres. Dans le coin supérieur gauche, sélectionnez une région.

    2. Dans le volet de navigation de gauche, cliquez sur Instances.

      Sur la page Instances, cliquez sur le nom de l'instance cible.

    3. Dans la section Network Information, recherchez le nom de domaine et le port du réseau classique de l'instance Hologres.

  • database : Obligatoire. Nom de la base de données Hologres cible. Pour plus d'informations, consultez la section CREATE DATABASE.

  • ApplicationName : Obligatoire. La valeur par défaut est MaxCompute. Vous n'avez pas besoin de modifier cette valeur.

  • schema : Facultatif. Vous pouvez omettre ce paramètre si le nom de la table est unique au sein de la base de données ou si la table source se trouve dans le schéma par défaut. Pour plus d'informations, consultez la section CREATE SCHEMA.

  • holo_table_name : Obligatoire. Nom de la table source Hologres. Pour plus d'informations, consultez la section CREATE TABLE.

  • useSSL : Facultatif. Spécifie la configuration de sécurité pour l'accès entre MaxCompute et Hologres via le réseau classique Alibaba Cloud.

    • true : active SSL pour utiliser une connexion chiffrée sécurisée.

    • false : désactive SSL.

tblproperties

Oui

  • mcfed.mapreduce.jdbc.driver.class : Obligatoire.

    Pilote de connexion à la base de données Hologres. La valeur doit être org.postgresql.Driver.

  • odps.federation.jdbc.target.db.type : Obligatoire.

    Type de base de données. La valeur doit être holo.

  • odps.federation.jdbc.colmapping : Facultatif.

    Mappage entre les colonnes de la table externe et les colonnes de la table source Hologres.

    • Si ce paramètre n'est pas configuré, les colonnes sont mappées par nom entre la source et la table externe.

    • Si vous configurez ce paramètre uniquement pour certaines colonnes, les colonnes spécifiées sont mappées comme défini, tandis que les colonnes restantes sont mappées par nom. Une erreur se produit si les noms ou les types de données de ces colonnes mappées automatiquement ne correspondent pas.

    • Si un nom de colonne Hologres contient des lettres majuscules, entourez-le de guillemets doubles (""). Format : MaxCompute_column_1:"Hologres_column_1"[,MaxCompute_column_2:"Hologres_column_2",...].

      Remarque

      Supposons que la table source Hologres contienne les colonnes c bool, map_B string, a bigint et que la table externe contienne les colonnes a bigint, x string, c bool.

      Si la configuration colmapping est définie sur 'x: "map_B"', vous pouvez mapper et interroger avec succès les données Hologres.

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

    Lit les données depuis une table source Hologres. Les colonnes, les noms de colonnes et les types de données de la table externe doivent correspondre à ceux de la table source, ou à l'alias le cas échéant. Le format de select_sentence est SELECT xxx FROM <holo_database_name>.<holo_schema_name>.<holo_table_name>.

Exemples

Étape 1 : Préparer les données Hologres

Vous pouvez ignorer cette étape si vous disposez déjà d'une base de données Hologres, d'une table et de données de test.

Créer une base de données Hologres

  1. Connectez-vous à la console de gestion Hologres. Dans le coin supérieur gauche, sélectionnez une région.

  2. Dans le volet de navigation de gauche, cliquez sur Instances.

  3. Si vous ne possédez pas d'instance, vous devez d'abord acheter une instance Hologres.

    Sur la page Instances, cliquez sur le nom de l'instance cible.

  4. Sur la page des détails de l'instance, cliquez sur Connect to Instance.

  5. Cliquez sur l'onglet Metadata Management.

    Cliquez sur Create Database, saisissez le Database Name dans la boîte de dialogue qui s'affiche et laissez les autres paramètres avec leurs valeurs par défaut.

Créer une table Hologres

  1. Sur la page des détails de l'instance, cliquez sur Connect to Instance.

  2. Cliquez sur l'onglet SQL Editor.

  3. Exécutez les instructions suivantes pour créer une table et insérer des données :

    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;

Étape 2 : Créer une table externe Hologres

Rôle RAM

Dans ce mode, le créateur de la table externe intègre un rôle RAM disposant d'autorisations d'accès aux données Hologres dans la définition de la table externe. D'autres utilisateurs MaxCompute peuvent ensuite recevoir des autorisations sur cette table externe. Lorsqu'un utilisateur accède à la table externe, le système utilise le rôle RAM lié pour accéder aux données de la table Hologres mappée.

Hologres ne prend pas en charge l'ajout d'un rôle RAM inter-comptes à une instance de base de données. Par conséquent, Hologres en mode rôle RAM prend en charge uniquement les rôles RAM du même compte. De même, lorsque MaxCompute accède à Hologres via une table externe ou un schéma externe, seuls les rôles RAM du même compte sont pris en charge.

Prérequis

  1. Vous avez installé et configuré le client MaxCompute.

  2. Vous disposez d'un projet MaxCompute cible où vous souhaitez créer la table externe Hologres.

    Pour plus d'informations, consultez la section Créer un projet MaxCompute.

  3. Vous avez créé et autorisé un rôle RAM. Pour plus d'informations, consultez la section Autoriser un rôle RAM pour Hologres.

Créer la table externe dans MaxCompute

  1. Connectez-vous au client MaxCompute et basculez vers votre projet MaxCompute cible.

  2. Exécutez l'instruction suivante pour créer la table externe Hologres.

    L'exemple suivant utilise les données préparées à l'étape Étape 1 : Préparer les données Hologres :

    • Nom de la base de données Hologres : holo_external_test.

    • Schéma de la base de données Hologres : public.

    • Nom de la table Hologres : holo.

    • Point de terminaison du réseau classique 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. Exécutez les commandes suivantes pour interroger la table source Hologres en utilisant la table externe nouvellement créée.

    -- 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. Utilisez la table externe Hologres pour échanger des données avec Hologres et effectuer une analyse fédérée.

    • Écrivez les données traitées dans MaxCompute vers Hologres en utilisant la table externe pour accélérer l'analytique et les services en ligne.

      -- 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        | 
      +------------+------------+
    • Stockez les tables de dimensions fréquemment mises à jour dans Hologres pour prendre en charge les mises à jour en temps réel. MaxCompute accède à la table de dimensions via une table externe et la joint à une table de faits dans MaxCompute pour une analyse fédérée.

      -- 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        | 
      +------------+------------+------------+------------+

Rôle lié au service

Dans ce mode, vous devez créer un rôle lié au service pour accéder aux données Hologres. Afin d'éviter tout accès non autorisé, ce mode transmet l'identité de l'utilisateur à Hologres pour authentification ; l'utilisateur doit donc disposer d'autorisations à la fois sur la table externe et sur la table Hologres sous-jacente.

Prérequis

  1. Vous avez installé et configuré le client MaxCompute.

  2. Vous disposez d'un projet MaxCompute cible où vous souhaitez créer la table externe Hologres.

    Pour plus d'informations, consultez la section Créer un projet MaxCompute.

  3. Un compte portant le même nom que votre compte MaxCompute existe dans Hologres, et ce compte dispose des autorisations de lecture et d'écriture sur la table cible.

  4. Ce mode d'autorisation par rôle lié au service est pris en charge uniquement dans Hologres V1.3 et versions ultérieures. Actuellement, ce mode prend en charge uniquement la lecture, et non l'écriture, dans les tables externes Hologres.

Créer la table externe dans MaxCompute

  1. Connectez-vous au client MaxCompute et basculez vers votre projet MaxCompute cible.

  2. Exécutez l'instruction suivante pour créer la table externe Hologres.

    L'exemple suivant utilise les données préparées à l'étape Étape 1 : Préparer les données Hologres :

    • Nom de la base de données Hologres : holo_external_test.

    • Schéma de la base de données Hologres : public.

    • Nom de la table Hologres : holo.

    • Point de terminaison du réseau classique 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. Interrogez la table externe.

    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        | 
    +------------+------------+

Activer la lecture directe pour les tables externes Hologres

Par défaut, MaxCompute lit les données des tables externes Hologres via une connexion JDBC. Pour améliorer les performances, vous pouvez activer le mode de lecture directe, qui permet à MaxCompute d'accéder directement à la couche de stockage Hologres. Ce mode présente les avantages suivants :

  • Réduction de la latence de lecture pour des performances de requête plus rapides.

  • Minimisation du nombre de connexions au frontal Hologres. La plupart des requêtes ne nécessitent qu'une seule connexion.

Limites

Lorsque vous activez le mode de lecture directe pour Hologres, les limites suivantes s'appliquent. Si ces conditions ne sont pas remplies, la requête revient au mode JDBC.

  1. Exigences de version

    Votre instance Hologres doit être en version V1.3.34 ou ultérieure. La fonctionnalité de lecture directe n'est pas prise en charge dans les versions antérieures.

  2. Restrictions sur le type de table

    • Le mode de lecture directe n'est pas pris en charge pour les tables de stockage à froid Hologres.

    • Le mode de lecture directe n'est pas pris en charge pour les tables orientées lignes Hologres.

  3. Limites du mappage des types de données

    Lorsque vous utilisez le mode de lecture directe, le mappage d'un type Timestamp With Time Zone dans Hologres vers un type TIMESTAMP dans MaxCompute peut entraîner de légères divergences temporelles. Les différences sont les suivantes :

    • Différence de valeur temporelle

      • Pour les horodatages antérieurs au 1900-12-31 15:54:15, l'heure renvoyée par MaxCompute est en avance de 5 minutes et 44 secondes.

      • Pour les horodatages compris entre 1900-12-31 15:54:16 et 1969-12-31 23:59:58, l'heure renvoyée par MaxCompute est en avance d'1 seconde.

      • Pour les horodatages postérieurs au 1969-12-31 23:59:59, les heures dans Hologres et MaxCompute sont identiques.

    • Décalage de fuseau horaire

      • Par exemple, si le fuseau horaire MaxCompute est UTC+8 et qu'une colonne Timestamp With Time Zone dans Hologres est 2000-01-01 00:00:00, MaxCompute renvoie 2000-01-01 08:00:00.

      • Par exemple, si le fuseau horaire MaxCompute est UTC+8 et qu'une colonne Timestamp With Time Zone dans Hologres est 1969-01-01 00:00:00, MaxCompute renvoie 1969-01-01 08:00:01.

  4. Restriction de même région

    En raison des contraintes de connectivité réseau, MaxCompute ne peut accéder qu'aux instances Hologres situées dans la même région. L'accès interrégional échoue avec l'erreur suivante : FAILED: ODPS-0010000:System internal error - fuxi job failed, caused by: Pangu request failed with error code 3.

  5. Si votre instance Hologres utilise une architecture principal/secondaire, vous ne pouvez spécifier que l'instance principale dans l'URL de connexion, et non une instance secondaire.

  6. Limite supplémentaire pour le mode Foreign Server : vous devez activer le commutateur de syntaxe au niveau du schéma pour le projet MaxCompute.

Activer le mode de lecture directe

Pour activer le mode de lecture directe pour votre session, ajoutez la commande suivante avant votre requête SQL dans MaxCompute :

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

Vous pouvez également activer ou désactiver le mode de lecture directe au niveau du projet.

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

Vérifier le mode de lecture directe

Pour vérifier qu'une requête a utilisé le mode de lecture directe, consultez les journaux dans Logview. Pour plus d'informations sur l'utilisation de Logview, consultez la section Utiliser Logview 2.0 pour afficher les informations d'exécution des tâches.

Dans l'onglet Summary de Logview, recherchez le champ external holo tables. Le format est le suivant :

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

Paramètres :

Paramètre

Description

project_name

Nom du projet.

table_name

Nom de la table.

access mode

Mode d'accès pour la table externe. Valeurs possibles :

  • Optimized : Indique que le mode de lecture directe est utilisé. Voici un exemple Logview. Optimized : Indique que le mode d'optimisation de lecture directe est activé. Dans la section Summary de Logview, external holo tables: <project_name>.<table_name>:Optimized s'affiche, ce qui indique que la table externe Holo a utilisé le chemin d'optimisation de lecture directe.

  • Fallback : Indique que le système est revenu au mode JDBC. Voici un exemple issu de Logview. Dans l'onglet Summary, si la section external holo tables affiche un message Fallback, tel que aliorc_test.holo_lineitem:Fallback (Column type map error Column name l_orderkey Odps type 3 Holo type 4), cela indique que le mode de lecture directe n'a pas été utilisé. Le système est plutôt revenu au mode Fallback en raison d'une erreur de mappage de type de colonne.

fallback reason

Si le access mode est Fallback, ce paramètre explique pourquoi la requête est revenue au mode JDBC. Les raisons possibles et leurs solutions incluent :

  • Column type map error Column name ${ColumnName} : Le type de données d'une colonne dans la table MaxCompute est incompatible avec la colonne correspondante dans la table Hologres. Pour résoudre ce problème, modifiez le type de données dans la table externe afin qu'il corresponde au mappage de type de données.

  • Holo connection error : La connexion à l'instance Hologres a échoué. Les causes possibles incluent des autorisations incorrectes ou un statut d'instance invalide. Assurez-vous que l'utilisateur actuel dispose des autorisations requises pour accéder à la base de données Hologres et que l'instance Hologres est en cours d'exécution.

  • Odps table is partition table : Le mode de lecture directe n'est pas pris en charge pour les tables externes partitionnées.

  • Select hg_version error, Hologres version check error ou Fetch hg_version data error : La version de l'instance Hologres est incorrecte. Pour résoudre ce problème, mettez à niveau l'instance Hologres vers la version V1.3.34 ou ultérieure. Pour plus d'informations, consultez la section Mettre à niveau une instance.

Lorsqu'une tâche utilisant le mode de lecture directe rencontre une limitation, elle revient automatiquement au mode JDBC. Sous de fortes charges de travail, ce repli peut consommer des ressources significatives du pool de connexions Hologres, et le transfert de données en mode JDBC est beaucoup moins efficace qu'en mode de lecture directe. Par conséquent, ces ressources peuvent être libérées lentement, augmentant la charge sur votre instance Hologres.

Dans les cas extrêmes, des replis fréquents peuvent affecter d'autres services critiques qui reposent sur la même instance Hologres. Pour éviter cela, vous pouvez désactiver le mécanisme de repli automatique en ajoutant le paramètre set odps.table.api.allow.fallback.jdbc=false; à vos tâches. Cela provoque l'échec des tâches au lieu d'un repli silencieux, ce qui empêche une dégradation inattendue des performances.

Pushdown de prédicat pour les tables externes Hologres

Lors de l'accès aux tables externes Hologres, MaxCompute peut pousser les conditions de filtre de la requête vers Hologres pour exécution (pushdown de prédicat). Les données sont filtrées côté Hologres en amont, ce qui réduit le transfert de données et améliore les performances des requêtes. Les scénarios suivants sont pris en charge :

  • Hologres Snapshot PPD : L'expression de filtre est convertie en une clause SQL WHERE et transmise au serveur Hologres via le paramètre filter de holo_create_table_snapshot().

  • Hologres JDBC PPD : La condition WHERE est ajoutée à l'instruction SQL JDBC, et Hologres filtre les données au niveau SQL.

  • Filtrage au niveau de la colonne du groupe de lignes ORC : Filtrage au niveau du fichier côté MaxCompute. Pour chaque fichier ORC, un SearchArgument est construit et transmis au lecteur ORC, qui utilise les statistiques de colonne (min/max/count) pour ignorer les groupes de lignes qui ne correspondent pas.

Les scénarios suivants seront pris en charge à l'avenir :

  • Élagage des partitions : Pour les tables partitionnées physiques Hologres, l'expression de filtre est évaluée par rapport à chaque valeur de partition avant la création d'un instantané. Les partitions qui ne correspondent pas sont ignorées et aucun instantané n'est créé pour elles.

  • Filtrage par clé de segment : Après le retour de l'instantané depuis Hologres, MaxCompute analyse la clé de segment min/max dans les métadonnées de chaque fichier et compare la plage avec l'expression de filtre. Si la plage de clé de segment d'un fichier ne chevauche pas du tout le filtre, le fichier est ignoré.

  • Filtrage par ID de distribution : Pris en charge uniquement pour les Liquid Tables. Chaque fichier peut contenir des lignes avec plusieurs ID de distribution. Après la lecture d'un RecordBatch, les lignes sont filtrées par plage d'ID de distribution.

Utilisation

Scénario 1 : Hologres Snatshot PPD

Dans les scénarios de lecture directe Hologres, les expressions de filtre sont converties en clauses SQL WHERE pour les tables de partition logique et envoyées au serveur Hologres en tant que paramètre filter de holo_create_table_snapshot(). Cela permet à Hologres de filtrer les fichiers non correspondants côté serveur lors de la création de l'instantané, réduisant ainsi le nombre de fichiers renvoyés à MaxCompute et minimisant le transfert de données.

Scénario

Prise en charge du PPD dans les scénarios de lecture directe Hologres

Paramètre principal

Valeurs valides pour le paramètre predicate_pushdown_mode :

  • off : Désactive le pushdown de prédicat et lit toutes les données. Vous pouvez utiliser ce paramètre pour le débogage et la comparaison dans un environnement de développement.

  • on : Active le pushdown de prédicat pour créer uniquement des instantanés filtrés. Recommandé pour les environnements de production.

  • Debug : Crée deux instantanés pour comparer les performances. Cela peut être utilisé pour les tests de performance et le dépannage.

Exemple de syntaxe :

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

Types pris en charge

INT、BIGINT、STRING、DATE、TIMESTAMP、BINARY

Limites

Le pushdown de prédicat ne prend pas en charge les éléments suivants :

  • Fonctions définies par l'utilisateur (UDF) ou fonctions intégrées.

  • Expressions CAST lors d'une conversion implicite.

  • Le type de données jsonb.

  • Tables de clés primaires Hologres.

Scénarios applicables

Instances Hologres prenant en charge le PPD, la version de l'instance doit répondre à l'une des exigences suivantes.

  • >=3.1.36

  • >=3.2.18

  • >=4.0.7

Scénario 2 : Hologres JDBC PPD

Lorsque la lecture directe Hologres est désactivée (odps.table.api.enable.holo.table=false), les requêtes sont exécutées via le chemin JDBC. Dans ce cas, le PPD fonctionne en ajoutant la clause WHERE à l'instruction SQL JDBC envoyée à Hologres, et Hologres effectue le filtrage au niveau SQL. Cela diffère du PPD dans les scénarios de lecture directe Hologres :

  • PPD en lecture directe : filtre les fichiers au niveau de l'instantané

  • PPD JDBC : filtre les lignes au niveau de la requête SQL

Scénario

Prise en charge du PPD dans les scénarios de lecture JDBC Hologres

Paramètre principal

Valeurs du paramètre odps.external.hive.scan.ppd.enabled :

  • true : active le pushdown de prédicat.

  • false : désactive le pushdown de prédicat.

Exemple de syntaxe du paramètre :

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

Types pris en charge

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

Limites

Le pushdown de prédicat ne prend pas en charge les éléments suivants :

  • Fonctions définies par l'utilisateur (UDF) ou fonctions intégrées.

  • Expressions CAST.

  • Le type de données jsonb.

  • Tables de clés primaires Hologres.

Scénarios applicables

  • Cela sert de solution de secours pour les scénarios de lecture directe Hologres.

  • Le PPD n'est actuellement pas pris en charge sur cette instance Hologres.

Scénario 3 : Filtrage au niveau de la colonne du groupe de lignes ORC

Filtrage au niveau du fichier côté MaxCompute. Pour chaque fichier ORC, un SearchArgument est construit et transmis au lecteur ORC. Le lecteur ORC utilise les statistiques de colonne (min/max/count) de chaque stripe/groupe de lignes pour déterminer si le groupe de lignes entier peut être ignoré.

  • L'élagage au niveau du fichier est effectué côté MaxCompute

  • Dépend de l'activation du paramètre PPD côté Hologres.

  • Les tables non partitionnées, les tables partitionnées physiques et les tables partitionnées logiques sont toutes prises en charge.

Scénario

Filtrage au niveau de la colonne du groupe de lignes ORC

Paramètre principal

odps.external.holo.use.predicate.pushdown

  • true:Active le filtrage.

  • false:Désactive le filtrage. Il s'agit de la valeur par défaut.

Types pris en charge

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

Exemples

Hologres Snapshot PPD

  1. Préparez les données. Dans votre instance Hologres, créez une table de test et insérez des données.

    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. Créez une table externe Hologres dans 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. Interrogez la table externe.

    -- 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. Préparez les données. Dans votre instance Hologres, créez une table de test et insérez des données.

    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. Créez une table externe Hologres dans 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. Interrogez la table externe.

    -- 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))

Filtrage au niveau de la colonne du groupe de lignes ORC

Cette méthode s'applique aux scénarios comportant de grands volumes de données. Chaque groupe de lignes dans ORC contient 10 000 lignes, de sorte que l'effet de filtrage n'est pas évident lorsque le volume de données est trop faible.

  1. Préparez les données. Créez une table de test dans l'instance 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. Créez une table externe Hologres dans 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. Interroger les données de la table externe

    -- 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;

    Vérifiez les détails stdout de l'instance dans LogView. Le filtrage réussit si les conditions suivantes sont remplies :

    • IOCount et IOLatencyPercentiles apparaissent dans TableScan1.

    • ReadRowCount est inférieur à RequestedRowCount dans TableScan1.

Importation et exportation de données Hologres

  • Pour importer des données depuis Hologres vers une table ou une partition MaxCompute, utilisez LOAD.

  • Pour exporter des données depuis un projet MaxCompute vers Hologres afin qu'elles soient utilisées par d'autres moteurs de calcul, utilisez UNLOAD.

Types de données pris en charge

  • Limites du type Decimal

    Pour les tables externes Hologres créées dans MaxCompute, le type de données DECIMAL est fixé à decimal(38,18) et ne peut pas être modifié. Si la table source comporte moins de décimales, vous pouvez définir la colonne comme étant du type STRING dans la table externe MaxCompute, puis utiliser la fonction CAST pour convertir explicitement les données lors de leur utilisation.

  • Limites des types complexes

    Les tables externes Hologres créées dans MaxCompute ne prennent pas en charge les types de données complexes tels que Array, Map ou Struct.

  • Autres types incompatibles

    Les types de données dans Hologres, tels que MONEY, ne sont pas pris en charge car il n'existe pas de types de données correspondants dans MaxCompute.

Le tableau suivant répertorie les mappages de types de données entre Hologres et MaxCompute.

Type Hologres

Type MaxCompute

Lecture JDBC

Écriture JDBC

Lecture directe (odps.table.api.enable.holo.table=true)

Description

INTEGER (alias : INT ou INT4)

INT

Pris en charge

Pris en charge

Pris en charge

Entier signé 32 bits.

TEXT

STRING, VARCHAR

Pris en charge

Pris en charge

Pris en charge

Type de chaîne avec une limite de longueur de 8 Mo.

SMALLINT

SMALLINT

Pris en charge

Pris en charge

Pris en charge

Entier signé 16 bits.

INT2

SMALLINT

Pris en charge

Pris en charge

Pris en charge

Entier signé 16 bits.

BIGINT (alias : INT8)

BIGINT

Pris en charge

Pris en charge

Pris en charge

Entier signé 64 bits.

BYTEA

BINARY

Pris en charge

Pris en charge

Pris en charge

Le type de données binaire a actuellement une limite de longueur de 8 Mo. Le type de données BINARY Hologres a une taille maximale de 1 Go.

REAL (alias : FLOAT4)

FLOAT

Pris en charge

Pris en charge

Pris en charge

Nombre à virgule flottante binaire 32 bits.

DOUBLE PRECISION (alias : FLOAT8)

DOUBLE

Pris en charge

Pris en charge

Pris en charge

Nombre à virgule flottante binaire 64 bits.

BOOLEAN (alias : BOOL)

BOOLEAN

Pris en charge

Pris en charge

Pris en charge

Type BOOLEAN.

TIMESTAMP

TIMESTAMP_NTZ

Pris en charge

Non pris en charge

Pris en charge

Le type TIMESTAMP Hologres a une précision à la microseconde et aucun fuseau horaire.

Il est mappé vers TIMESTAMP_NTZ de MaxCompute, qui a une précision à la nanoseconde. La différence de précision peut entraîner des écarts.

TIMESTAMP WITH TIME ZONE (alias : TIMESTAMPTZ)

TIMESTAMP

Pris en charge

Non pris en charge

Pris en charge

Le type de données d'horodatage est précis à la nanoseconde et utilise le format yyyy-mm-dd hh:mm:ss.xxxxxxxxx.

La conversion de précision sous-jacente est gérée automatiquement.

DECIMAL (alias : NUMERIC)

DECIMAL(précision,échelle)

Pris en charge

Pris en charge

Pris en charge

Type numérique exact en base 10.

  • precision : Spécifie le nombre maximal de chiffres. Plage de valeurs : 1 <= precision <= 38.

  • scale : Spécifie le nombre de décimales. Plage de valeurs : 0 <= scale <= 18.

Dans MaxCompute, le type de données DECIMAL est par défaut (38,18) si aucune précision n'est spécifiée. Lorsque vous créez une table à l'aide de l'instruction IMPORT FOREIGN SCHEMA, le système convertit automatiquement la précision.

CHAR(n)

CHAR(n)

Pris en charge

Pris en charge

Pris en charge

Dans MaxCompute, CHAR(n) est un type de caractère à longueur fixe. n spécifie la longueur. La longueur maximale est de 255. Les chaînes plus courtes sont complétées par des espaces.

La taille maximale du type de données CHAR(n) dans Hologres est de 1 Go.

VARCHAR(n)

VARCHAR(n)

Pris en charge

Pris en charge

Pris en charge

Le type de données VARCHAR(n) dans MaxCompute est un type de caractère à longueur variable. Le paramètre n spécifie la longueur, qui varie de 1 à 65 535.

Dans Hologres, la taille maximale pour VARCHAR(n) est de 1 Go.

DATE

DATE

Pris en charge

Pris en charge

Pris en charge

Le type de données est une date au format yyyy-mm-dd.

INT4[]

ARRAY<INT>

Pris en charge

Non pris en charge

Pris en charge

Les tableaux Hologres sont mappés vers les types ARRAY correspondants de MaxCompute. Notez que l'écriture de tableaux dans Hologres n'est pas prise en charge via JDBC.

INT8[]

ARRAY<BIGINT>

Pris en charge

Non pris en charge

Pris en charge

FLOAT4[]

ARRAY<FLOAT>

Pris en charge

Non pris en charge

Pris en charge

FLOAT8[]

ARRAY<DOUBLE>

Pris en charge

Non pris en charge

Pris en charge

BOOLEAN[]

ARRAY<BOOLEAN>

Pris en charge

Non pris en charge

Pris en charge

TEXT[]

ARRAY<STRING>

Pris en charge

Non pris en charge

Pris en charge

JSONB

JSON

Non pris en charge

Non pris en charge

Pris en charge

Le type JSONB Hologres est mappé vers le type JSON de MaxCompute. Ce mappage n'est pris en charge qu'en mode de lecture directe.

JSON

STRING

Pris en charge

Non pris en charge

Non pris en charge

Lors de l'utilisation de JDBC, le type JSON Hologres est mappé vers le type STRING de MaxCompute, ce qui limite la taille à 8 Mo.

SERIAL (auto-incrémentation)

INT

Pris en charge

Non pris en charge

Pris en charge

MaxCompute lit les champs SERIAL Hologres comme des valeurs INT. Le comportement d'auto-incrémentation n'est pas pris en charge lors de l'écriture.

RoaringBitmap

Non pris en charge

Non pris en charge

Non pris en charge

Non pris en charge

Aucun type correspondant n'existe dans MaxCompute.

RoaringBitmap64

Non pris en charge

Non pris en charge

Non pris en charge

Non pris en charge

Aucun type correspondant n'existe dans MaxCompute.

BIT(n)

Non pris en charge

Non pris en charge

Non pris en charge

Non pris en charge

Aucun type correspondant n'existe dans MaxCompute.

VARBIT(n)

Non pris en charge

Non pris en charge

Non pris en charge

Non pris en charge

Aucun type correspondant n'existe dans MaxCompute.

INTERVAL

Non pris en charge

Non pris en charge

Non pris en charge

Non pris en charge

Aucun type correspondant n'existe dans MaxCompute.

TIMETZ

Non pris en charge

Non pris en charge

Non pris en charge

Non pris en charge

Aucun type correspondant n'existe dans MaxCompute.

TIME

Non pris en charge

Non pris en charge

Non pris en charge

Non pris en charge

Aucun type correspondant n'existe dans MaxCompute.

INET

Non pris en charge

Non pris en charge

Non pris en charge

Non pris en charge

Aucun type correspondant n'existe dans MaxCompute.

MONEY

Non pris en charge

Non pris en charge

Non pris en charge

Non pris en charge

Aucun type correspondant n'existe dans MaxCompute.

OID

Non pris en charge

Non pris en charge

Non pris en charge

Non pris en charge

Aucun type correspondant n'existe dans MaxCompute.

UUID

Non pris en charge

Non pris en charge

Non pris en charge

Non pris en charge

Aucun type correspondant n'existe dans MaxCompute.

FAQ

Erreur ODPS-0130071 lors de la lecture directe des données Hologres

  • Problème

    Lorsque vous lisez des données depuis Hologres en mode de lecture directe, la tâche échoue avec une erreur similaire à ODPS-0130071 Failed to split to equal size...max count: 7777. Par exemple :

    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
  • Cause

    Lorsque MaxCompute lit des données depuis Hologres, sa stratégie de fractionnement des données par défaut peut entraîner un dépassement de la limite de simultanéité de 7 777 pour les instances mapper.

    Remarque

    Cette limite empêche l'exécution de tâches comportant un nombre excessif de mappeurs, protégeant ainsi la stabilité des fichiers Hologres et des connexions réseau.

  • Solution

    Vous pouvez résoudre cette erreur en définissant les paramètres suivants.

    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.

Lenteur des tâches SQL sur les tables externes Hologres

  • Problème

    Les performances sont lentes lorsque vous utilisez le SDK pour rechercher des données dans une table externe MaxCompute.

  • Solution

    Les tables externes présentent des performances lentes car elles ne prennent en charge que les analyses complètes de table. Pour de meilleures performances, utilisez une table interne MaxCompute.

Erreur lorsqu'un nom de colonne est un mot clé

  • Problème

    Si un nom de colonne dans votre table Hologres est un mot clé, les requêtes peuvent échouer avec les erreurs suivantes sans configuration spéciale :

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

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

  • Solution

    Ajoutez le paramètre odps.federation.jdbc.colmapping pour mapper les colonnes de la table source Hologres vers les colonnes de la table externe Hologres.

    Par exemple, si la table source Hologres contient le mot clé "offset" comme nom de colonne, ajoutez le paramètre 'odps.federation.jdbc.colmapping'='offset:"offset"' lors de la création de la table externe Hologres.

L'erreur password authentication failed for user "mcslr$STS.**" en mode rôle lié au service

  • Problème

    Lorsqu'un utilisateur RAM ou un rôle RAM lit une table externe Hologres en utilisant le mode d'autorisation par rôle lié au service, la tâche peut échouer avec l'erreur password authentication failed for user "mcslr$STS.******". Voici un exemple de message d'erreur :

    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)
  • Cause

    Le mode d'autorisation par rôle lié au service a échoué.

  • Solution

    Ajoutez le paramètre set odps.external.holo.enable.slr = force; avant l'instruction SQL pour forcer l'activation du mode d'autorisation par rôle lié au service.

L'erreur Holo-side PPD disabled --> The Holo snapshot PPD mode is enabled, but FAILED to push down the filter into Holo en mode de lecture directe

  • Message d'erreur

    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
  • Solution

    Assurez-vous que votre table interne Hologres respecte les exigences indiquées dans la section Remarques d'utilisation.

Références

Pour plus d'informations sur les problèmes courants liés aux tables étrangères Hologres, consultez la section FAQ Lakehouse et Foreign Table.