Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
UtilisationCTAS, INSERT INTO pour ETL et analyse des données
Vous pouvez utiliser Create Table as Select (CTAS) et INSERTINTOles instructions d'Athena pour extraire, transformer et charger (ETL) des données dans Amazon S3 à des fins de traitement des données. Cette rubrique montre comment utiliser ces instructions pour partitionner et convertir un jeu de données au format de données en colonnes, afin de l'optimiser pour l'analyse des données.
CTASles instructions utilisent SELECTdes requêtes standard pour créer de nouvelles tables. Vous pouvez utiliser une CTAS instruction pour créer un sous-ensemble de vos données à des fins d'analyse. Dans une CTAS instruction, vous pouvez partitionner les données, spécifier la compression et convertir les données dans un format en colonnes tel qu'Apache Parquet ou ApacheORC. Lorsque vous exécutez la CTAS requête, les tables et partitions qu'elle crée sont automatiquement ajoutées au AWS Glue Data Catalog
INSERTINTOles instructions insèrent de nouvelles lignes dans une table de destination sur la base d'une instruction de SELECT requête exécutée sur une table source. Vous pouvez utiliser INSERT INTO des instructions pour transformer et charger les données de la table source CSV au format dans les données de la table de destination en utilisant toutes les transformations prises CTAS en charge.
Présentation
Dans Athena, utilisez une CTAS instruction pour effectuer une première conversion par lots des données. Utilisez ensuite plusieurs INSERT INTO instructions pour apporter des mises à jour incrémentielles à la table créée par l'CTASinstruction.
Étapes
Étape 1 : créez une table basée sur le jeu de données d'origine
L'exemple présenté dans cette rubrique utilise un sous-ensemble lisible par Amazon S3 du jeu de données quotidien (GHCN-d) du réseau NOAA mondial de climatologie historique
Location: s3://aws-bigdata-blog/artifacts/athena-ctas-insert-into-blog/ Total objects: 41727 Size of CSV dataset: 11.3 GB Region: us-east-1
Les données d'origine sont stockées dans Simple Storage Service (Amazon S3) sans partitions. Les données sont CSV formatées dans des fichiers tels que les suivants.
2019-10-31 13:06:57 413.1 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0000 2019-10-31 13:06:57 412.0 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0001 2019-10-31 13:06:57 34.4 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0002 2019-10-31 13:06:57 412.2 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0100 2019-10-31 13:06:57 412.7 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0101
Les tailles de fichier dans cet échantillon sont relativement petites. En les fusionnant dans des fichiers plus grands, vous pouvez réduire le nombre total de fichiers, ce qui permet d'augmenter les performances des requêtes. Vous pouvez utiliser CTAS les INSERT INTO instructions and pour améliorer les performances des requêtes.
Pour créer une base de données et une table à partir de l'exemple de jeu de données
-
Dans la console Athena, choisissez Région AWSUSA Est (Virginie du Nord). Assurez-vous d'exécuter toutes les requêtes dans ce didacticiel dans
us-east-1
. -
Dans l'éditeur de requêtes Athena, exécutez la CREATEDATABASEcommande pour créer une base de données.
CREATE DATABASE blogdb
-
Exécutez l'instruction suivante pour créer une table.
CREATE EXTERNAL TABLE `blogdb`.`original_csv` ( `id` string, `date` string, `element` string, `datavalue` bigint, `mflag` string, `qflag` string, `sflag` string, `obstime` bigint) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://aws-bigdata-blog/artifacts/athena-ctas-insert-into-blog/'
Étape 2 : utilisation CTAS pour partitionner, convertir et compresser les données
Après avoir créé un tableau, vous pouvez utiliser une seule CTASinstruction pour convertir les données au format Parquet avec la compression Snappy et pour partitionner les données par année.
Le tableau que vous avez créé à l'Étape 1 comporte un champ date
dont la date est au format YYYYMMDD
(par exemple, 20100104
). Étant donné que la nouvelle table sera partitionnée par year
, l'exemple d'instruction de la procédure suivante utilise la fonction Presto substr("date",1,4)
pour extraire la valeur year
du champ date
.
Pour convertir les données au format parquet avec compression snappy, partitionnement par année
-
Exécutez l'CTASinstruction suivante, en remplaçant
your-bucket
avec l'emplacement de votre compartiment Amazon S3.CREATE table new_parquet WITH (format='PARQUET', parquet_compression='SNAPPY', partitioned_by=array['year'], external_location = 's3://amzn-s3-demo-bucket/optimized-data/') AS SELECT id, date, element, datavalue, mflag, qflag, sflag, obstime, substr("date",1,4) AS year FROM original_csv WHERE cast(substr("date",1,4) AS bigint) >= 2015 AND cast(substr("date",1,4) AS bigint) <= 2019
Note
Dans cet exemple, la table que vous créez inclut uniquement les données de 2015 à 2019. À l'étape 3, vous ajoutez de nouvelles données à cette table à l'aide de la INSERT INTO commande.
Lorsque la requête est terminée, utilisez la procédure suivante pour vérifier la sortie à l'emplacement Amazon S3 que vous avez spécifié dans l'CTASinstruction.
Pour voir les partitions et les fichiers de parquet créés par la CTAS déclaration
-
Pour afficher les partitions créées, exécutez la AWS CLI commande suivante. Assurez-vous d'inclure la barre oblique finale (/).
aws s3 ls s3://amzn-s3-demo-bucket/optimized-data/
Le résultat affiche les partitions.
PRE year=2015/ PRE year=2016/ PRE year=2017/ PRE year=2018/ PRE year=2019/
-
Pour afficher les fichiers Parquet, exécutez la commande suivante. Notez que l'option
|
head -5 qui limite la sortie aux cinq premiers résultats, n'est pas disponible sous Windows.aws s3 ls s3://amzn-s3-demo-bucket/optimized-data/ --recursive --human-readable | head -5
La sortie se présente comme suit :
2019-10-31 14:51:05 7.3 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_1be48df2-3154-438b-b61d-8fb23809679d 2019-10-31 14:51:05 7.0 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_2a57f4e2-ffa0-4be3-9c3f-28b16d86ed5a 2019-10-31 14:51:05 9.9 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_34381db1-00ca-4092-bd65-ab04e06dc799 2019-10-31 14:51:05 7.5 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_354a2bc1-345f-4996-9073-096cb863308d 2019-10-31 14:51:05 6.9 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_42da4cfd-6e21-40a1-8152-0b902da385a1
Étape 3 : INSERT INTO À utiliser pour ajouter des données
À l'étape 2, vous aviez CTAS l'habitude de créer une table avec des partitions pour les années 2015 à 2019. Toutefois, le jeu de données d'origine contient également des données pour les années 2010 à 2014. Vous pouvez maintenant ajouter ces données à l'aide d'une INSERTINTOinstruction.
Pour ajouter des données à la table à l'aide d'une ou de plusieurs INSERT INTO instructions
-
Exécutez la INSERT INTO commande suivante, en spécifiant les années antérieures à 2015 dans la WHERE clause.
INSERT INTO new_parquet SELECT id, date, element, datavalue, mflag, qflag, sflag, obstime, substr("date",1,4) AS year FROM original_csv WHERE cast(substr("date",1,4) AS bigint) < 2015
-
Exécutez à nouveau la commande
aws s3 ls
en utilisant la syntaxe suivante.aws s3 ls s3://amzn-s3-demo-bucket/optimized-data/
Le résultat affiche les nouvelles partitions.
PRE year=2010/ PRE year=2011/ PRE year=2012/ PRE year=2013/ PRE year=2014/ PRE year=2015/ PRE year=2016/ PRE year=2017/ PRE year=2018/ PRE year=2019/
-
Pour voir la réduction de la taille du jeu de données obtenue à l'aide de la compression et du stockage en colonnes au format Parquet, exécutez la commande suivante.
aws s3 ls s3://amzn-s3-demo-bucket/optimized-data/ --recursive --human-readable --summarize
Les résultats suivants montrent que la taille du jeu de données après Parquet avec compression Snappy est de 1,2 Go.
... 2020-01-22 18:12:02 2.8 MiB optimized-data/year=2019/20200122_181132_00003_nja5r_f0182e6c-38f4-4245-afa2-9f5bfa8d6d8f 2020-01-22 18:11:59 3.7 MiB optimized-data/year=2019/20200122_181132_00003_nja5r_fd9906b7-06cf-4055-a05b-f050e139946e Total Objects: 300 Total Size: 1.2 GiB
-
Si d'autres CSV données sont ajoutées à la table d'origine, vous pouvez les ajouter à la table en parquet à l'aide d'INSERTINTOinstructions. Par exemple, si vous disposez de nouvelles données pour l'année 2020, vous pouvez exécuter l'INSERTINTOinstruction suivante. L'instruction ajoute les données et la partition correspondante à la table
new_parquet
.INSERT INTO new_parquet SELECT id, date, element, datavalue, mflag, qflag, sflag, obstime, substr("date",1,4) AS year FROM original_csv WHERE cast(substr("date",1,4) AS bigint) = 2020
Note
L'INSERTINTOinstruction prend en charge l'écriture d'un maximum de 100 partitions dans la table de destination. Toutefois, pour ajouter plus de 100 partitions, vous pouvez exécuter plusieurs INSERT INTO instructions. Pour de plus amples informations, veuillez consulter Utilisez CTAS et INSERT INTO pour contourner la limite de 100 partitions.
Étape 4 : mesurez les différences de performance et de coûts
Après avoir transformé les données, vous pouvez mesurer les gains en termes de performance et d'économies en exécutant les mêmes requêtes sur les nouvelles tables et les anciennes, puis en comparant les résultats.
Note
Pour obtenir des informations sur les coûts par requête Athena, consultez la rubrique Tarification Amazon Athena
Mesurer les gains de performance et les différences de coûts
-
Exécutez la requête suivante sur la table d'origine. La requête trouve le nombre de caractères distincts IDs pour chaque valeur de l'année.
SELECT substr("date",1,4) as year, COUNT(DISTINCT id) FROM original_csv GROUP BY 1 ORDER BY 1 DESC
-
Notez la durée d'exécution de la requête et la quantité de données analysées.
-
Exécutez la même requête sur la nouvelle table, en notant le temps d'exécution de la requête et la quantité de données analysées.
SELECT year, COUNT(DISTINCT id) FROM new_parquet GROUP BY 1 ORDER BY 1 DESC
-
Comparez les résultats et calculez la différence de performance et de coût. Les exemples de résultats suivants montrent que la requête de test sur la nouvelle table a été plus rapide et moins chère que la requête sur l'ancienne table.
Tableau Environnement d’exécution Données analysées Original 16,88 secondes 11,35 Go New 3,79 secondes 428,05 Mo -
Exécutez l'exemple de requête suivant sur la table d'origine. La requête calcule la température maximale moyenne (Celsius), la température minimale moyenne (Celsius) et la pluviométrie moyenne (mm) pour la Terre en 2018.
SELECT element, round(avg(CAST(datavalue AS real)/10),2) AS value FROM original_csv WHERE element IN ('TMIN', 'TMAX', 'PRCP') AND substr("date",1,4) = '2018' GROUP BY 1
-
Notez la durée d'exécution de la requête et la quantité de données analysées.
-
Exécutez la même requête sur la nouvelle table, en notant le temps d'exécution de la requête et la quantité de données analysées.
SELECT element, round(avg(CAST(datavalue AS real)/10),2) AS value FROM new_parquet WHERE element IN ('TMIN', 'TMAX', 'PRCP') and year = '2018' GROUP BY 1
-
Comparez les résultats et calculez la différence de performance et de coût. Les exemples de résultats suivants montrent que la requête de test sur la nouvelle table a été plus rapide et moins chère que la requête sur l'ancienne table.
Tableau Environnement d’exécution Données analysées Original 18,65 secondes 11,35 Go New 1,92 secondes 68 Mo
Récapitulatif
Cette rubrique vous a montré comment effectuer des ETL opérations à l'aide des INSERT INTO instructions CTAS et dans Athena. Vous avez effectué la première série de transformations à l'aide d'une CTAS instruction qui a converti les données au format Parquet avec la compression Snappy. L'CTASinstruction a également converti l'ensemble de données non partitionné en jeu de données partitionné. Vous avez ainsi réduit sa taille et les coûts d'exécution des requêtes. Lorsque de nouvelles données sont disponibles, vous pouvez utiliser une INSERT INTO instruction pour transformer et charger les données dans la table que vous avez créée avec l'CTASinstruction.