Cette rubrique explique comment créer une table externe Hologres. Elle détaille la spécification de la source de données Hologres, l'octroi d'accès via un rôle RAM ou un rôle lié au service, le mappage de la 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 parfaitement intégré à MaxCompute. Vous pouvez créer des tables externes Hologres dans MaxCompute pour interroger une source de données Hologres à l'aide du pilote JDBC PostgreSQL et de 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
UPDATEouDELETEsur 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 OVERWRITEdirectement 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 des données
Lorsque vous écrivez de grands volumes de données dans une table externe Hologres, des processus d'écriture parallèle sont utilisés. Dans de rares cas, l'un de ces processus peut réécrire des données, ce qui peut entraîner une duplication.
-
Partitions
Les tables partitionnées dans Hologres et MaxCompute ne 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 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
Recommandations 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 fait automatiquement confiance aux adresses IP des nœuds MaxCompute sur la base 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'adresses IP de votre instance Hologres.
Vous pouvez mapper des tables parentes et des tables enfants de Hologres vers une table externe. Cependant, vous ne pouvez que lire les données, et non les écrire, dans 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 imposer 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 incorrect : 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
STRINGd'une table source Hologres vers une colonneINTdans la table externe. Le mappage d'une colonneINTvers une colonneSTRINGest 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 au 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'adresses 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
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
Connectez-vous à la console de gestion Hologres. Dans le coin supérieur gauche, sélectionnez une région.
Dans le volet de navigation de gauche, cliquez sur Instances.
-
Si vous ne disposez pas d'instance, vous devez d'abord acheter une instance Hologres.
Sur la page Instances, cliquez sur le nom de l'instance cible.
Sur la page des détails de l'instance, cliquez sur Connect to Instance.
-
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
Sur la page des détails de l'instance, cliquez sur Connect to Instance.
Cliquez sur l'onglet SQL Editor.
-
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 des 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 ne prend en charge que 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
Vous avez installé et configuré le client MaxCompute.
-
Vous disposez d'un projet MaxCompute cible dans lequel vous souhaitez créer la table externe Hologres.
Pour plus d'informations, consultez la rubrique Créer un projet MaxCompute.
Vous avez créé et autorisé un rôle RAM. Pour plus d'informations, consultez la rubrique Autoriser un rôle RAM pour Hologres.
Créer la table externe dans MaxCompute
Connectez-vous au client MaxCompute et basculez vers votre projet MaxCompute cible.
-
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.Endpoint 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 ¤tSchema=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' ); -
Exécutez les commandes suivantes pour interroger la table source Hologres à l'aide de 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 | +------------+------------+ -
Utilisez la table externe Hologres pour échanger des données avec Hologres et effectuer des analyses fédérées.
-
Écrivez les données traitées dans MaxCompute vers Hologres en utilisant la table externe pour accélérer les analyses 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 de prévenir 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
Vous avez installé et configuré le client MaxCompute.
-
Vous disposez d'un projet MaxCompute cible dans lequel vous souhaitez créer la table externe Hologres.
Pour plus d'informations, consultez la rubrique Créer un projet MaxCompute.
Un compte portant le même nom que votre compte MaxCompute existe dans Hologres, et ce compte dispose des autorisations en lecture et écriture sur la table cible.
Ce mode d'autorisation par rôle lié au service est pris en charge uniquement par Hologres V1.3 et versions ultérieures. Actuellement, ce mode prend uniquement en charge la lecture depuis les tables externes Hologres, et non l'écriture.
Créer la table externe dans MaxCompute
Connectez-vous au client MaxCompute et basculez vers votre projet MaxCompute cible.
-
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.Endpoint 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 ¤tSchema=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' ); -
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 offre les avantages suivants :
Stabilité de la lecture des tables.
Il réduit considérablement la latence de lecture et accélère les requêtes de données.
Il fonctionne avec le pushdown de prédicat pour transmettre les conditions de filtre de requête côté Hologres, réduisant ainsi la quantité de données analysées et les coûts.
Il réduit également drastiquement le nombre de connexions au FE Hologres, minimisant la surcharge de performance sur l'instance 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.
-
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.
-
Restrictions liées au 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 ligne Hologres.
-
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:16et1969-12-31 23:59:58, l'heure renvoyée par MaxCompute est en avance d'une 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 renvoie2000-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 renvoie1969-01-01 08:00:01.
-
-
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. Si votre instance Hologres utilise une architecture primaire/secondaire, vous ne pouvez spécifier que l'instance primaire dans l'URL de connexion, et non une instance secondaire.
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, examinez les journaux dans Logview. Pour plus d'informations sur l'utilisation de Logview, consultez la rubrique 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 | Le nom du projet. |
table_name | Le nom de la table. |
access mode | Le mode d'accès pour la table externe. Valeurs possibles :
|
Lorsqu'une tâche utilisant le mode de lecture directe rencontre une limite, elle revient automatiquement au mode JDBC. Sous de fortes charges de travail, ce retour arrière 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 retours arrière fréquents peuvent impacter d'autres services critiques qui dépendent de la même instance Hologres. Pour éviter cela, vous pouvez désactiver le mécanisme de retour automatique en ajoutant le paramètre set odps.table.api.allow.fallback.jdbc=false; à vos tâches. Cela entraîne l'échec des tâches au lieu d'un retour silencieux, ce qui prévient toute dégradation inattendue des performances.
Pushdown de prédicats pour les tables externes Hologres
Lors de l'accès aux tables externes Hologres, MaxCompute peut transmettre les conditions de filtre de la requête à Hologres pour exécution (pushdown de prédicats). Le filtrage des données est effectué en amont côté Hologres, ce qui réduit les transferts 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 la fonction
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 des colonnes des groupes de lignes ORC : filtrage au niveau des fichiers 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 non correspondants.
Les scénarios suivants seront pris en charge à l'avenir :
Élimination des partitions : pour les tables partitionnées physiquement dans Hologres, l'expression de filtre est évaluée par rapport à chaque valeur de partition avant la création d'un snapshot. Les partitions non correspondantes sont ignorées et aucun snapshot n'est créé pour celles-ci.
Filtrage par clé de segment : après le retour du snapshot depuis Hologres, MaxCompute analyse les clés 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és 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 la fonction holo_create_table_snapshot(). Cela permet à Hologres de filtrer les fichiers non correspondants côté serveur lors de la création du snapshot, réduisant ainsi le nombre de fichiers renvoyés à MaxCompute et minimisant les transferts 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
Exemple de syntaxe :
|
Types pris en charge | INT、BIGINT、STRING、DATE、TIMESTAMP、BINARY |
Limitations | Le pushdown de prédicats ne prend pas en charge les éléments suivants :
|
Scénarios applicables | Instances Hologres prenant en charge le PPD. La version de l'instance doit répondre à l'une des exigences suivantes.
|
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 du snapshot
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
Exemple de syntaxe du paramètre :
|
Types pris en charge | INT、BIGINT、DOUBLE、FLOAT、STRING、DATE、TIMESTAMP、TIMESTAMP_NTZ |
Limitations | Le pushdown de prédicats ne prend pas en charge les éléments suivants :
|
Scénarios applicables |
|
Scénario 3 : Filtrage au niveau des colonnes des groupes de lignes ORC
Filtrage au niveau des fichiers 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'élimination au niveau des fichiers est effectuée côté MaxCompute
Dépend de l'activation ou non du paramètre PPD côté Hologres.
Les tables non partitionnées, les tables partitionnées physiquement et les tables partitionnées logiquement sont toutes prises en charge.
Scénario | Filtrage au niveau des colonnes des groupes de lignes ORC |
Paramètre principal |
|
Types pris en charge | BOOLEAN、INT、BIGINT、FLOAT、DOUBLE、DECIMAL、STRING、DATE、TIMESTAMP |
Exemples
Hologres Snapshot PPD
-
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; -
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' ); -
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
-
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; -
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¤tSchema=public&useSSL=true&table=<table name>/' TBLPROPERTIES ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo' ); -
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 des colonnes des groupes de lignes ORC
Cette méthode s'applique aux scénarios impliquant de grands volumes de données. Chaque groupe de lignes dans ORC contient 10 000 lignes, de sorte que l'effet du filtrage n'est pas évident lorsque le volume de données est trop faible.
-
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; -
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' ); -
Interrogez 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.
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}}Dans la sortie précédente, l'opérateur TableScan1 contient les champs
IOCountetIOLatencyPercentiles, etReadRowCount(163840) est inférieur àRequestedRowCount(2000000), ce qui indique que le filtrage par pushdown de prédicats a réussi.
Importation et exportation de données Hologres
Types de données pris en charge
-
Limitations du type Decimal
Pour les tables externes Hologres créées dans MaxCompute, le type de données
DECIMALest 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 avec le typeSTRINGdans la table externe MaxCompute, puis utiliser la fonctionCASTpour convertir explicitement les données lors de leur utilisation. -
Limitations 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,MapouStruct. -
Autres types incompatibles
Certains types de données Hologres, comme
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 correspondances 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 | Entier signé 32 bits. | |||
TEXT | STRING, VARCHAR | Type chaîne limité à 8 Mo. | |||
SMALLINT | SMALLINT | Entier signé 16 bits. | |||
INT2 | SMALLINT | Entier signé 16 bits. | |||
BIGINT (alias : INT8) | BIGINT | Entier signé 64 bits. | |||
BYTEA | BINARY | Le type de données binaire est actuellement limité à 8 Mo. Le type de données | |||
REAL (alias : FLOAT4) | FLOAT | Nombre à virgule flottante binaire 32 bits. | |||
DOUBLE PRECISION (alias : FLOAT8) | DOUBLE | Nombre à virgule flottante binaire 64 bits. | |||
BOOLEAN (alias : BOOL) | BOOLEAN | Type booléen. | |||
TIMESTAMP | TIMESTAMP_NTZ | Le type Il correspond au type | |||
TIMESTAMP WITH TIME ZONE (alias : TIMESTAMPTZ) | TIMESTAMP | Le type de données d'horodatage est précis à la nanoseconde et utilise le format La conversion de précision sous-jacente est gérée automatiquement. | |||
DECIMAL (alias : NUMERIC) | DECIMAL(précision,échelle) | Type numérique exact en base 10.
Dans MaxCompute, le type de données | |||
CHAR(n) | CHAR(n) | Dans MaxCompute, La taille maximale du type de données | |||
VARCHAR(n) | VARCHAR(n) | Le type de données Dans Hologres, la taille maximale pour | |||
DATE | DATE | Le type de données date au format | |||
INT4[] | ARRAY<INT> | Les tableaux Hologres sont mappés aux types | |||
INT8[] | ARRAY<BIGINT> | ||||
FLOAT4[] | ARRAY<FLOAT> | ||||
FLOAT8[] | ARRAY<DOUBLE> | ||||
BOOLEAN[] | ARRAY<BOOLEAN> | ||||
TEXT[] | ARRAY<STRING> | ||||
JSONB | JSON | Le type | |||
JSON | STRING | Lors de l'utilisation de JDBC, le type | |||
SERIAL (auto-incrémentation) | INT | MaxCompute lit les champs | |||
RoaringBitmap | Non pris en charge | Aucun type correspondant n'existe dans MaxCompute. | |||
RoaringBitmap64 | Non pris en charge | Aucun type correspondant n'existe dans MaxCompute. | |||
BIT(n) | Non pris en charge | Aucun type correspondant n'existe dans MaxCompute. | |||
VARBIT(n) | Non pris en charge | Aucun type correspondant n'existe dans MaxCompute. | |||
INTERVAL | Non pris en charge | Aucun type correspondant n'existe dans MaxCompute. | |||
TIMETZ | Non pris en charge | Aucun type correspondant n'existe dans MaxCompute. | |||
TIME | Non pris en charge | Aucun type correspondant n'existe dans MaxCompute. | |||
INET | Non pris en charge | Aucun type correspondant n'existe dans MaxCompute. | |||
MONEY | Non pris en charge | Aucun type correspondant n'existe dans MaxCompute. |
OID | Non pris en charge | Aucun type correspondant n'existe dans MaxCompute. | |||
UUID | 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, le job é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 par défaut de fractionnement des données peut entraîner un dépassement de la limite de concurrence de 7 777 instances de mapper.
RemarqueCette limite empêche l'exécution de jobs comportant un nombre excessif de mappers, ce qui protège 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 jobs SQL sur les tables externes Hologres
-
Problème
Les performances sont faibles lorsque vous utilisez le SDK pour rechercher des données dans une table externe MaxCompute.
-
Solution
Les tables externes présentent des performances limitées car elles ne prennent en charge que les analyses complètes de table. Pour de meilleures performances, utilisez plutôt 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écifique :
ODPS-0123131:User defined function exception - SQLException in nextKeyValueCaused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near "," -
Solution
Ajoutez le paramètre
odps.federation.jdbc.colmappingpour mapper les colonnes de la table source Hologres aux 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.
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, le job 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 activer de force le mode d'autorisation par rôle lié au service.
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 sur l'utilisation.
Affichage du repli (Fallback) en mode de lecture directe
Dans l'onglet Summary de Logview, si des informations Fallback apparaissent dans la section external holo tables, cela indique que le mode de lecture directe n'a pas été utilisé et que le système est revenu au mode JDBC. Les erreurs courantes et leurs causes sont répertoriées ci-dessous :
Détails de l'erreur | Cause racine | Résolution |
Nom de colonne <col> Type Odps <X> Type Holo <Y>, se manifestant spécifiquement par :
| Erreur de mappage de type de colonne | Les types de colonne des champs de la table externe Hologres ne correspondent pas à ceux de la table source. Modifiez le type de données de la table externe selon le mappage des types de données pour activer le mode de lecture directe. |
Schéma de table Odps invalide | Erreur de généralisation : consultez les journaux d'erreurs dans Logview pour plus de détails. |
|
Erreur de connexion Holo | Exception de connexion à l'instance Hologres | Informations d'autorisation incorrectes ou état anormal de l'instance Hologres. Vérifiez que l'utilisateur actuel dispose des autorisations nécessaires pour accéder à la base de données Hologres correspondante, ou vérifiez si l'instance Hologres est actuellement dans un état opérationnel. |
Erreur Select hg_version / Erreur de vérification de la version Hologres / Erreur de récupération des données hg_version | Version incorrecte de l'instance Hologres | Mettez à niveau l'instance Hologres vers la version V1.3.34 ou ultérieure. Pour plus de détails sur la mise à niveau de la version de l'instance, consultez la section Mettre à niveau une instance. |
Références
Pour plus d'informations sur les problèmes courants liés aux tables étrangères Hologres, consultez la section FAQ sur Lakehouse et les tables étrangères.