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
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 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
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 à 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
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 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.
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 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
Vous avez installé et configuré le client MaxCompute.
-
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.
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
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.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 ¤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 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 | +------------+------------+ -
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
Vous avez installé et configuré le client MaxCompute.
-
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.
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.
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
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.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 ¤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 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.
-
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 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.
-
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'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 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 principal/secondaire, vous ne pouvez spécifier que l'instance principale 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, 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 :
|
fallback reason | Si le access mode est
|
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
Exemple de syntaxe :
|
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 :
|
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 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
Exemple de syntaxe du paramètre :
|
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 :
|
Scénarios applicables |
|
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 |
|
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 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.
-
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' ); -
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
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
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 comme étant du typeSTRINGdans la table externe MaxCompute, puis utiliser la fonctionCASTpour 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,MapouStruct. -
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 | Entier signé 32 bits. | |||
TEXT | STRING, VARCHAR | Type de chaîne avec une limite de longueur de 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 a actuellement une limite de longueur de 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 BOOLEAN. | |||
TIMESTAMP | TIMESTAMP_NTZ | Le type Il est mappé vers | |||
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 est une date au format | |||
INT4[] | ARRAY<INT> | Les tableaux Hologres sont mappés vers les 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, 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.
RemarqueCette 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 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 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.