À partir de la version 4.1 de Hologres, utilisez la fonction EXTERNAL_FILES pour interroger, importer et exporter directement des fichiers de données structurés stockés dans Object Storage Service (OSS), sans créer de tables externes. Cette rubrique décrit les prérequis, la syntaxe, les paramètres, des exemples ainsi que les limites.
Vue d'ensemble
La fonction EXTERNAL_FILES permet d'exécuter des requêtes SQL directement sur des fichiers CSV, Parquet et ORC stockés dans OSS, sans table externe. Trois cas d'usage sont possibles :
Interroger des données : exécutez des instructions SELECT sur des fichiers CSV, Parquet et ORC présents dans OSS.
Importer des données : chargez les données depuis des fichiers OSS vers une table interne Hologres.
Exporter des données : écrivez les données d'une table Hologres vers OSS au format CSV.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une instance Hologres exécutant la version 4.1 ou ultérieure. Pour mettre à niveau, consultez la rubrique Mises à niveau des instances.
Un compte Alibaba Cloud ou un utilisateur RAM. Les comptes personnalisés ne sont pas pris en charge.
Configuration des autorisations
La fonction EXTERNAL_FILES accède à OSS via un rôle RAM. Suivez les étapes ci-dessous avant d'utiliser EXTERNAL_FILES.
Étape 1 : Créer un rôle RAM
Connectez-vous à la console RAM et accédez à Rôles RAM.
Cliquez sur Create Role.
Dans la boîte de dialogue, définissez Trusted Entity Type sur Cloud Service et Trusted Entity sur Real-time Data Warehouse Hologres.
Saisissez un nom de rôle et finalisez la création.
Étape 2 : Accorder des autorisations OSS au rôle
Attachez une stratégie OSS au rôle RAM selon les opérations requises :
Lire des données : attachez la stratégie
AliyunOSSReadOnlyAccess.Écrire des données : attachez la stratégie
AliyunOSSFullAccess.
Étape 3 : Accorder l'autorisation GrantAssumeRole aux utilisateurs RAM
Ignorez cette étape si l'utilisateur qui exécute le code SQL est un compte Alibaba Cloud. Pour les utilisateurs RAM, accordez-leur l'autorisation GrantAssumeRole comme suit :
Dans la console RAM, accédez à Policies et cliquez sur Create Policy.
-
Basculez vers l'éditeur Script Editor et collez le code JSON suivant. Remplacez
<RoleARN>par l'ARN du rôle créé. Pour trouver l'ARN, consultez la rubrique FAQ sur les rôles RAM et les jetons STS.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "hologram:GrantAssumeRole", "Resource": "<RoleARN>" } ] } -
Attachez cette stratégie à l'utilisateur :
Pour un utilisateur RAM : accédez à Users > Permissions > Add Permissions.
Pour un rôle RAM : accédez à Roles > Permissions > Add Permissions.
Syntaxe
Interroger des données
SELECT * FROM EXTERNAL_FILES(
path = 'oss://bucket/path',
format = 'csv|parquet|orc',
oss_endpoint = 'oss_endpoint',
role_arn = 'acs:ram::xxx:role/xxx'
[, other parameters...]
) [AS (col1 type1, col2 type2, ...)]
Importer des données
INSERT INTO target_table
SELECT * FROM EXTERNAL_FILES(
path = 'oss://bucket/path',
format = 'csv|parquet|orc',
oss_endpoint = 'oss_endpoint',
role_arn = 'acs:ram::xxx:role/xxx'
[, other parameters...]
) [AS (col1 type1, col2 type2, ...)]
Exporter des données
INSERT INTO EXTERNAL_FILES(
path = 'oss://bucket/path',
format = 'csv',
oss_endpoint = 'oss_endpoint',
role_arn = 'acs:ram::xxx:role/xxx'
[, other parameters...]
) SELECT * FROM source_table;
Paramètres
Paramètres communs
| Paramètre | Type | Description | Obligatoire | Valeur par défaut | Exemple |
|---|---|---|---|---|---|
path |
STRING | Chemin du fichier OSS. Prend en charge les répertoires, les fichiers individuels et plusieurs chemins séparés par des virgules. Les caractères génériques sont pris en charge (voir le tableau ci-dessous). | Oui | — | oss://bucket/dir/, oss://bucket/dir/*.csv |
format |
STRING | Format du fichier. Formats pris en charge pour les requêtes : csv, parquet, orc. L'exportation prend uniquement en charge le format csv. |
Oui | — | csv |
oss_endpoint |
STRING | Endpoint de réseau classique OSS. Pour connaître les valeurs d'endpoint, consultez la rubrique Régions et endpoints. | Non | — | oss-cn-hangzhou-internal.aliyuncs.com |
role_arn |
STRING | ARN du rôle RAM utilisé pour accéder à OSS. | Non | — | acs:ram::xxx:role/xxx |
Caractères génériques pris en charge dans path
| Caractère générique | Description | Exemple |
|---|---|---|
* |
Correspond à zéro ou plusieurs caractères | oss://bucket/dir/*.csv |
? |
Correspond à n'importe quel caractère unique | oss://bucket/dir/file?.csv |
Paramètres de lecture
| Paramètre | Type | Description | Obligatoire | Valeur par défaut |
|---|---|---|---|---|
schema_deduce_file_num |
INT | Nombre maximal de fichiers à analyser lors de l'inférence du schéma. | Non | 5 |
schema_deduce_file_order |
STRING | Ordre d'analyse des fichiers pour l'inférence du schéma. Valeurs valides : latest_first, earliest_first, random. |
Non | latest_first |
csv_skip_header |
BOOLEAN | Indique si la première ligne d'un fichier CSV doit être traitée comme un en-tête et ignorée lors de la lecture. | Non | false |
csv_delimiter |
STRING | Délimiteur de colonne pour les fichiers CSV. | Non | , (virgule) |
Paramètres d'écriture
| Paramètre | Type | Description | Obligatoire | Valeur par défaut |
|---|---|---|---|---|
target_file_size_mb |
INT | Taille cible de chaque fichier de sortie, en Mo. | Non | 10 |
single_file |
BOOLEAN | Indique si toutes les données exportées doivent être écrites dans un seul fichier. | Non | false |
Exemples
Interroger un fichier CSV
Interrogez un fichier CSV avec inférence automatique du schéma :
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/data/',
format = 'csv',
csv_skip_header = 'true',
csv_delimiter = ',',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
);
Interrogez un fichier CSV avec un schéma spécifié manuellement :
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/data/',
format = 'csv',
csv_skip_header = 'true',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
) AS (id int, name text, amount decimal(10,2));
Interroger un fichier Parquet
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/parquet_data/',
format = 'parquet',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
);
Interroger un fichier ORC
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/orc_data/',
format = 'orc',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
);
Importer des données dans une table Hologres
-- Create the target table
CREATE TABLE orders (
order_id int,
customer_name text,
amount decimal(10,2),
PRIMARY KEY(order_id)
);
-- Import data from OSS
INSERT INTO orders
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/orders/',
format = 'csv',
csv_skip_header = 'true',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
) AS (order_id int, customer_name text, amount decimal(10,2));
Exporter des données vers OSS
Exportez vers plusieurs fichiers avec une limite de taille par fichier :
INSERT INTO EXTERNAL_FILES(
path = 'oss://mybucket/export/',
format = 'csv',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role',
target_file_size_mb = '100'
) SELECT * FROM orders;
Exportez toutes les données vers un seul fichier :
INSERT INTO EXTERNAL_FILES(
path = 'oss://mybucket/export/',
format = 'csv',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role',
single_file = 'true'
) SELECT * FROM orders;
Utiliser un groupe de ressources serverless
SET hg_computing_resource = 'serverless';
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/data/',
format = 'csv',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
);
Inférence de schéma
Inférence automatique
Si vous omettez la clause AS, Hologres déduit automatiquement le schéma :
Parquet et ORC : le schéma est déduit à partir des métadonnées du fichier.
CSV avec ligne d'en-tête : le schéma est déduit à partir de l'en-tête et du contenu des données. Définissez
csv_skip_header = 'true'afin que la ligne d'en-tête ne soit pas lue comme des données.CSV sans ligne d'en-tête : tous les fichiers du chemin doivent présenter une structure de colonnes identique.
Hologres analyse jusqu'à schema_deduce_file_num fichiers (valeur par défaut : 5) et fusionne l'ensemble des schémas découverts.
Comportement en cas de non-concordance du schéma
Lorsque le schéma déduit ou spécifié ne correspond pas exactement au contenu du fichier, Hologres gère les divergences comme suit :
| Scénario | Comportement |
|---|---|
| La colonne existe dans le schéma mais pas dans le fichier | Remplie avec NULL |
| La colonne existe dans le fichier mais pas dans le schéma | Ignorée |
| Les types de colonnes diffèrent mais sont convertibles | Conversion automatique du type |
| Les types de colonnes diffèrent et ne sont pas convertibles | Renvoie NULL |
Exemple : interrogation de fichiers avec des colonnes non concordantes
Supposons que vous disposiez de deux fichiers CSV dans le même chemin :
orders_jan.csv — 3 colonnes : order_id, customer_name, amount
orders_feb.csv — 4 colonnes : order_id, customer_name, amount, region
Lorsque vous interrogez le chemin sans spécifier de schéma, Hologres fusionne les deux schémas. Les lignes issues de orders_jan.csv renvoient NULL dans la colonne region :
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/orders/',
format = 'csv',
csv_skip_header = 'true',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
);
| order_id | customer_name | amount | region |
|---|---|---|---|
| 1001 | Alice | 99,00 | NULL |
| 1002 | Bob | 149,00 | NULL |
| 2001 | Carol | 79,00 | us-west |
| 2002 | Dave | 199,00 | eu-central |
Pour éviter les valeurs NULL inattendues, spécifiez explicitement le schéma à l'aide de la clause AS, ou assurez-vous que tous les fichiers partagent la même structure de colonnes.
Mappage des types
Mappage des types ORC
| Type ORC | Type PostgreSQL |
|---|---|
| BOOLEAN | BOOLEAN |
| TINYINT / SMALLINT | SMALLINT |
| INT | INTEGER |
| BIGINT | BIGINT |
| FLOAT | REAL |
| DOUBLE | DOUBLE PRECISION |
| DECIMAL(p, s) | DECIMAL(p, s) |
| STRING | TEXT |
| VARCHAR(n) | VARCHAR(n) |
| CHAR(n) | CHAR(n) |
| BINARY | BYTEA |
| DATE | DATE |
| TIMESTAMP | TIMESTAMP WITHOUT TIME ZONE |
| TIMESTAMP WITH LOCAL TIMEZONE | TIMESTAMP WITH TIME ZONE |
| LIST | Array (pg_type[]) |
Les types ORCUNION,STRUCTetMAPne sont pas pris en charge.
Mappage des types Parquet
| Type physique Parquet | Type logique Parquet | Type PostgreSQL |
|---|---|---|
| BOOLEAN | — | BOOLEAN |
| INT32 | — | INTEGER |
| INT32 | DATE | DATE |
| INT32 | DECIMAL(p, s) | DECIMAL(p, s) |
| INT64 | — | BIGINT |
| INT64 | TIMESTAMP_MILLIS / MICROS | TIMESTAMP / TIMESTAMPTZ |
| INT64 | DECIMAL(p, s) | DECIMAL(p, s) |
| FLOAT | — | REAL |
| DOUBLE | — | DOUBLE PRECISION |
| BYTE_ARRAY | — | BYTEA |
| BYTE_ARRAY | STRING | TEXT |
| BYTE_ARRAY | JSON / BSON | JSONB |
| BYTE_ARRAY | ENUM | TEXT |
| FIXED_LEN_BYTE_ARRAY | DECIMAL(p, s) | DECIMAL(p, s) |
| FIXED_LEN_BYTE_ARRAY | UUID | UUID |
| LIST | LIST | Array (pg_type[]) |
Les types ParquetSTRUCTetMAPne sont pas pris en charge.
Limites
Format d'exportation : seul le format CSV est pris en charge pour les exports.
Recherche récursive de répertoires : les sous-répertoires ne font pas l'objet d'une recherche récursive. Utilisez des caractères génériques dans le paramètre
pathpour faire correspondre les fichiers dans un répertoire plat.Types ORC non pris en charge :
UNION,STRUCTetMAP.Types Parquet non pris en charge :
STRUCTetMAP.Comptes pris en charge : seuls les utilisateurs RAM et les comptes Alibaba Cloud sont pris en charge. Les comptes personnalisés ne sont pas pris en charge.
FAQ
J'obtiens une erreur d'autorisation lors de l'exportation des données. Que dois-je faire ?
Assurez-vous que le rôle RAM dispose de l'autorisation AliyunOSSFullAccess. Les opérations de lecture nécessitent uniquement l'autorisation AliyunOSSReadOnlyAccess, mais les opérations d'écriture (exports) exigent un accès complet.
Comment contrôler le nombre et la taille des fichiers exportés ?
Utilisez le paramètre target_file_size_mb pour définir la taille cible de chaque fichier de sortie (valeur par défaut : 10 Mo). Pour un contrôle plus fin du nombre de lignes par fichier, ajustez le paramètre hg_experimental_query_batch_size.