MaxCompute introduit la fonctionnalité de table d'objets, qui permet au moteur de calcul de l'entrepôt de données d'accéder aux données non structurées et à leurs métadonnées stockées dans un data lake. Cette rubrique décrit la syntaxe des commandes et fournit des exemples d'utilisation.
Contexte
Dans de nombreux flux de travail d'intelligence artificielle, les développeurs d'entrepôts de données, familiers avec les données et la logique métier, doivent prétraiter ou traiter des données non structurées destinées aux grands modèles. Ces tâches tirent parti de la puissance de calcul massive et économique des plateformes de big data. Les processus et leurs résultats interagissent souvent avec les données de l'entrepôt de données ou du data lake.
Le traitement des données non structurées via SQL présente plusieurs défis :
Lors de la lecture depuis le stockage d'objets, les moteurs SQL de big data ne peuvent pas déterminer la taille des objets, ce qui complique l'optimisation du plan d'exécution et rend difficile le contrôle de la concurrence ou le lancement d'un nombre approprié de tâches simultanées. Sans une projection de prédicat efficace, la puissance de calcul n'est pas pleinement exploitée, en particulier en cas de déséquilibre des données.
La lecture des métadonnées depuis le stockage d'objets engendre une latence élevée, car chaque requête nécessite un appel distant vers le service de stockage.
Les listes de fichiers provenant du stockage d'objets ne peuvent être récupérées que de manière sérielle au sein d'un seul processus dans une fonction de table définie par l'utilisateur (UDTF), ce qui entraîne de mauvaises performances de lecture des données.
Vous devez implémenter la logique d'autorisation et de connectivité réseau au sein des fonctions définies par l'utilisateur (UDF) pour vous connecter aux services de stockage.
Les entrepôts de données traditionnels ne proposent pas de fonctionnalités permettant de télécharger en toute sécurité des images personnalisées ni d'environnement d'exécution sécurisé pour les UDF. De plus, les appels distants nécessitent une gestion complexe de la concurrence avec le service de calcul distribué.
Fonctionnalités
MaxCompute introduit la fonctionnalité de table d'objets, qui permet au moteur de calcul de l'entrepôt de données d'accéder aux données non structurées et à leurs métadonnées stockées dans un data lake. Cette fonctionnalité offre les capacités suivantes :
Permet au moteur de lire les métadonnées des fichiers OSS sous forme de table.
S'appuie sur une table de métadonnées pour mettre en cache les métadonnées versionnées des fichiers OSS. Le moteur SQL peut ensuite utiliser ces métadonnées pour optimiser les requêtes, telles que le filtrage des données et la projection de prédicat.
Fournit des fonctions intégrées pour lire le contenu des fichiers de données non structurées de diverses manières.
Permet au moteur SQL MaxCompute de créer des partitions concurrentes basées sur les métadonnées de la table d'objets, déverrouillant ainsi le calcul distribué à grande échelle pour améliorer l'efficacité de la lecture et du traitement des données.
Vous permet de télécharger une image personnalisée pour construire des UDF qui traitent les données non structurées lues par le moteur.
Prend en charge le traitement des données non structurées pour générer des résultats structurés et les écrire dans des tables internes ou externes de l'entrepôt de données. Les versions futures prendront également en charge la génération de résultats non structurés et leur réécriture dans OSS via les tables d'objets.
Prend en charge le moteur Maxframe issu de l'écosystème Python.
Limitations
Le projet MaxCompute doit avoir les schémas activés. Pour plus d'informations, consultez Activer le schéma.
MaxCompute doit prendre en charge le système de types 2,0.
Les tables d'objets ne prennent pas actuellement en charge les partitions.
Facturation
Une table d'objets stocke une collection de métadonnées pour les fichiers dans OSS. Des frais de stockage sont appliqués pour les métadonnées actualisées et stockées dans la table d'objets. Pour plus d'informations, consultez Tarification du stockage. Étant donné que les fichiers provenant d'OSS ne sont pas stockés dans MaxCompute, MaxCompute ne facture pas leur stockage. OSS facture le stockage et l'accès aux données. Pour plus d'informations, consultez Tarification du stockage OSS.
Pour les tâches qui extraient et actualisent les métadonnées OSS, la valeur
inputsizepour chaque fichier analysé est basée sur la taille de ses métadonnées, et non sur sa taille de fichier réelle. Par conséquent, le coût total de la tâche d'actualisation dépend du nombre de fichiers, et non de leur taille totale. Pour plus d'informations, consultez Facturation SQL pour les tables externes.-
Des frais de calcul s'appliquent lorsque vous utilisez une table d'objets et ses métadonnées pour analyser et extraire des données non structurées depuis OSS.
Dans un abonnement à l'utilisation, l'analyse des métadonnées de la table d'objets est facturée de la même manière qu'une table interne. Pour plus d'informations, consultez Facturation SQL standard. Le traitement du contenu des données non structurées provenant d'OSS est facturé comme une table externe. Pour plus d'informations, consultez Facturation SQL pour les tables externes.
Dans un plan de facturation par abonnement, vous utilisez des ressources d'abonnement prépayées. Pour plus d'informations, consultez Frais de calcul (abonnement).
Créer une table d'objets
Syntaxe
CREATE OBJECT TABLE [IF NOT EXISTS] <objecttable_name>
WITH SERDEPROPERTIES ('<key>' = '<value>')
LOCATION '<location>'
[TBLPROPERTIES ('<key>' = '<value>')]
[COMMENT '<comment>']
;
Les tables d'objets doivent être utilisées dans un projet ayant les schémas activés, et vous devez activer l'option de syntaxe de schéma.
Il n'est pas nécessaire de définir des colonnes pour une table d'objets, car ses colonnes de métadonnées sont fournies par le système.
Paramètres
Paramètre | Obligatoire | Description |
objecttable_name | Oui | Le nom de la table. |
SERDEPROPERTIES ('<key>'='<value>') | Oui | Spécifie les propriétés du sérialiseur-désérialiseur (SerDe). Vous pouvez spécifier un rôle RAM pour l'autorisation en définissant la clé Exemple : Avant d'utiliser cette fonctionnalité, assurez-vous d'avoir effectué l'autorisation en un clic pour
Remarque L'autorisation en un clic n'est possible que si le propriétaire du projet MaxCompute et le propriétaire du compte OSS sont identiques. |
location | Oui |
|
TBLPROPERTIES ('<key>'='<value>') | Non |
|
comment | Non | Un commentaire pour la table. |
Exemple
SET odps.namespace.schema=true;
CREATE OBJECT TABLE ot_demo_day
WITH serdeproperties (
'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole')
LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/';
Consulter les propriétés d'une table d'objets
Syntaxe
DESC <object_table_name>
Paramètres
object_table_name : Obligatoire. Nom de la table.
Exemple
SET odps.namespace.schema=true;
DESC ot_demo_day;
Le résultat suivant est renvoyé :
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$****@test.aliyunid.com |
| Project: test_objecttable |
| Schema: default |
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2024-09-02 20:01:56 |
| LastDDLTime: 2024-09-02 20:01:56 |
| LastModifiedTime: 2024-09-02 20:01:56 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| key | varchar(2048) | | The name of the object. |
| size | bigint | | The size of the returned object in bytes. |
| type | varchar(32) | | The type of the object and valid values: Normal, Multipart, Appendable, and Symlink. |
| last_modified | timestamp | | The last modified time of the object. |
| storage_class | varchar(32) | | The storage class of the object. |
| etag | varchar(64) | | The entity tag (ETag). When an object is created, an ETag is created to identify the content of the object. |
| restore_info | varchar(256) | | The restoration status of the object. |
| owner_id | bigint | | The ID of the bucket owner. |
| owner_display_name | varchar(256) | | The display name of the bucket owner. |
+------------------------------------------------------------------------------------+
Le tableau ci-dessous décrit les colonnes clés du résultat.
Paramètre | Type | Valeur NULL autorisée | Description |
key | VARCHAR(2048) La contrainte de longueur dans OSS est de 1 023 caractères. Pour plus d'informations, consultez les règles et exemples de dénomination des objets OSS. | Faux | Chemin relatif de l'objet au sein de la table d'objets. |
size | BIGINT | Faux | Taille de l'objet en octets. |
type | VARCHAR(32) | Faux | Type de l'objet dans OSS : Normal, Multipart, Appendable ou Symlink. |
last_modified | TIMESTAMP_NTZ | Faux | Date de dernière modification des données de l'objet dans OSS. |
storage_class | VARCHAR(32) | Faux | Classe de stockage de l'objet dans OSS. Pour obtenir la liste des classes de stockage, consultez les classes de stockage. |
etag | VARCHAR(64) | Faux | L'ETag est une balise d'entité générée pour un objet. Elle permet d'identifier si le contenu d'un objet a changé entre les mises à jour, mais ne constitue pas un identifiant unique. |
restore_info | VARCHAR(256) | Vrai | Indique si un objet a été restauré depuis le stockage froid. Si un objet est en cours de restauration, cette colonne fournit les informations pertinentes. |
owner_id | BIGINT | Vrai | ID du propriétaire de l'objet. |
owner_display_name | VARCHAR(256) | Vrai | Nom d'affichage du propriétaire de l'objet. |
Afficher l'instruction CREATE TABLE
Syntaxe
SHOW CREATE TABLE <object_table_name>;
Paramètres
object_table_name : Obligatoire. Nom de la table.
Exemple
SET odps.namespace.schema=true;
SHOW CREATE TABLE ot_demo_day;
Le résultat suivant est renvoyé :
CREATE OBJECT TABLE IF NOT EXISTS yunqi_object_****.`default`.ot_demo_day
WITH SERDEPROPERTIES (
'serialization.format'='1',
'odps.properties.rolearn'='acs:ram::139699392458****:role/aliyunodpsdefaultrole')
LOCATION
'oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/'
TBLPROPERTIES (
'last_modified_time'='1731478307',
'transient_lastDdlTime'='1731478307',
'metadata.cache.mode'='manual',
'metadata.staleness.seconds'='3600');
Actualiser les métadonnées d'une table d'objets
Les données réelles d'une table d'objets sont stockées dans OSS. MaxCompute met en cache les métadonnées de ces objets et utilise ce cache pour les requêtes et les calculs. Par conséquent, vous devez actualiser le cache avant d'utiliser une table d'objets. Vous pouvez actualiser les métadonnées manuellement ou configurer des actualisations périodiques lors de la création de la table.
Les actualisations manuelles et périodiques sont toutes deux des actualisations complètes.
Actualisation manuelle
Chaque actualisation effectue une synchronisation complète des métadonnées. Vous pouvez contrôler le moment et la fréquence de ces actualisations.
-
Syntaxe
ALTER TABLE <objecttable_name> REFRESH METADATA; -
Paramètres
objecttable_name : Obligatoire. Nom de la table.
-
Exemple
SET odps.namespace.schema=true; ALTER TABLE ot_demo_day REFRESH METADATA;
Actualisation périodique
Si les fichiers du répertoire OSS mappé par la table d'objets changent fréquemment, vous pouvez configurer des actualisations périodiques des métadonnées. Cela réduit les coûts de maintenance en spécifiant les paramètres pertinents lors de la création de la table.
-
Syntaxe
SET odps.namespace.schema=true; SET odps.sql.type.system.odps2 = true; CREATE OBJECT TABLE ot_demo_day WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole' ) location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/' tblproperties ( 'metadata.cache.mode' = 'periodic', 'metadata.staleness.seconds' = '3600' ); -
Paramètres
metadata.staleness.seconds: Intervalle d'actualisation. Ce paramètre est requis pour le modeperiodic. La valeur peut aller de[1, 604800], soit de 1 seconde à 1 semaine. Ce paramètre constitue une garantie de meilleure effort ; le planificateur tentera d'exécuter l'actualisation aussi près que possible de l'intervalle spécifié.-
metadata.cache.mode: Mode d'actualisation. Les options disponibles sont les suivantes :periodic: Déclenchement périodique.crontab: Actualisation planifiée.manual: Déclenchement manuel (par défaut). Vous pouvez contrôler le moment du déclenchement.
Actualisation planifiée
Si les fichiers du répertoire OSS mappé par la table d'objets changent fréquemment, vous pouvez planifier des actualisations de métadonnées. Cette approche réduit les coûts de maintenance en spécifiant les paramètres pertinents lors de la création de la table.
-
Syntaxe
SET odps.namespace.schema=true; SET odps.sql.type.system.odps2 = true; CREATE OBJECT TABLE ot_demo_day WITH SERDEPROPERTIES ( 'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole' ) LOCATION 'oss://oss-cn-region-internal.aliyuncs.com/odps-external-****/ottest/' TBLPROPERTIES ( 'metadata.cache.mode' = 'crontab', 'metadata.crontab.expression' = 'your_timed_expression' ); -
Paramètres
metadata.crontab.expression: expression cron définissant la planification. Par exemple, pour déclencher une actualisation tous les jours à 14 h 00, utilisez l'expression0 0 14 * * ?, ce qui signifie0seconde,0minute, heure14(14 h 00),chaquejour,chaquemois et?pour ne pas spécifier le jour de la semaine (exclusif avec le champ jour du mois afin d'éviter les conflits).-
metadata.cache.mode: mode d'actualisation. Les options disponibles sont les suivantes :crontab: actualisation planifiée.periodic: déclenchement périodique.manual: déclenchement manuel (par défaut). Vous contrôlez le moment du déclenchement.
Afficher les tâches d'actualisation
Exécutez la commande suivante pour consulter l'historique des tâches d'actualisation.
SHOW refresh task history FOR object TABLE <object_table_name>;
-
Paramètres
<object_table_name> doit correspondre à une table d'objets.
Valeurs renvoyées : ID de l'instance de la tâche d'actualisation (InstanceId), heure de création (CreateTime), heure de fin (EndTime) et statut (Status).
Si le statut est Failed, exécutez
wait InstanceId;pour afficher le journal et vérifier les détails de l'erreur.
-
Exemple
-- View the historical refresh tasks for the Object Table. SET odps.namespace.schema=true; SHOW refresh task history for object table ot_demo_day04; -- The following result is returned. ID = 20260105*******f +---------------------------------------------------------------------------------------------------+ | Project: test_project | | Schema: default | | Task: *** | +---------------------------------------------------------------------------------------------------+ | History: | +---------------------------------------------------------------------------------------------------+ | InstanceId | CreateTime | EndTime | Status | +---------------------------------------------------------------------------------------------------+ | 20260105******************ks | 2026-01-05 14:12:00 | 2026-01-05 14:12:04 | Terminated | | 20260105******************y3 | 2026-01-05 14:10:00 | 2026-01-05 14:10:03 | Terminated | +---------------------------------------------------------------------------------------------------+ OK
Interroger des tables d'objets
Une fois que la table d'objets a récupéré les métadonnées des fichiers depuis un répertoire OSS, interrogez la table pour parcourir ces métadonnées. Vous pouvez également utiliser des instructions SQL pour effectuer des calculs sur les métadonnées, tels que le filtrage, la mise en correspondance, les agrégations, les jointures, les fonctions de fenêtrage, ORDER BY et LIMIT.
Syntaxe
SELECT * FROM <object_table_name>;
Paramètres
object_table_name : obligatoire. Nom de la table.
Exemple
-- You can query the data uploaded to the specified OSS directory. If the amount of data is large, you can limit the result to five rows.
SET odps.namespace.schema=true;
SELECT * FROM ot_demo_day [limit 5];
Supprimer une table d'objets
Une table d'objets met en cache les métadonnées utilisateur, ce qui consomme de l'espace de stockage et engendre des coûts. Si vous n'avez plus besoin des données mises en cache, supprimez la table d'objets. Vous pourrez recréer la table d'objets ultérieurement si nécessaire.
Syntaxe
DROP TABLE [IF EXISTS] <object_table_name>;
Paramètres
object_table_name : obligatoire. Nom de la table.
Exemple
SET odps.namespace.schema=true;
DROP TABLE IF EXISTS ot_demo_day;
FAQ
ODPS-0010000:System internal error
-
Symptôme
Le message d'erreur suivant s'affiche :
ODPS-0010000:System internal error - ActionHandler job failed with failinfo storage service worker error occured: common/io/oss/oss_file_system_cppsdk.cpp(919): OSSRequestException: Status: -50, RequestId: , ErrorCode: ClientError:-50, Message: E_HTTP_ERROR_CONN_REFUSED -
Cause
Vous avez utilisé un endpoint public pour OSS lors de la création de la table d'objets.
-
Solution
Lors de la création d'une table d'objets, le paramètre
locationdoit contenir un endpoint interne pouross_endpoint. Pour savoir comment obtenir l'endpoint interne, consultez la section Description des paramètres. Si l'erreur persiste après avoir remplacé l'adresse par un endpoint interne, contactez l'équipe de support technique MaxCompute en soumettant un ticket de support.
Échec de l'actualisation périodique
Symptôme
Vous avez défini des paramètres d'actualisation périodique lors de la création de la table d'objets. Toutefois, l'actualisation ne s'exécute pas lorsque l'intervalle est atteint.
Solution
Assurez-vous que le paramètre location utilisé pour créer la table d'objets spécifie un endpoint interne OSS. Pour plus d'informations sur la création d'une table d'objets, consultez la section Paramètres.