Comment définir le nombre ou la taille des fichiers lorsque j'exécute une requête CTAS dans Athena ?

Dernière mise à jour : 08/09/2021

Je souhaite définir le nombre de fichiers ou la quantité de données par fichier lorsque j'exécute une requête CREATE TABLE AS SELECT (CTAS) dans Amazon Athena.

Résolution

Utilisez la mise en compartiments pour définir la taille ou le nombre de fichiers dans une requête CTAS.

Remarque : Les étapes suivantes utilisent le jeu de données publique Global Historical Climatology Network Daily (s3://noaa-ghcn-pds/csv.gz/) pour illustrer la solution. Pour plus d'informations sur ce jeu de données, consultez Accéder à plus de 200 ans de données sur le climat mondial à l'aide d'Amazon Athena et d'Amazon QuickSight. Ces étapes montrent comment examiner votre jeu de données, créer l'environnement, puis modifier le jeu de données :

  1. Modifiez le nombre de fichiers dans le jeu de données Amazon Simple Storage Service (Amazon S3).
  2. Définissez la taille approximative de chaque fichier.
  3. Convertissez le format de données et définissez la taille approximative du fichier.

Examiner le jeu de données

Exécutez l'AWS Command Line Interface (AWS CLI) suivante pour vérifier le nombre de fichiers et la taille du jeu de données :

Remarque : En cas d'erreurs lors de l'exécution des commandes AWS CLI, vérifiez que vous utilisez la version la plus récente de ces commandes.

aws s3 ls s3://noaa-ghcn-pds/csv.gz/ --summarize --recursive --human-readable

Le résultat doit être similaire à ce qui suit :

2019-11-30 01:58:05    3.3 KiB csv.gz/1763.csv.gz
2019-11-30 01:58:06    3.2 KiB csv.gz/1764.csv.gz
2019-11-30 01:58:06    3.3 KiB csv.gz/1765.csv.gz
2019-11-30 01:58:07    3.3 KiB csv.gz/1766.csv.gz
...
2019-11-30 02:05:43  199.7 MiB csv.gz/2016.csv.gz
2019-11-30 02:05:50  197.7 MiB csv.gz/2017.csv.gz
2019-11-30 02:05:54  197.0 MiB csv.gz/2018.csv.gz
2019-11-30 02:05:57  168.8 MiB csv.gz/2019.csv.gz

Total Objects: 257
Total Size: 15.4 GiB

Créer l'environnement

1.    Exécutez une instruction similaire à la suivante pour créer une table :

CREATE EXTERNAL TABLE historic_climate_gz(
  id string,
  yearmonthday int,
  element string,
  temperature int,
  m_flag string,
  q_flag string,
  s_flag string,
  obs_time int)
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY ','
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://noaa-ghcn-pds/csv.gz/'

2.    Exécutez la commande suivante pour tester la table :

SELECT * FROM historic_climate_gz LIMIT 10

La sortie affiche dix lignes du jeu de données. Une fois l'environnement créé, utilisez une ou plusieurs des méthodes suivantes pour modifier le jeu de données lorsque vous exécutez des requêtes CTAS.

Modifier le nombre de fichiers dans l'ensemble de données

Une bonne pratique consiste à compartimenter les données selon une colonne ayant une cardinalité élevée et des valeurs distribuées uniformément. Pour plus d'informations, consultez Mise en compartiment et partitionnement. Dans l’exemple suivant, nous utilisons le champ yearmonbirthday.

1.    Pour convertir le jeu de données en 20 fichiers, exécutez une instruction similaire à ce qui suit :

CREATE TABLE "historic_climate_gz_20_files"
WITH (
      external_location = 's3://awsexamplebucket/historic_climate_gz_20_files/',
      format = 'TEXTFILE',
      bucket_count=20,
      bucketed_by = ARRAY['yearmonthday']
     ) AS
SELECT * FROM historic_climate_gz

Remplacez les valeurs suivantes dans la requête :
external_location : emplacement Amazon S3 où Athena enregistre votre requête CTAS
format : format souhaité pour la sortie (par exemple, ORC, PARQUET, AVRO, JSON ou TEXTFILE)
bucket_count : nombre de fichiers souhaités (par exemple, 20)
bucketed_by : champ pour le hachage et la sauvegarde des données dans le compartiment (par exemple, yearmonthday)

2.    Exécutez la commande suivante pour confirmer que le compartiment contient le nombre de fichiers souhaité :

aws s3 ls s3://awsexamplebucket/historic_climate_gz_20_files/ --summarize --recursive --human-readable
Total Objects: 20
Total Size: 15.6 Gib

Définir la taille approximative de chaque fichier

1.    Déterminez le nombre de fichiers dont vous avez besoin pour atteindre la taille de fichier souhaitée. Par exemple, pour fractionner le jeu de données de 15,4 Go en fichiers de 2 Go, vous avez besoin de 8 fichiers (15,4 / 2 = 7,7, arrondis à 8).

2.    Exécutez une instruction similaire à ce qui suit :

CREATE TABLE "historic_climate_gz_2GB_files"
WITH (
      external_location = 's3://awsexamplebucket/historic_climate_gz_2GB_file/',
      format = 'TEXTFILE',
      bucket_count=8,
      bucketed_by = ARRAY['yearmonthday']) AS
SELECT * FROM historic_climate_gz

Remplacez les valeurs suivantes dans la requête :
external_location : emplacement Amazon S3 où Athena enregistre votre requête CTAS
format : doit être le même format que les données source (par exemple, ORC, PARQUET, AVRO, JSON ou TEXTFILE)
bucket_count : nombre de fichiers souhaités (par exemple, 20)
bucketed_by : champ pour le hachage et la sauvegarde des données dans le compartiment. Choisissez un champ ayant une cardinalité élevée.

3.    Exécutez la commande suivante pour confirmer que le jeu de données contient le nombre de fichiers souhaité :

aws s3 ls s3://awsexamplebucket/historic_climate_gz_2GB_file/ --summarize --recursive --human-readable

Le résultat doit être similaire à ce qui suit :

2019-09-03 10:59:20    1.7 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00000.gz
2019-09-03 10:59:20    2.0 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00001.gz
2019-09-03 10:59:20    2.0 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00002.gz
2019-09-03 10:59:19    1.9 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00003.gz
2019-09-03 10:59:17    1.7 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00004.gz
2019-09-03 10:59:21    1.9 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00005.gz
2019-09-03 10:59:18    1.9 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00006.gz
2019-09-03 10:59:17    1.9 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00007.gz
Total Objects: 8
Total Size: 15.0 GiB

Convertir le format des données et définir la taille approximative du fichier

1.    Exécutez une instruction similaire à ce qui suit pour convertir les données dans un format différent :

CREATE TABLE "historic_climate_parquet"
WITH (
      external_location = 's3://awsexamplebucket/historic_climate_parquet/',
      format = 'PARQUET') AS
SELECT * FROM historic_climate_gz

Remplacez les valeurs suivantes dans la requête :
external_location : emplacement Amazon S3 où Athena enregistre votre requête CTAS
format :
format que vous souhaitez convertir (ORC, PARQUET, AVRO, JSON ou TEXTFILE)

2.    Exécutez la commande suivante pour confirmer la taille du jeu de données :

aws s3 ls s3://awsexamplebucket/historic_climate_parquet/ --summarize --recursive --human-readable

Le résultat doit être similaire à ce qui suit :

Total Objects: 30
Total Size: 9.8 GiB

3.    Déterminez le nombre de fichiers dont vous avez besoin pour atteindre la taille de fichier souhaitée. Par exemple, si vous voulez des fichiers de 500 Mo et que le jeu de données est de 9,8 Go, vous avez besoin de 20 fichiers (9 800 / 500 = 19,6, arrondis à 20).

4.    Pour convertir le jeu de données en fichiers de 500 Mo, exécutez une instruction similaire à ce qui suit :

CREATE TABLE "historic_climate_parquet_500mb"
WITH (
      external_location = 's3://awsexamplebucket/historic_climate_parquet_500mb/',
      format = 'PARQUET',
      bucket_count=20,
      bucketed_by = ARRAY['yearmonthday']
       ) AS
SELECT * FROM historic_climate_parquet

Remplacez les valeurs suivantes dans la requête :
external_location : emplacement Amazon S3 où Athena enregistre votre requête CTAS
bucket_count :
nombre de fichiers souhaités (par exemple, 20)
bucketed_by : champ pour le hachage et la sauvegarde des données dans le compartiment. Choisissez un champ ayant une cardinalité élevée.

5.    Exécutez la commande suivante pour confirmer que le jeu de données contient le nombre de fichiers souhaité :

aws s3 ls s3://awsexamplebucket/historic_climate_parquet_500mb/ --summarize --recursive --human-readable

Le résultat doit être similaire à ce qui suit :

2019-09-03 12:01:45  333.9 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00000
2019-09-03 12:01:01  666.7 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00001
2019-09-03 12:01:00  665.6 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00002
2019-09-03 12:01:06  666.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00003
2019-09-03 12:00:59  667.3 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00004
2019-09-03 12:01:27  666.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00005
2019-09-03 12:01:10  666.5 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00006
2019-09-03 12:01:12  668.3 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00007
2019-09-03 12:01:03  666.8 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00008
2019-09-03 12:01:10  646.4 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00009
2019-09-03 12:01:35  639.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00010
2019-09-03 12:00:52  529.5 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00011
2019-09-03 12:01:29  334.2 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00012
2019-09-03 12:01:32  333.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00013
2019-09-03 12:01:34  332.2 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00014
2019-09-03 12:01:44  333.3 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00015
2019-09-03 12:01:51  333.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00016
2019-09-03 12:01:39  333.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00017
2019-09-03 12:01:47  333.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00018
2019-09-03 12:01:49  332.3 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00019
Total Objects: 20
Total Size: 9.9 GiB

Remarque : L'instruction INSERT INTO n'est pas prise en charge sur les tables compartimentées. Pour plus d'informations, consultez Tables compartimentées non prises en charge.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?