Cette rubrique explique comment importer des données depuis Tablestore (Open Table Service, anciennement OTS) vers MaxCompute afin de connecter facilement plusieurs sources de données.
Contexte
Tablestore est un service de stockage de données NoSQL basé sur le système distribué Apsara d'Alibaba Cloud. Ce service permet le stockage et l'accès en temps réel à de grands volumes de données structurées. Pour plus d'informations, consultez Documentation Tablestore.
L'utilisation conjointe de DataWorks et de MaxCompute permet de créer, rechercher, interroger, configurer, traiter et analyser visuellement des tables externes. Pour plus d'informations, consultez Tables externes.
Remarques d'utilisation
La connectivité réseau entre MaxCompute et Tablestore doit être garantie. Lors de l'accès aux données Tablestore depuis MaxCompute sur le cloud public, il est recommandé d'utiliser l'endpoint privé de Tablestore. Cet endpoint privé se termine par ots-internal.aliyuncs.com, par exemple tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com.
-
Les systèmes de types de données diffèrent entre Tablestore et MaxCompute. Le tableau suivant présente les correspondances entre les types pris en charge par ces deux services.
Type MaxCompute
Type Tablestore
STRING
STRING
BIGINT
INTEGER
DOUBLE
DOUBLE
BOOLEAN
BOOLEAN
BINARY
BINARY
L'attribut de clustering n'est pas pris en charge pour les tables externes Tablestore.
Prérequis
Vous disposez des permissions nécessaires pour accéder à Tablestore. Pour plus de détails sur l'autorisation, consultez Autorisation STS pour Tablestore.
Une instance, une table et des données Tablestore ont été créées. Pour plus d'informations, consultez Démarrage rapide pour le modèle de table large.
Création d'une table externe
MaxCompute offre la fonctionnalité de tables externes. Elles permettent d'importer des données depuis Tablestore vers le système de métadonnées de MaxCompute pour traitement. La section suivante détaille la procédure de création d'une table externe Tablestore.
Voici un exemple d'instruction CREATE EXTERNAL TABLE.
DROP TABLE IF EXISTS ots_table_external;
CREATE EXTERNAL TABLE IF NOT EXISTS ots_table_external
(
odps_orderkey bigint,
odps_orderdate string,
odps_custkey bigint,
odps_orderstatus string,
odps_totalprice double,
odps_createdate timestamp
)
STORED BY 'com.aliyun.odps.TableStoreStorageHandler'
WITH SERDEPROPERTIES (
'tablestore.columns.mapping'=':o_orderkey,:o_orderdate,o_custkey,o_orderstatus,o_totalprice',
'tablestore.table.name'='ots_tpch_orders',
'odps.properties.rolearn'='acs:ram::xxxxx:role/aliyunodpsdefaultrole',
'tablestore.read.mode'='permissive',
'tablestore.corrupt.column'='ColumnName',
'tablestore.timestamp.ticks.unit'='seconds',
'tablestore.column.odps_createdate.timestamp.ticks.unit'='millis',
'tablestore.table.put.row'='true'
)
LOCATION 'tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com';
Le tableau ci-dessous décrit les paramètres clés utilisés dans l'instruction de création de table précédente.
Paramètre | Obligatoire | Description |
com.aliyun.odps.TableStoreStorageHandler | Oui | Gestionnaire de stockage intégré à MaxCompute, utilisé pour traiter les données Tablestore. Il définit l'interaction entre MaxCompute et Tablestore, la logique associée étant implémentée par MaxCompute. |
tablestore.columns.mapping | Oui | Colonnes de la table Tablestore auxquelles MaxCompute doit accéder, incluant les colonnes de clé primaire et les colonnes d'attributs.
|
tablestore.table.name | Oui | Nom de la table Tablestore cible pour l'accès MaxCompute. Dans cet exemple, il s'agit de |
odps.properties.rolearn | Oui | ARN (Alibaba Cloud Resource Name) du rôle AliyunODPSDefaultRole dans RAM.
|
tablestore.timestamp.ticks.unit | Non | Paramètre temporel au niveau de la table. Il impose une unité de temps unique pour tous les champs de type INTEGER de la table externe. Valeurs valides :
|
tablestore.column.<col1_name>.timestamp.ticks.unit | Non | Paramètre temporel au niveau de la colonne. Il définit l'unité de temps pour une colonne spécifique de la table externe. Valeurs valides :
Remarque Si tablestore.timestamp.ticks.unit et tablestore.column.<col1_name>.timestamp.ticks.unit sont tous deux configurés, le paramètre tablestore.column.<col1_name>.timestamp.ticks.unit est prioritaire. |
tablestore.table.put.row | Non | Définit le mode d'écriture de l'opération PutRow. Valeurs valides :
Remarque Le paramètre flag suivant permet de spécifier le mode d'écriture de l'opération PutRow. Sa valeur par défaut est False. Pour plus d'informations, consultez Liste des paramètres flag. |
tablestore.read.mode | Non | Détermine le comportement de lecture lorsque MaxCompute détecte des données corrompues dans la table externe Tablestore. Valeurs valides :
Pour des exemples de traitement des données corrompues, consultez Tables externes Tablestore. |
tablestore.corrupt.column | Non | Indique la colonne destinée à recevoir les données corrompues.
Pour des exemples de traitement des données corrompues, consultez Tables externes Tablestore. |
LOCATION | Oui | Spécifie les informations relatives à Tablestore, telles que le nom et l'endpoint de l'instance. Une autorisation RAM ou Security Token Service (STS) est indispensable pour garantir un accès sécurisé aux données Tablestore. Remarque Si l'utilisation de l'endpoint public génère une erreur signalant une incohérence des types de réseau, basculez vers le réseau classique. |
Exécutez l'instruction suivante pour consulter la structure de la table externe créée :
DESC extended <table_name>;
Le résultat d'exécution contient une section Extended Info qui regroupe les informations de base de la table externe, les détails du gestionnaire de stockage ainsi que l'emplacement de la table.
Interrogation des données de la table externe
Une fois la table externe créée, exécutez une instruction SQL MaxCompute pour accéder aux données Tablestore via cette table. Exemple :
SELECT odps_orderkey, odps_orderdate, SUM(odps_totalprice) AS sum_total
FROM ots_table_external
WHERE odps_orderkey > 5000 AND odps_orderkey < 7000 AND odps_orderdate >= '1996-05-03' AND odps_orderdate < '1997-05-01'
GROUP BY odps_orderkey, odps_orderdate
HAVING sum_total> 400000.0;
Lors de l'interrogation de tables ou de champs externes, les noms ne sont pas sensibles à la casse et aucune conversion forcée entre majuscules et minuscules n'est prise en charge.
L'accès aux données Tablestore via des instructions SQL MaxCompute implique que toutes les opérations, y compris la sélection des noms de colonnes, s'exécutent dans MaxCompute. Dans l'exemple précédent, les colonnes utilisées sont odps_orderkey et odps_totalprice plutôt que la colonne de clé primaire o_orderkey et la colonne d'attribut o_totalprice de la table Tablestore. Cela s'explique par les mappages définis dans l'instruction DDL de création de la table externe. Vous pouvez également conserver les noms originaux des colonnes de clé primaire et d'attributs de la table Tablestore selon vos besoins.
Pour effectuer plusieurs calculs sur un même jeu de données, importez-les depuis Tablestore vers une table interne MaxCompute. Ainsi, vous évitez de relire systématiquement les données depuis Tablestore pour chaque traitement MaxCompute. Exemple :
CREATE TABLE internal_orders AS
SELECT odps_orderkey, odps_orderdate, odps_custkey, odps_totalprice
FROM ots_table_external
WHERE odps_orderkey > 5000 ;
La table internal_orders est une table MaxCompute qui bénéficie de toutes les fonctionnalités d'une table interne. Elle utilise un stockage en colonnes compressé efficacement et contient des macro-données internes complètes ainsi que des informations statistiques. Étant stockée directement dans MaxCompute, l'accès à la table internal_orders est plus rapide qu'à une table Tablestore. Cette approche convient particulièrement aux données nécessitant des calculs répétés.
Exportation de données de MaxCompute vers Tablestore
MaxCompute ne crée pas automatiquement la table Tablestore de destination. Avant toute exportation, assurez-vous que la table cible existe déjà, faute de quoi une erreur sera générée.
Une table externe nommée ots_table_external a été créée pour permettre à MaxCompute d'accéder à la table ots_tpch_orders dans Tablestore. Les données sont stockées dans une table interne MaxCompute appelée internal_orders. Pour traiter les données de la table internal_orders puis écrire les résultats dans Tablestore, exécutez l'instruction insert overwrite table sur la table externe. Exemple :
INSERT OVERWRITE TABLE ots_table_external
SELECT odps_orderkey, odps_orderdate, odps_custkey, CONCAT(odps_custkey, 'SHIPPED'), CEIL(odps_totalprice)
FROM internal_orders;
Si les données de la table interne MaxCompute sont triées par clés primaires, elles seront écrites dans une seule partition de la table Tablestore, empêchant ainsi l'exploitation optimale des écritures distribuées. Dans ce cas, utilisez distribute by rand() pour répartir aléatoirement les données. Exemple :
INSERT OVERWRITE TABLE ots_table_external
SELECT odps_orderkey, odps_orderdate, odps_custkey, CONCAT(odps_custkey, 'SHIPPED'), CEIL(odps_totalprice)
FROM (SELECT * FROM internal_orders DISTRIBUTE BY rand()) t;
Tablestore étant un service de stockage NoSQL organisé en paires clé-valeur, les sorties de données depuis MaxCompute n'affectent que les lignes correspondant aux clés primaires de la table Tablestore. Dans cet exemple, seules les lignes contenant odps_orderkey et odps_orderdate sont impactées. Seules les colonnes d'attributs spécifiées lors de la création de la table ots_table_external sont mises à jour ; les colonnes absentes de la table externe restent inchangées.
-
L'écriture simultanée de données depuis MaxCompute vers Tablestore peut échouer si le volume dépasse 4 Mo. Supprimez alors les données excédentaires avant de retenter l'écriture.
ODPS-0010000:System internal error - Output to TableStore failed with exception: TableStore BatchWrite request id XXXXX failed with error code OTSParameterInvalid and message:The total data size of BatchWriteRow request exceeds the limit L'écriture simultanée ou ligne par ligne de plusieurs entrées de données compte comme une opération unique. Pour plus d'informations, consultez BatchWriteRow. Pour écrire de grands volumes de données en une seule fois, privilégiez l'écriture ligne par ligne.
-
Lors de l'écriture simultanée de plusieurs entrées, veillez à ne pas inclure de lignes en double. La présence de doublons peut provoquer l'erreur suivante :
ErrorCode: OTSParameterInvalid, ErrorMessage: The input parameter is invalidPour plus d'informations, consultez Erreur OTSParameterInvalid lors de l'utilisation de BatchWriteRow pour soumettre 100 entrées de données simultanément.
Tablestore étant un service de stockage clé-valeur, l'utilisation de
insert overwrite tablepour écrire dans une table Tablestore n'efface pas intégralement le contenu de la table cible. Seules les valeurs associées aux clés correspondantes de la table source sont écrasées.
Exemples de traitement des données corrompues
-
Créez une table Tablestore nommée
mf_ots_testet préparez les données. Pour plus d'informations, consultez Démarrage rapide pour le modèle de table large.Le code suivant illustre les données par défaut de la table Tablestore.
+----+-----------+---------------------------+ | id | name | desc | +----+-----------+---------------------------+ | 1 | Zhang San | Zhang San's description | +----+-----------+---------------------------+ -
Créez une table externe MaxCompute.
CREATE EXTERNAL TABLE IF NOT EXISTS mf_ots_external_permi ( id string, name bigint, desc string, corrupt_col string ) STORED BY 'com.aliyun.odps.TableStoreStorageHandler' WITH SERDEPROPERTIES ( 'tablestore.columns.mapping'=':id,name,desc', 'tablestore.table.name'='mf_ots_test', 'tablestore.read.mode'='permissive', 'tablestore.corrupt.column'='corrupt_col', 'odps.properties.rolearn'='acs:ram::139699392458****:role/aliyunodpsdefaultrole' ) LOCATION 'tablestore://santie-doc.cn-shanghai.ots-internal.aliyuncs.com'; -
Exécutez le code suivant pour interroger les données de la table externe MaxCompute :
-- Query data SELECT * FROM mf_ots_external_permi;Le résultat suivant est retourné. Le champ d'erreur est inscrit dans la colonne
corrupt_colau format JSON.+------------+------------+--------------------------+------------------------+ | id | name | desc | corrupt_col | +------------+------------+--------------------------+------------------------+ | 1 | NULL | Description of Zhang San | {"name": "\"Zhang San\""} | +------------+------------+--------------------------+------------------------+RemarqueSi tablestore.read.mode n'est pas configuré ou est défini sur permissive sans que tablestore.corrupt.column ne précise la colonne de destination des données corrompues, l'interrogation de la table externe renvoie le message d'erreur
"Columns not match with columns mapping and corrupt column".
FAQ
Comment résoudre les problèmes de lenteur des tâches SQL sur les tables externes Tablestore ?
-
Requêtes lentes sur les tables externes Tablestore
-
Symptôme
Les requêtes sur une table externe Tablestore manquent de rapidité. Pour les mêmes données métier, une copie est écrite en temps réel dans Tablestore tandis qu'une autre est planifiée dans MaxCompute. Bien que les schémas de table et les volumes de données soient identiques, une requête sur la table interne MaxCompute s'avère nettement plus rapide que sur la table externe Tablestore.
-
Solution
Ce problème survient généralement lors de l'exécution de multiples calculs sur un même jeu de données. Plutôt que de lire systématiquement les données depuis Tablestore pour chaque requête, importez les données nécessaires dans une table interne MaxCompute, puis exécutez vos requêtes sur cette table interne pour gagner en efficacité.
-
-
Recherche de données lente sur les tables externes MaxCompute via un SDK
-
Symptôme
Les recherches de données dans une table externe MaxCompute effectuées à l'aide d'un kit de développement logiciel (SDK) présentent des latences importantes.
-
Solution
Les tables externes ne prenant en charge que les analyses complètes de table, cela peut entraîner des baisses de performance. Privilégiez l'utilisation d'une table interne MaxCompute.
-