AnalyticDB for MySQL prend en charge l'importation de données externes via des tables externes. Cette rubrique explique comment utiliser ces tables pour importer des données depuis OSS vers un cluster AnalyticDB for MySQL.
Prérequis
Le cluster AnalyticDB for MySQL et le bucket OSS doivent se trouver dans la même région. Pour plus d'informations, consultez la rubrique Activer OSS.
Vous avez téléchargé les fichiers de données dans un répertoire OSS.
-
L'accès par interface réseau élastique (ENI) est activé pour votre cluster AnalyticDB for MySQL Data Warehouse Edition.
ImportantConnectez-vous à la console AnalyticDB for MySQL. Sur la page Cluster Information, sous la section Network Information, activez le commutateur du réseau ENI.
L'activation ou la désactivation du réseau ENI interrompt la connectivité à la base de données pendant environ 2 minutes, rendant les opérations de lecture et d'écriture indisponibles. Évaluez attentivement l'impact avant d'activer ou de désactiver le réseau ENI.
Préparation des données
Dans cet exemple, le fichier de données person.csv est téléchargé dans le répertoire testBucketName/adb/dt=2023-06-15 sur OSS. Le fichier utilise un saut de ligne comme délimiteur de ligne et une virgule (,) comme délimiteur de colonne. Le fichier person.csv contient les exemples de données suivants :
1,james,10,2023-06-15
2,bond,20,2023-06-15
3,jack,30,2023-06-15
4,lucy,40,2023-06-15
Procédure
Enterprise, basic, and data lakehouse editions
-
Accédez à l'éditeur SQL Development.
Connectez-vous à la console AnalyticDB for MySQL. Dans le coin supérieur gauche de la console, sélectionnez une région. Dans le volet de navigation de gauche, cliquez sur Clusters. Localisez le cluster à gérer et cliquez sur son ID.
Dans le volet de navigation de gauche, accédez à .
-
Importez les données.
Vous pouvez importer des données soit via l'importation standard (par défaut), soit via l'importation élastique. En mode d'importation standard, le système lit les données source depuis les nœuds de calcul et crée des index sur les nœuds de stockage, consommant ainsi des ressources de calcul et de stockage. La méthode d'importation élastique est prise en charge uniquement pour les clusters Enterprise Edition, Basic Edition, and Data Lakehouse Edition exécutant la version du noyau 3.1.10.0 ou ultérieure et disposant d'un groupe de ressources de type job. Pour plus d'informations, consultez la rubrique Méthodes d'importation des données.
Importation standard
-
Créez une base de données externe.
CREATE EXTERNAL DATABASE adb_external_db; -
Créez une table externe. Utilisez l'instruction CREATE EXTERNAL TABLE pour créer une table externe OSS dans la base de données externe
adb_external_db. Cet exemple utilise adb_external_db.person.RemarqueLa table externe AnalyticDB for MySQL doit avoir les mêmes noms de champs, nombre de champs, ordre des champs et types de données que le fichier source OSS.
Pour plus d'informations sur la syntaxe de création des tables externes OSS, consultez la rubrique CREATE EXTERNAL TABLE.
-
Interrogez les données.
Après avoir créé la table externe, vous pouvez exécuter une instruction SELECT dans AnalyticDB for MySQL pour interroger les données depuis OSS.
SELECT * FROM adb_external_db.person;Le résultat suivant est renvoyé :
+------+-------+------+-----------+ | id | name | age | dt | +------+-------+------+-----------+ | 1 | james | 10 |2023-06-15 | | 2 | bond | 20 |2023-06-15 | | 3 | jack | 30 |2023-06-15 | | 4 | lucy | 40 |2023-06-15 | +------+-------+------+-----------+ -
Créez une base de données dans AnalyticDB for MySQL. Si une base de données existe déjà, ignorez cette étape. Voici un exemple d'instruction :
CREATE DATABASE adb_demo; -
Créez une table dans AnalyticDB for MySQL pour stocker les données OSS importées. Voici un exemple d'instruction :
RemarqueLa table interne doit correspondre à la table externe de l'étape b en termes de noms de champs, de nombre de champs, d'ordre des champs et de types de données.
CREATE TABLE IF NOT EXISTS adb_demo.adb_import_test( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) DISTRIBUTED BY HASH(id); -
Importez les données dans la table.
-
Méthode 1 : Utilisez l'instruction
INSERT INTOpour importer les données. Si une valeur de clé primaire est dupliquée, les nouvelles données sont ignorées. Cela équivaut à utiliserINSERT IGNORE INTO. Pour plus d'informations, consultez la rubrique INSERT INTO.INSERT INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person; -
Méthode 2 : Utilisez l'instruction
INSERT OVERWRITE INTOpour importer les données de manière synchrone. Cette opération écrase les données existantes dans la table.INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person; -
Méthode 3 : Utilisez l'instruction
INSERT OVERWRITE INTOpour importer les données de manière asynchrone. Pour plus d'informations, consultez la rubrique Écriture asynchrone.SUBMIT JOB INSERT OVERWRITE adb_demo.adb_import_test SELECT * FROM adb_external_db.person;
-
Importation élastique
-
Créez une base de données. Si une base de données existe déjà, ignorez cette étape. Voici un exemple d'instruction :
CREATE DATABASE adb_demo; -
Créez une table externe.
RemarqueLa table externe AnalyticDB for MySQL doit avoir les mêmes noms de champs, nombre de champs, ordre des champs et types de données que le fichier source OSS.
L'importation élastique prend uniquement en charge la création de tables externes avec l'instruction
CREATE TABLE.
CREATE TABLE oss_import_test_external_table ( id INT(1023), name VARCHAR(1023), age INT, dt VARCHAR(1023) ) ENGINE='OSS' TABLE_PROPERTIES='{ "endpoint":"oss-cn-hangzhou-internal.aliyuncs.com", "url":"oss://testBucketName/adb/dt=2023-06-15/person.csv", "accessid":"accesskey_id", "accesskey":"accesskey_secret", "delimiter":"," }';ImportantLors de la création d'une table externe, les paramètres TABLE_PROPERTIES pris en charge varient selon le format de fichier (CSV, Parquet ou ORC) :
Format CSV : Seuls les paramètres
endpoint,url,accessid,accesskey,format,delimiter,null_value,maxlinelengthetpartition_columnsont pris en charge.Format Parquet : Seuls les paramètres
endpoint,url,accessid,accesskey,format,maxlinelengthetpartition_columnsont pris en charge.Format ORC : Seuls les paramètres
endpoint,url,accessid,accesskey,format,maxlinelengthetpartition_columnsont pris en charge.
Pour plus d'informations sur les paramètres configurables pour les tables externes et leurs descriptions, consultez les rubriques Tables externes OSS non partitionnées et Tables externes OSS partitionnées.
-
Interrogez les données.
Après la création de la table externe, vous pouvez exécuter une instruction SELECT dans AnalyticDB for MySQL pour interroger les données depuis OSS.
SELECT * FROM oss_import_test_external_table;Le résultat suivant est renvoyé :
+------+-------+------+-----------+ | id | name | age | dt | +------+-------+------+-----------+ | 1 | james | 10 |2023-06-15 | | 2 | bond | 20 |2023-06-15 | | 3 | jack | 30 |2023-06-15 | | 4 | lucy | 40 |2023-06-15 | +------+-------+------+-----------+ 4 rows in set (0.35 sec) -
Créez une table dans AnalyticDB for MySQL pour stocker les données OSS importées. Voici un exemple d'instruction :
RemarqueLa table interne doit correspondre à la table externe de l'étape b en termes de noms de champs, de nombre de champs, d'ordre des champs et de types de données.
CREATE TABLE adb_import_test ( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) DISTRIBUTED BY HASH(id); -
Importez les données.
ImportantL'importation élastique prend uniquement en charge l'importation de données via l'instruction
INSERT OVERWRITE INTO.-
Méthode 1 : Exécutez l'instruction INSERT OVERWRITE INTO pour importer les données de manière élastique, en écrasant les données existantes dans la table. Voici un exemple d'instruction :
/*+elastic_load=true, elastic_load_configs=[adb.load.resource.group.name=resource_group]*/ INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_demo.oss_import_test_external_table;
-
Méthode 2 : Exécutez de manière asynchrone l'instruction INSERT OVERWRITE INTO pour importer les données de manière élastique. Vous pouvez utiliser l'instruction
SUBMIT JOBpour soumettre une tâche asynchrone planifiée en arrière-plan./*+elastic_load=true, elastic_load_configs=[adb.load.resource.group.name=resource_group]*/ SUBMIT JOB INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_demo.oss_import_test_external_table;ImportantVous ne pouvez pas définir de file d'attente de priorité lors de la soumission asynchrone d'une tâche d'importation élastique.
Le résultat suivant est renvoyé :
+---------------------------------------+ | job_id | +---------------------------------------+ | 202308151719510210170190********** |
Après avoir soumis une tâche asynchrone via
SUBMIT JOB, le résultat renvoyé indique uniquement que la tâche a été soumise avec succès. Vous pouvez utiliser l'ID de tâche pour arrêter la tâche asynchrone ou interroger son statut afin de déterminer si elle a été exécutée correctement. Pour plus d'informations, consultez la rubrique Soumettre une tâche d'importation asynchrone.Paramètres Hint :
elastic_load : spécifie s'il faut utiliser l'importation élastique. Valeurs possibles : true et false. Valeur par défaut : false.
-
elastic_load_configs : paramètres de configuration de la fonctionnalité d'importation élastique. Vous devez placer les paramètres entre crochets ([ ]) et séparer plusieurs paramètres par des barres verticales (|). Le tableau suivant décrit les paramètres.
Paramètre
Obligatoire
Description
adb.load.resource.group.name
Oui
Nom du groupe de ressources de tâches qui exécute la tâche d'importation élastique.
adb.load.job.max.acu
Non
Quantité maximale de ressources pour une tâche d'importation élastique. Unité : unités de calcul AnalyticDB (ACU). Valeur minimale : 5 ACU. Valeur par défaut : nombre de shards plus 1.
Exécutez l'instruction suivante pour interroger le nombre de shards dans le cluster :
SELECT count(1) FROM information_schema.kepler_meta_shards;spark.driver.resourceSpec
Non
Type de ressource du pilote Spark. Valeur par défaut : small. Pour connaître les valeurs valides, consultez la colonne Type du tableau « Paramètres de configuration des applications Spark » de la rubrique relative aux paramètres de configuration Conf.
spark.executor.resourceSpec
Non
Type de ressource de l'exécuteur Spark. Valeur par défaut : large. Pour connaître les valeurs valides, consultez la colonne Type du tableau « Paramètres de configuration des applications Spark » de la rubrique relative aux paramètres de configuration Conf.
spark.adb.executorDiskSize
Non
Capacité du disque de l'exécuteur Spark. Valeurs valides : (0 100]. Unité : GiB. Valeur par défaut : 10 GiB. Pour plus d'informations, consultez la section « Spécifier les ressources du pilote et de l'exécuteur » de la rubrique relative aux paramètres de configuration Conf.
-
-
(Facultatif) Vérifiez si la tâche d'importation soumise est une tâche d'importation élastique.
SELECT job_name, (job_type = 3) AS is_elastic_load FROM INFORMATION_SCHEMA.kepler_meta_async_jobs where job_name = "2023081818010602101701907303151******";Le résultat suivant est renvoyé :
+---------------------------------------+------------------+ | job_name | is_elastic_load | +---------------------------------------+------------------+ | 20230815171951021017019072*********** | 1 | +---------------------------------------+------------------+Si la valeur de
is_elastic_loadest 1, la tâche d'importation soumise est une tâche d'importation élastique. Si la valeur est 0, il s'agit d'une tâche d'importation standard.
-
Data warehouse edition
-
Se connecter à un cluster et créer une base de données.
CREATE DATABASE adb_demo; -
Créez une table externe. Utilisez la syntaxe CREATE TABLE pour créer une table externe OSS au format CSV, Parquet ou ORC. Pour plus d'informations sur la syntaxe, consultez la rubrique Syntaxe des tables externes OSS.
Cette rubrique utilise une table externe non partitionnée au format CSV comme exemple.
CREATE TABLE IF NOT EXISTS oss_import_test_external_table ( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) ENGINE='OSS' TABLE_PROPERTIES='{ "endpoint":"oss-cn-hangzhou-internal.aliyuncs.com", "url":"oss://testBucketname/adb/dt=2023-06-15/person.csv", "accessid":"accesskey_id", "accesskey":"accesskey_secret", "delimiter":",", "skip_header_line_count":0, "charset":"utf-8" }'; -
Interrogez les données de la table externe
oss_import_test_external_table.RemarquePour les fichiers de données CSV, Parquet ou ORC, l'interrogation d'une grande table externe peut entraîner une surcharge importante des performances. Pour améliorer l'efficacité des requêtes, nous vous recommandons d'importer les données de la table externe OSS vers AnalyticDB for MySQL avant d'exécuter les requêtes, comme décrit aux étapes 4 et 5.
SELECT * FROM oss_import_test_external_table; -
Créez une table dans AnalyticDB for MySQL pour stocker les données importées depuis la table externe OSS.
CREATE TABLE IF NOT EXISTS adb_oss_import_test ( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) DISTRIBUTED BY HASH(id); -
Exécutez une instruction INSERT pour importer les données de la table externe OSS vers AnalyticDB for MySQL.
ImportantPar défaut, les opérations d'importation utilisant
INSERT INTOouINSERT OVERWRITE SELECTs'exécutent de manière synchrone. Pour les grands ensembles de données, tels que ceux de plusieurs centaines de gigaoctets, le client doit maintenir une connexion persistante au serveur AnalyticDB for MySQL pendant une longue période. Durant ce temps, des problèmes réseau peuvent interrompre la connexion et provoquer l'échec de l'importation. Par conséquent, pour les volumes de données importants, nous vous recommandons d'utiliserSUBMIT JOB INSERT OVERWRITE SELECTpour effectuer l'importation de manière asynchrone.-
Méthode 1 : Exécutez l'instruction
INSERT INTOpour importer les données. Si une clé primaire est dupliquée, l'opération d'écriture actuelle est ignorée et les données ne sont pas mises à jour. Ce comportement équivaut àINSERT IGNORE INTO. Pour plus d'informations, consultez la rubrique INSERT INTO. Voici un exemple d'instruction :INSERT INTO adb_oss_import_test SELECT * FROM oss_import_test_external_table; -
Méthode 2 : Exécutez l'instruction INSERT OVERWRITE pour importer les données, en écrasant les données existantes dans la table. Voici un exemple d'instruction :
INSERT OVERWRITE adb_oss_import_test SELECT * FROM oss_import_test_external_table; -
Méthode 3 : Exécutez de manière asynchrone l'instruction
INSERT OVERWRITEpour importer les données. Vous pouvez utiliserSUBMIT JOBpour soumettre une tâche asynchrone pour une planification en arrière-plan. Vous pouvez ajouter un hint (/*+ direct_batch_load=true*/) avant la tâche d'écriture pour accélérer celle-ci. Pour plus d'informations, consultez la rubrique Écriture asynchrone. Voici un exemple d'instruction :SUBMIT JOB INSERT OVERWRITE adb_oss_import_test SELECT * FROM oss_import_test_external_table;Le résultat suivant est renvoyé :
+---------------------------------------+ | job_id | +---------------------------------------+ | 2020112122202917203100908203303****** |Pour plus d'informations sur la soumission d'une tâche asynchrone, consultez Soumettre une tâche d'importation asynchrone.
-
Syntaxe des tables externes OSS
Enterprise, Basic, and Data Lakehouse
Pour obtenir des informations sur la syntaxe de création de tables externes OSS dans les éditions Enterprise Edition, Basic Edition et Data Lakehouse Edition, consultez Tables externes OSS.
Data Warehouse
Table externe OSS non partitionnée
CREATE TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
ENGINE='OSS'
TABLE_PROPERTIES='{
"endpoint":"endpoint",
"url":"OSS_LOCATION",
"accessid":"accesskey_id",
"accesskey":"accesskey_secret",
"format":"csv|orc|parquet|text
"delimiter|field_delimiter":";",
"skip_header_line_count":1,
"charset":"utf-8"
}';
Type de table externe | Paramètre | Obligatoire | Description |
Tables externes aux formats CSV, Parquet et ORC | ENGINE='OSS' | Oui | Moteur de la table. Définissez la valeur sur OSS. |
endpoint | Endpoint du bucket OSS. Actuellement, AnalyticDB for MySQL ne peut accéder à OSS que via un réseau VPC. Remarque Connectez-vous à la console OSS, cliquez sur le bucket cible et consultez l'Endpoint sur la page Overview du bucket. | ||
url | Chemin d'accès au fichier ou au répertoire OSS.
| ||
accessid | AccessKey ID d'un compte Alibaba Cloud ou d'un utilisateur RAM disposant des autorisations de gestion OSS. Pour savoir comment obtenir un AccessKey ID, consultez Comptes et autorisations. | ||
accesskey | AccessKey Secret d'un compte Alibaba Cloud ou d'un utilisateur RAM disposant des autorisations de gestion OSS. Pour obtenir un AccessKey Secret, consultez Comptes et autorisations. | ||
format | Conditionnellement obligatoire | Format du fichier.
| |
maxlinelength | Non | Valeur par défaut : 32768 (32 Ko). Si le fichier de données contient des lignes dépassant cette longueur, vous pouvez augmenter cette valeur. Exemple : | |
Tables externes aux formats CSV et Text | delimiter|field_delimiter | Oui | Délimiteur de colonne du fichier de données.
|
Tables externes au format CSV | null_value | Non | Définit ce qui représente une valeur Important Ce paramètre nécessite un cluster avec une version du noyau 3.1.4.2 ou ultérieure. |
ossnull | Définit la règle d'interprétation des valeurs
Remarque Les exemples précédents supposent que | ||
skip_header_line_count | Nombre de lignes à ignorer au début du fichier de données. Par exemple, si un fichier CSV possède une ligne d'en-tête, définissez ce paramètre sur 1 pour l'ignorer. La valeur par défaut est 0, ce qui indique qu'aucune ligne n'est ignorée. | ||
oss_ignore_quote_and_escape | Si la valeur est définie sur true, les guillemets et les caractères d'échappement dans les valeurs de champ sont ignorés. La valeur par défaut est false. Important Ce paramètre nécessite un cluster avec une version du noyau 3.1.4.2 ou ultérieure. | ||
charset | Jeu de caractères de la table externe OSS. Valeurs valides :
Important Ce paramètre nécessite un cluster avec une version du noyau 3.1.10.4 ou ultérieure. |
Les noms de colonnes dans l'instruction
CREATE TABLEde la table externe doivent être identiques aux noms de colonnes du fichier Parquet ou ORC, mais la casse n'est pas prise en compte. L'ordre des colonnes doit également être le même.Lors de la création d'une table externe, vous pouvez sélectionner uniquement certaines colonnes du fichier Parquet ou ORC pour les inclure dans la table externe. Les colonnes non sélectionnées ne sont pas importées.
Si l'instruction
CREATE TABLEde la table externe inclut une colonne qui n'existe pas dans le fichier Parquet ou ORC, les requêtes portant sur cette colonne renvoient NULL.
AnalyticDB for MySQL peut lire et écrire dans des fichiers Hive TEXT à l'aide d'une table externe OSS au format CSV. Utilisez l'instruction suivante pour créer la table :
CREATE TABLE adb_csv_hive_format_oss (
a tinyint,
b smallint,
c int,
d bigint,
e boolean,
f float,
g double,
h varchar,
i varchar, -- binary
j timestamp,
k DECIMAL(10, 4),
l varchar, -- char(10)
m varchar, -- varchar(100)
n date
) ENGINE = 'OSS' TABLE_PROPERTIES='{
"format": "csv",
"endpoint":"oss-cn-hangzhou-internal.aliyuncs.com",
"accessid":"accesskey_id",
"accesskey":"accesskey_secret",
"url":"oss://testBucketname/adb_data/",
"delimiter": "\\1",
"null_value": "\\\\N",
"oss_ignore_quote_and_escape": "true",
"ossnull": 2
}';
Tenez compte des points suivants lors de la création d'une table externe OSS au format CSV pour lire des fichiers Hive TEXT :
Le délimiteur de colonne par défaut pour les fichiers Hive TEXT est
\1. Lors de l'utilisation d'une table externe OSS au format CSV pour lire ou écrire ces fichiers, vous devez définir le paramètredelimitersur la valeur échappée\\1.La valeur
NULLpar défaut pour les fichiers Hive TEXT est\N. Lors de l'utilisation d'une table externe OSS au format CSV pour lire ou écrire ces fichiers, vous devez définir le paramètrenull_valuesur la valeur échappée\\\\N.Les autres types de données Hive de base, tels que
BOOLEAN, correspondent directement aux types de données AnalyticDB for MySQL. Toutefois, les typesBINARY,CHAR(n)etVARCHAR(n)correspondent tous au type AnalyticDB for MySQLVARCHAR.
Annexe : Mappings des types de données
Les types de données que vous spécifiez lors de la création d'une table doivent correspondre aux mappings indiqués dans les tableaux suivants. Pour le type
DECIMAL, la précision doit également correspondre.Les tables externes Parquet ne prennent pas en charge le type
STRUCT. Si vous utilisez ce type, la création de la table échoue.Les tables externes ORC ne prennent pas en charge les types complexes tels que
LIST,STRUCTetUNION. Si vous utilisez ces types, la création de la table échoue. Vous pouvez créer une table externe ORC contenant une colonne de typeMAP, mais les requêtes effectuées sur la table échoueront.
Mapping des types de données entre les fichiers Parquet et **AnalyticDB for MySQL**
Type primitif Parquet | Type logique Parquet | AnalyticDB for MySQL type |
BOOLEAN | Aucun | BOOLEAN |
INT32 | INT_8 | TINYINT |
INT32 | INT_16 | SMALLINT |
INT32 | Aucun | INT ou INTEGER |
INT64 | Aucun | BIGINT |
FLOAT | Aucun | FLOAT |
DOUBLE | Aucun | DOUBLE |
| DECIMAL | DECIMAL |
BINARY | UTF-8 |
|
INT32 | DATE | DATE |
INT64 | TIMESTAMP_MILLIS | TIMESTAMP ou DATETIME |
INT96 | Aucun | TIMESTAMP ou DATETIME |
Mapping des types de données des fichiers ORC vers **AnalyticDB for MySQL**
Type ORC | AnalyticDB for MySQL type |
BOOLEAN | BOOLEAN |
BYTE | TINYINT |
SHORT | SMALLINT |
INT | INT ou INTEGER |
LONG | BIGINT |
DECIMAL | DECIMAL |
FLOAT | FLOAT |
DOUBLE | DOUBLE |
|
|
TIMESTAMP | TIMESTAMP ou DATETIME |
DATE | DATE |
Mapping des types de données entre les fichiers Paimon et **AnalyticDB for MySQL**
|
Type Paimon |
AnalyticDB for MySQL type |
|
CHAR |
VARCHAR |
|
VARCHAR |
VARCHAR |
|
BOOLEAN |
BOOLEAN |
|
BINARY |
VARBINARY |
|
VARBINARY |
VARBINARY |
|
DECIMAL |
DECIMAL |
|
TINYINT |
TINYINT |
|
SMALLINT |
SMALLINT |
|
INT |
INTEGER |
|
BIGINT |
BIGINT |
|
FLOAT |
REAL |
|
DOUBLE |
DOUBLE |
|
DATE |
DATE |
|
TIME |
Non pris en charge |
|
TIMESTAMP |
TIMESTAMP |
|
LocalZonedTIMESTAMP |
TIMESTAMP (ignore les informations de fuseau horaire local) |
|
ARRAY |
ARRAY |
|
MAP |
MAP |
|
ROW |
ROW |