Tous les produits
Search
Centre de documentation

Hologres:EXTERNAL_FILES

Dernière mise à jour :Aug 11, 2026

À 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

  1. Connectez-vous à la console RAM et accédez à Rôles RAM.

  2. Cliquez sur Create Role.

  3. Dans la boîte de dialogue, définissez Trusted Entity Type sur Cloud Service et Trusted Entity sur Real-time Data Warehouse Hologres.

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

  1. Dans la console RAM, accédez à Policies et cliquez sur Create Policy.

  2. 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>"
        }
      ]
    }
  3. 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 ORC UNION , STRUCT et MAP ne 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 Parquet STRUCT et MAP ne 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 path pour faire correspondre les fichiers dans un répertoire plat.

  • Types ORC non pris en charge : UNION, STRUCT et MAP.

  • Types Parquet non pris en charge : STRUCT et MAP.

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