Cette rubrique décrit comment créer, lire et écrire dans des tables externes ORC pour OSS.
Contraintes
Les tables externes OSS ne prennent pas en charge la propriété cluster.
La taille d'un fichier unique ne peut pas dépasser 2 Go. Fractionnez les fichiers supérieurs à 2 Go.
MaxCompute et OSS doivent se trouver dans la même région.
Création d'une table externe
Syntaxe
Si le schéma du fichier ORC et celui de la table externe ne correspondent pas, MaxCompute gère les différences comme suit :
Moins de colonnes dans le fichier que dans la table : Les colonnes manquantes sont remplies par la valeur NULL.
Plus de colonnes dans le fichier que dans la table : Les colonnes supplémentaires sont ignorées.
Incompatibilité de type : Le type STRING peut lire des données INT depuis des fichiers ORC, mais cette pratique est déconseillée. Lors de la lecture de données STRING par un type INT, les valeurs non numériques sont converties en NULL, tandis que les valeurs numériques sont acceptées.
Utilisez la syntaxe simplifiée ou la syntaxe complète pour créer une table externe ORC.
Syntaxe simplifiée (recommandée)
Utilisez cette syntaxe pour permettre à MaxCompute de gérer automatiquement l'autorisation via le rôle RAM par défaut.
CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
STORED AS orc
LOCATION '<oss_location>';
Syntaxe complète
CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
WITH serdeproperties(
'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
)
STORED AS orc
LOCATION '<oss_location>'
tblproperties (
'<xxx>'='<yyy>'
);
Paramètres courants
Pour plus d'informations sur les paramètres courants, consultez la section Paramètres de syntaxe de base.
Paramètres spécifiques au format
WITH serdeproperties
|**Propriété**
|
**Cas d'utilisation**
|
**Valeur**
|
**Valeur par défaut**
| | --- | --- | --- | --- | |
`mcfed.orc.schema.resolution`
|
Les fichiers ORC d'une même table externe ont des schémas incohérents.
|
`name` — mappe les colonnes par nom.
|
`position` — mappe les colonnes par position.
|
tblproperties
|**Propriété**
|
**Cas d'utilisation**
|
**Description**
|
**Valeur**
|
**Valeur par défaut**
| | --- | --- | --- | --- | --- | |
`mcfed.orc.compress`
|
Écrire des données ORC dans OSS avec compression.
Aucune configuration de paramètre supplémentaire n'est requise pour lire les fichiers compressés.
|
Algorithme de compression pour les fichiers de sortie ORC.
|
`SNAPPY`, `ZLIB` ou `ZSTD`
|
Aucune
| |
`odps.external.data.output.prefix` (également `odps.external.data.prefix`)
|
Ajouter un préfixe personnalisé aux fichiers de sortie.
|
Chaîne de préfixe. Caractères autorisés : lettres, chiffres et traits de soulignement (a–z, A–Z, 0–9, _). Longueur : 1 à 10 caractères.
|
Exemple : `mc_`
|
Aucune
| |
`odps.external.data.enable.extension`
|
Contrôler si les fichiers de sortie incluent une extension.
|
`True` affiche l'extension ; `False` la masque.
|
`True` ou `False`
|
`False`
| |
`odps.external.data.output.suffix`
|
Ajouter un suffixe personnalisé aux fichiers de sortie.
|
Chaîne de suffixe. Caractères autorisés : lettres, chiffres et traits de soulignement.
|
Exemple : `_hangzhou`
|
Aucune
| |
`odps.external.data.output.explicit.extension`
|
Ajouter une extension personnalisée aux fichiers de sortie. Cette propriété est prioritaire sur `odps.external.data.enable.extension`.
|
Chaîne d'extension. Caractères autorisés : lettres, chiffres et traits de soulignement. Longueur : 1 à 10 caractères.
|
Exemple : `jsonl`
|
Aucune
| |
`mcfed.orc.batch.size`
|
Optimiser l'utilisation de la mémoire et le débit de traitement.
|
Nombre de lignes traitées par lot (taille du lot ORC).
|
Entier non négatif
|
`1000`
|
Liste d'autorisation et liste de blocage
Les tables externes MaxCompute OSS prennent en charge le filtrage par liste d'autorisation et liste de blocage. Définissez les paramètres correspondants dans tblproperties pour filtrer les fichiers à lire depuis un répertoire. Pour plus de détails, consultez la section Liste d'autorisation et liste de blocage.
Écriture de données
Pour plus de détails sur la syntaxe d'écriture dans MaxCompute, consultez la section Syntaxe d'écriture.
Interrogation des données
Consultez la section Syntaxe d'interrogation pour obtenir des détails sur la syntaxe SELECT.
Consultez la section Optimisation des requêtes pour obtenir des détails sur l'optimisation des plans de requête.
-
Activation du predicate pushdown
Le predicate pushdown (PPD) améliore les performances des requêtes sur les tables externes ORC en transférant les conditions de filtre vers la couche d'analyse des données. Le PPD nécessite le mode natif (
odps.ext.oss.orc.native=true).Ajoutez les instructions suivantes avant votre requête SQL :
-- Enable the ORC native reader SET odps.ext.oss.orc.native=true; -- Enable ORC predicate pushdown SET odps.storage.orc.use.predicate.pushdown=true;
Exemple
Cet exemple crée une table externe ORC avec compression SNAPPY, ajoute une partition existante, lit les données et écrit une nouvelle ligne.
Prérequis
Vous avez créé un projet MaxCompute.
-
Vous avez préparé un compartiment OSS et un répertoire. Pour plus d'informations, consultez les sections Créer un compartiment et Gérer les répertoires.
Assurez-vous que votre compartiment se trouve dans la même région que votre projet MaxCompute.
-
Accordez les permissions.
Vous disposez des permissions nécessaires pour accéder à OSS. Vous pouvez accéder à une table externe OSS en utilisant un compte Alibaba Cloud, un utilisateur RAM ou un rôle RAM. Pour plus d'informations sur l'octroi des permissions, consultez la section Autorisation STS pour OSS.
Vous disposez de la permission CreateTable dans le projet MaxCompute. Pour plus d'informations sur les permissions liées aux tables, consultez la section Permissions MaxCompute.
Étape 1 : Préparation du fichier de données
À l'aide des données d'exemple fournies, créez le chemin de dossier orc_snappy/dt=20250526 dans le compartiment oss-mc-test . Téléversez le fichier snappy dans le dossier de partition dt=20250526 .
Étape 2 : Création de la table externe
CREATE EXTERNAL TABLE orc_data_type_snappy
(
vehicleId INT,
recordId INT,
patientId INT,
calls INT,
locationLatitute DOUBLE,
locationLongitude DOUBLE,
recordTime STRING,
direction STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
WITH serdeproperties (
'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
)
STORED AS ORC
LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/orc_snappy/'
tblproperties (
'mcfed.orc.compress'='SNAPPY'
);
Étape 3 : Ajout des partitions existantes
Pour les tables externes partitionnées, exécutez MSCK REPAIR TABLE afin d'enregistrer les partitions OSS existantes dans MaxCompute. Pour la syntaxe complète, consultez la section Ajout de partitions à une table externe OSS.
MSCK REPAIR TABLE orc_data_type_snappy ADD PARTITIONS;
Étape 4 : Lecture des données
SELECT * FROM orc_data_type_snappy WHERE dt = '20250526' LIMIT 10;
La requête renvoie :
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
| vehicleid | recordid | patientid | calls | locationlatitute | locationlongitude | recordtime | direction | dt |
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
| 1 | 12 | 76 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:10 | SW | 20250526 |
| 1 | 1 | 51 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | 20250526 |
| 1 | 2 | 13 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:01 | NE | 20250526 |
| 1 | 3 | 48 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:02 | NE | 20250526 |
| 1 | 4 | 30 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:03 | W | 20250526 |
| 1 | 5 | 47 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:04 | S | 20250526 |
| 1 | 6 | 9 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:05 | S | 20250526 |
| 1 | 7 | 53 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:06 | N | 20250526 |
| 1 | 8 | 63 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:07 | SW | 20250526 |
| 1 | 9 | 4 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:08 | NE | 20250526 |
| 1 | 10 | 31 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:09 | N | 20250526 |
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
Étape 5 : Écriture des données
INSERT INTO orc_data_type_snappy PARTITION (dt = '20250526')
VALUES (1, 16, 76, 1, 46.81006, -92.08174, '9/14/2014 0:10', 'SW');
-- Verify the inserted row
SELECT * FROM orc_data_type_snappy WHERE dt = '20250526' AND recordid = 16;
La requête renvoie :
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
| vehicleid | recordid | patientid | calls | locationlatitute | locationlongitude | recordtime | direction | dt |
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
| 1 | 16 | 76 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:10 | SW | 20250526 |
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
Types de données pris en charge
Pour la liste complète des types de données MaxCompute, consultez les sections Type de données version 1.0 et Type de données version 2.0.
MaxCompute prend en charge deux modes pour la lecture des tables externes ORC :
Mode JNI (
SET odps.ext.oss.orc.native=false;) : Prend en charge les opérations de lecture et d'écriture.Mode natif (
SET odps.ext.oss.orc.native=true;) : Prend uniquement en charge les opérations de lecture.
**Type de données**
|
**Mode JNI (lecture et écriture)**
|
**Mode natif (lecture uniquement)**
| | --- | --- | --- | |
TINYINT
|
Oui
|
Oui
| |
SMALLINT
|
Oui
|
Oui
| |
INT
|
Oui
|
Oui
| |
BIGINT
|
Oui
|
Oui
| |
BINARY
|
Oui
|
Oui
| |
FLOAT
|
Oui
|
Oui
| |
DOUBLE
|
Oui
|
Oui
| |
DECIMAL(precision,scale)
|
Oui
|
Oui
| |
VARCHAR(n)
|
Oui
|
Oui
| |
CHAR(n)
|
Oui
|
Oui
| |
STRING
|
Oui
|
Oui
| |
DATE
|
Oui
|
Oui
| |
DATETIME
|
Non
|
Oui
| |
TIMESTAMP
|
Non
|
Non
| |
TIMESTAMP_NTZ
|
Oui
|
Non
| |
BOOLEAN
|
Oui
|
Oui
| |
ARRAY
|
Oui
|
Oui
| |
MAP
|
Oui
|
Oui
| |
STRUCT
|
Oui
|
Oui
| |
JSON
|
Non
|
Non
|
Formats de compression pris en charge
Pour lire ou écrire des fichiers ORC compressés, ajoutez la propriété mcfed.orc.compress à la section with serdeproperties lors de la création de la table. Consultez la section WITH serdeproperties.
**Propriétés de compression**
|
**Lecture**
|
**Écriture**
| | --- | --- | --- | |
ZSTD
|
Oui
|
Oui
| |
SNAPPY (SnappyRawCodec)
|
Oui
|
Oui
| |
SNAPPY (SnappyCodec)
|
Oui
|
Non
| |
ZLIB
|
Oui
|
Oui
|
Évolution du schéma prise en charge
Les tables externes ORC prennent en charge deux méthodes pour mapper les colonnes de la table aux champs du fichier ORC : le mappage par position et le mappage par nom.
Mappage par position (par défaut) : Définissez
'mcfed.orc.schema.resolution'='position'ou omettez la propriété. Les colonnes sont appariées selon leur ordre, de sorte que l'ordre des colonnes de la table doit correspondre exactement à l'ordre des champs dans le fichier ORC.Mappage par nom : Définissez
'mcfed.orc.schema.resolution'='name'. Les colonnes sont appariées par nom, indépendamment de l'ordre.
Le tableau ci-dessous indique quelles opérations de modification de schéma sont compatibles avec chaque méthode de mappage. « Compatible » signifie que les données nouvellement écrites et les données historiques peuvent être lues correctement après l'opération.
Modification du schéma | Mode de mappage | Pris en charge | Description | Compatibilité des données |
Ajouter une colonne | Par position | Oui |
|
Par exemple, après l'ajout d'une colonne, les lignes historiques qui ne contiennent pas la nouvelle colonne renvoient NULL pour cette colonne. |
Par nom | Oui | |||
Supprimer une colonne | Par position | Non | Déconseillé. Le mappage par position exige que l'ordre des colonnes dans le DDL corresponde à celui du fichier. Après la suppression d'une colonne, les schémas DDL et fichier divergent, ce qui entraîne des erreurs de lecture. |
Par exemple, après la suppression d'une colonne, les données historiques contenant toujours la colonne supprimée provoquent des erreurs de lecture. |
Par nom | Oui | Le mappage par nom associe les colonnes par nom, indépendamment de l'ordre des colonnes. | Compatible | |
Modifier l'ordre des colonnes | Par position | Non | Déconseillé. Le mappage par position exige que l'ordre des colonnes dans le DDL corresponde à celui du fichier. Après le réordonnancement des colonnes, les schémas DDL et fichier divergent, ce qui entraîne des erreurs de lecture. |
Par exemple, après le réordonnancement des colonnes, les données historiques conservent l'ordre initial, ce qui provoque un désalignement entre le schéma et les données. |
Par nom | Oui | Le mappage par nom associe les colonnes par nom, indépendamment de l'ordre des colonnes. | Compatible | |
Modifier le type de données d'une colonne | Par position | Oui | Pour connaître les conversions de type autorisées, consultez la section Modifier le type de données d'une colonne. | Compatible |
Par nom | Oui | |||
Renommer une colonne | Par position | Oui | Compatible | |
Par nom | Non | Déconseillé. Le mappage par nom associe les colonnes par nom. Après le renommage d'une colonne, les fichiers existants utilisant le nom d'origine ne peuvent plus être appariés. |
Par exemple, après le renommage d'une colonne, si le schéma du fichier ORC utilise toujours le nom d'origine, la colonne renvoie NULL lors de la lecture. | |
Modifier le commentaire d'une colonne | Par position | Oui | Le commentaire doit être une chaîne valide ne dépassant pas 1 024 octets. | Compatible |
Par nom | Oui | |||
Modifier la possibilité de valeur NULL d'une colonne | Par position | Non | Les colonnes acceptent les valeurs NULL par défaut. | Sans objet |
Par nom | Non |