AnalyticDB for MySQL Data Warehouse Edition (V3.0) utilise des tables externes pour transférer des données entre AnalyticDB for MySQL et des systèmes de stockage externes. Cette rubrique explique comment exporter des données d'un cluster AnalyticDB for MySQL vers Apsara File Storage for HDFS à l'aide de tables externes.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
-
Un cluster AnalyticDB for MySQL exécutant la version mineure 3.1.4.4 ou ultérieure.
Pour vérifier la version mineure de votre cluster, consultez la rubrique Comment interroger la version d'un cluster AnalyticDB for MySQL ? Pour mettre à niveau la version mineure, contactez le support technique.
-
Un cluster Apsara File Storage for HDFS avec un dossier de destination pour les données exportées. Cet exemple utilise un dossier nommé
hdfs_output_test_csv_data.L'instruction
INSERT OVERWRITEsupprime tous les fichiers existants dans le dossier de destination avant d'écrire les nouvelles données. Pour éviter toute perte accidentelle de données, créez un nouveau dossier de destination pour chaque tâche d'exportation au lieu de réutiliser un dossier existant. -
Les ports d'accès aux services suivants sont configurés dans le cluster Apsara File Storage for HDFS pour autoriser l'accès depuis AnalyticDB for MySQL :
Nœud Objectif Port par défaut Paramètre de configuration Référence NameNode Lecture et écriture des métadonnées du système de fichiers 8020 fs.defaultFScore-default.xml DataNode Lecture et écriture des données 50010 dfs.datanode.addresshdfs-default.xml Pour les clusters en mode élastique : ENI activé sur la page Cluster Information sous Network Information.

Notes d'utilisation
Seuls les fichiers CSV et Parquet peuvent être exportés. Le format ORC n'est pas pris en charge.
Les instructions
INSERT INTO VALUESetREPLACE INTO VALUESne sont pas prises en charge pour les tables externes. Utilisez plutôtINSERT INTO ... SELECTouREPLACE INTO ... SELECT.Toutes les colonnes de la table externe doivent être incluses dans l'exportation. L'exportation d'un sous-ensemble de colonnes n'est pas prise en charge.
Les tables externes partitionnées ne peuvent pas exporter des fichiers individuels ; les données sont toujours distribuées dans les répertoires de partition.
Les valeurs des colonnes de partition sont stockées sous forme de noms de répertoire HDFS, et non en tant que colonnes dans les fichiers de données exportés. Par exemple, si vous exportez vers
adb_data/avec les colonnes de partitionp1=1etp2=a, les données sont placées dansadb_data/p1=1/p2=a/. Le fichier CSV ou Parquet exporté contient uniquement les colonnes non partitionnées.
Exporter des données vers Apsara File Storage for HDFS
Étape 1 : Se connecter au cluster AnalyticDB for MySQL
Connectez-vous au cluster. Pour plus de détails, consultez la rubrique Connexion à un cluster AnalyticDB for MySQL.
Étape 2 : Créer une base de données source et une table
Cet exemple utilise une base de données nommée adb_demo comme source.
Créez la base de données source. Pour plus de détails, consultez la rubrique Créer une base de données.
-
Créez une table source nommée
adb_hdfs_import_sourcedansadb_demo:CREATE TABLE IF NOT EXISTS adb_hdfs_import_source ( uid string, other string ) DISTRIBUTED BY HASH(uid); -
Insérez des données de test :
INSERT INTO adb_hdfs_import_source VALUES ("1", "a"), ("2", "b"), ("3", "c");
Étape 3 : Créer une table externe
Créez une table externe dans adb_demo qui mappe le dossier de destination dans Apsara File Storage for HDFS. AnalyticDB for MySQL prend en charge deux types de tables externes : standard et partitionnée.
Table externe standard
Une table externe standard exporte toutes les données dans un seul répertoire sans sous-répertoires de partition. Les exemples suivants montrent comment créer une table externe standard pour les formats CSV et Parquet.
Format CSV :
CREATE TABLE IF NOT EXISTS hdfs_import_external
(
uid string,
other string
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"format":"csv",
"delimiter":",",
"hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_output_test_csv_data"
}';
Format Parquet :
CREATE TABLE IF NOT EXISTS hdfs_import_external
(
uid string,
other string
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"format":"parquet",
"hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_output_test_csv_data"
}';
Table externe partitionnée
Une table externe partitionnée organise les données exportées dans des sous-répertoires de partition en fonction des valeurs des colonnes de partition. Définissez à la fois les colonnes ordinaires (telles que uid et other) et les colonnes de partition (telles que p1, p2 et p3) dans l'instruction CREATE TABLE.
CREATE TABLE IF NOT EXISTS hdfs_import_external_par
(
uid string,
other string,
p1 date,
p2 int,
p3 varchar
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"format":"csv",
"delimiter":",",
"hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_output_test_csv_data",
"partition_column":"p1, p2, p3"
}';
Pour la syntaxe complète, consultez les sections Créer une table externe Apsara File Storage for HDFS et Créer une table externe partitionnée Apsara File Storage for HDFS de la rubrique Utiliser des tables externes pour importer des données dans Data Warehouse Edition.
Étape 4 : Exporter des données
Utilisez l'une des méthodes d'exportation décrites dans les annexes pour exécuter une tâche d'exportation :
Étapes suivantes
Une fois l'exportation terminée, vérifiez les données de l'une des deux manières suivantes :
Utilisez le client Hadoop pour parcourir le dossier de destination
hdfs_output_test_csv_data.-
Interrogez les données exportées depuis AnalyticDB for MySQL via la table externe. La syntaxe de requête est identique pour les tables externes standard et partitionnées :
SELECT * FROM hdfs_import_external LIMIT 100;
Annexe 1 : Méthodes d'exportation pour les tables externes standard
Les tables externes standard prennent en charge quatre méthodes d'exportation. Toutes les méthodes exigent que chaque colonne de la table externe soit incluse dans l'instruction SELECT.
| Méthode | Instruction | Comportement |
|---|---|---|
| Ajout | INSERT INTO |
Ajoute un nouveau fichier au répertoire de destination. Les fichiers existants ne sont pas écrasés. |
| Ajout (équivalent) | REPLACE INTO |
Comportement identique à INSERT INTO pour les tables externes. Les tables externes n'ayant pas de clés primaires, il n'y a pas de déduplication. |
| Écrasement | INSERT OVERWRITE |
Supprime tous les fichiers existants dans le répertoire de destination, puis écrit les nouvelles données. À utiliser avec précaution. |
| Écrasement asynchrone | SUBMIT JOB INSERT OVERWRITE |
Identique à l'écrasement, mais s'exécute de manière asynchrone. Renvoie un ID de tâche pour le suivi de l'état. |
INSERT INTO
Chaque exécution ajoute un nouveau fichier au répertoire de destination HDFS sans supprimer les fichiers existants.
Syntaxe :
INSERT INTO <target_table>
SELECT <col_name> FROM <source_table>;
Exemple :
INSERT INTO hdfs_import_external
SELECT col1, col2, col3 FROM adb_hdfs_import_source;
col1, col2, col3 représentent toutes les colonnes de la table externe.
REPLACE INTO
Équivalent à INSERT INTO pour les tables externes HDFS. Les tables externes n'ayant pas de clés primaires, REPLACE INTO ajoute un nouveau fichier au répertoire de destination au lieu de remplacer les lignes.
Syntaxe :
REPLACE INTO <target_table>
SELECT <col_name> FROM <source_table>;
Exemple :
REPLACE INTO hdfs_import_external
SELECT col1, col2, col3 FROM adb_hdfs_import_source;
INSERT OVERWRITE
Supprime tous les fichiers du répertoire de destination avant d'écrire les nouvelles données.
Cette opération ne peut pas être annulée. Tous les fichiers existants dans le chemin de la table externe sont définitivement supprimés.
Syntaxe :
INSERT OVERWRITE <target_table>
SELECT <col_name> FROM <source_table>;
Exemple :
INSERT OVERWRITE hdfs_import_external
SELECT col1, col2, col3 FROM adb_hdfs_import_source;
SUBMIT JOB INSERT OVERWRITE (asynchrone)
Exécute l'exportation par écrasement de manière asynchrone et renvoie immédiatement un ID de tâche. Utilisez cette méthode pour les exportations volumineuses qui bloqueraient autrement la session.
Syntaxe :
SUBMIT JOB INSERT OVERWRITE <target_table>
SELECT <col_name> FROM <source_table>;
Exemple :
SUBMIT JOB INSERT OVERWRITE hdfs_import_external
SELECT col1, col2, col3 FROM adb_hdfs_import_source;
L'ID de tâche renvoyé identifie la tâche asynchrone :
+---------------------------------------+
| job_id |
+---------------------------------------+
| 2020112122202917203100908203303****** |
+---------------------------------------+
Pour vérifier l'état de la tâche, consultez la rubrique Soumettre une tâche d'importation de manière asynchrone.
Annexe 2 : Méthodes d'exportation pour les tables externes partitionnées
Lors de l'utilisation d'une table externe partitionnée, incluez une clause PARTITION dans l'instruction pour spécifier les valeurs des colonnes de partition. Les valeurs de partition peuvent être entièrement statiques, statiques-dynamiques ou entièrement dynamiques.
Toutes les méthodes exigent que chaque colonne non partitionnée de la table externe soit incluse dans l'instruction SELECT.
| Méthode | Instruction | Comportement |
|---|---|---|
| Ajout | INSERT INTO PARTITION |
Ajoute un nouveau fichier au répertoire de partition correspondant. Les fichiers existants ne sont pas écrasés. |
| Ajout (équivalent) | REPLACE INTO PARTITION |
Comportement identique à INSERT INTO PARTITION pour les tables externes. |
| Écrasement | INSERT OVERWRITE PARTITION |
Écrase les données existantes uniquement dans les répertoires de partition spécifiés. Les partitions non concernées restent inchangées. |
| Écrasement asynchrone | SUBMIT JOB INSERT OVERWRITE |
Identique à l'écrasement, mais s'exécute de manière asynchrone. |
INSERT INTO PARTITION
Chaque exécution ajoute un nouveau fichier au répertoire de partition correspondant.
Partition entièrement statique — toutes les valeurs de partition sont spécifiées explicitement :
INSERT INTO <target_table> PARTITION(par1=val1, par2=val2, ...)
SELECT <col_name> FROM <source_table>;
Exemple :
INSERT INTO hdfs_import_external_par PARTITION(p1='2021-05-06', p2=1, p3='test')
SELECT col1, col2, col3 FROM adb_hdfs_import_source;
Partition statique-dynamique — certaines valeurs de partition sont statiques, tandis que d'autres sont dérivées du résultat de la requête :
Les colonnes de partition statiques doivent apparaître avant les colonnes de partition dynamiques dans la clause PARTITION .
INSERT INTO <target_table> PARTITION(par1=val1, par2, ...)
SELECT <col_name> FROM <source_table>;
Exemple :
INSERT INTO hdfs_import_external_par PARTITION(p1='2021-05-27', p2, p3)
SELECT col1, col2, col3 FROM adb_hdfs_import_source;
Partition entièrement dynamique — les valeurs de partition sont dérivées du résultat de la requête ; aucune clause PARTITION n'est nécessaire :
INSERT INTO <target_table>
SELECT <col_name> FROM <source_table>;
Exemple :
INSERT INTO hdfs_import_external_par
SELECT col1, col2, col3 FROM adb_hdfs_import_source;
REPLACE INTO PARTITION
Équivalent à INSERT INTO PARTITION pour les tables externes HDFS. Les tables externes n'ayant pas de clés primaires, REPLACE INTO PARTITION ajoute un nouveau fichier au lieu de remplacer les lignes.
Partition entièrement statique :
REPLACE INTO <target_table> PARTITION(par1=val1, par2=val2, ...)
SELECT <col_name> FROM <source_table>;
Exemple :
REPLACE INTO hdfs_import_external_par PARTITION(p1='2021-05-06', p2=1, p3='test')
SELECT col1, col2, col3 FROM adb_hdfs_import_source;
Partition statique-dynamique :
Les colonnes de partition statiques doivent apparaître avant les colonnes de partition dynamiques dans la clause PARTITION .
REPLACE INTO <target_table> PARTITION(par1=val1, par2, ...)
SELECT <col_name> FROM <source_table>;
Exemple :
REPLACE INTO hdfs_import_external_par PARTITION(p1='2021-05-06', p2, p3)
SELECT col1, col2, col3 FROM adb_hdfs_import_source;
Partition entièrement dynamique :
REPLACE INTO <target_table>
SELECT <col_name> FROM <source_table>;
Exemple :
REPLACE INTO hdfs_import_external_par
SELECT col1, col2, col3 FROM adb_hdfs_import_source;
INSERT OVERWRITE PARTITION
Écrase les données existantes dans les répertoires de partition spécifiés. Les partitions non couvertes par l'instruction ne sont pas affectées. La clause optionnelle IF NOT EXISTS ignore les partitions contenant déjà des données.
Cette opération ne peut pas être annulée. Les données existantes dans les partitions ciblées sont définitivement supprimées.
Syntaxe :
INSERT OVERWRITE <target_table> PARTITION(par1=val1, par2=val2, ...) [IF NOT EXISTS]
SELECT <col_name> FROM <source_table>;
Exemple :
INSERT OVERWRITE hdfs_import_external_par PARTITION(p1='2021-05-06', p2=1, p3='test') IF NOT EXISTS
SELECT col1, col2, col3 FROM adb_hdfs_import_source;
IF NOT EXISTS empêche l'écriture de données dans une partition qui contient déjà des données, laissant son contenu existant intact.
SUBMIT JOB INSERT OVERWRITE (asynchrone)
Exécute l'exportation par écrasement de partition de manière asynchrone et renvoie immédiatement un ID de tâche.
Syntaxe :
SUBMIT JOB INSERT OVERWRITE <target_table>
SELECT <col_name> FROM <source_table>;
Exemple :
SUBMIT JOB INSERT OVERWRITE hdfs_import_external_par PARTITION(p1='2021-05-06', p2=1, p3='test') IF NOT EXISTS
SELECT col1, col2, col3 FROM adb_hdfs_import_source;
L'ID de tâche renvoyé identifie la tâche asynchrone :
+---------------------------------------+
| job_id |
+---------------------------------------+
| 2020112122202917203100908203303****** |
+---------------------------------------+
Pour vérifier l'état de la tâche, consultez la rubrique Soumettre une tâche d'importation de manière asynchrone.