Passer au contenu

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

Lecture de 6 minute(s)
0

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

Résolution

Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.

Vous pouvez utiliser le compartiment dans une requête CTAS pour contrôler le nombre de fichiers de sortie. Cependant, il se peut que le nombre de fichiers créés ne corresponde pas toujours au nombre de compartiments spécifié. La fonction de compartimentation peut regrouper des données similaires, mais elle ne peut pas contrôler avec précision le nombre de fichiers.

La résolution suivante utilise le jeu de données public du Global Historical Climatology Network Daily, s3://noaa-ghcn-pds/csv.gz/. Pour plus d'informations, consultez la section Visualiser plus de 200 ans de données climatiques mondiales à l'aide d'Amazon Athena et d’Amazon Quick Sight.

Remarque : Dans les exemples de commandes suivants, remplacez les valeurs suivantes par les vôtres :

external_location : Emplacement Amazon Simple Storage Service (Amazon S3) où vous avez enregistré votre requête CTAS.

format : Format souhaité pour la sortie, tel que ORC, PARQUET, AVRO, JSON ou TEXTFILE.

bucket_count : Nombre de compartiments souhaités.

bucketed_by : Champ permettant de hacher et d'enregistrer les données dans le compartiment, par exemple yearmonthday.

Examiner le jeu de données

Pour vérifier le nombre de fichiers et la taille du jeu de données, exécutez la commande ls suivante :

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

Remarque : Remplacez s3://noaa-ghcn-pds/csv.gz/ par le chemin de votre compartiment s3.

Exemple de sortie :

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

Procédez comme suit :

  1. Pour créer une table, exécutez la commande suivante :

    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. Pour tester la table, exécutez la commande suivante :

    SELECT * FROM historic_climate_gz LIMIT 10

    La sortie montre 10 lignes du jeu de données.

Après avoir créé l'environnement, utilisez les méthodes suivantes pour modifier le jeu de données lorsque vous exécutez des requêtes CTAS.

Modifier le nombre de fichiers dans le jeu de données

Il est recommandé de regrouper les données selon une colonne présentant une cardinalité élevée et des valeurs uniformément réparties. Pour plus d'informations, consultez la section Avantages de la compartimentation.

Procédez comme suit :

  1. Pour convertir le jeu de données en 20 fichiers, exécutez la commande suivante :

    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

    Remarque : L'exemple précédent utilise le champ yearmonthday.

  2. Pour vérifier que le compartiment contient le nombre de fichiers souhaité, exécutez la commande ls suivante :

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

    Exemple de sortie :

    Total Objects: 20
    Total Size: 15.6 Gib

Définir la taille approximative de chaque fichier

Procédez comme suit :

  1. Déterminez le nombre de compartiments que vous devez utiliser pour atteindre le nombre de fichiers souhaité. Par exemple, pour diviser le jeu de données de 15,4 Go en fichiers de 2 Go, vous devez disposer de 8 fichiers (15,4/2 = 7,7, arrondis à 8).

  2. Pour créer une nouvelle table compartimentée, exécutez la commande suivante :

    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
  3. Pour vérifier que le jeu de données contient le nombre de fichiers souhaité, exécutez la commande ls suivante :

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

    Exemple de sortie :

    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 de données et définir la taille de fichier approximative

Procédez comme suit :

  1. Pour convertir les données dans un autre format, exécutez la commande suivante :

    CREATE TABLE "historic_climate_parquet" WITH (
          external_location = 's3://awsexamplebucket/historic_climate_parquet/',
          format = 'PARQUET') AS
    SELECT * FROM historic_climate_gz
  2. Pour confirmer la taille du jeu de données, exécutez la commande ls suivante :

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

    Exemple de sortie :

    Total Objects: 30
    Total Size: 9.8 GiB
  3. Déterminez le nombre de compartiments que vous devez utiliser pour atteindre le nombre de fichiers souhaité. Par exemple, pour des fichiers de 500 Mo et un jeu de données de 9,8 Go, vous devez disposer de 20 fichiers.

  4. Pour convertir le jeu de données en fichiers de 500 Mo, exécutez la commande suivante :

    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
  5. Pour vérifier que le jeu de données contient le nombre de fichiers souhaité, exécutez la commande ls suivante :

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

    Exemple de sortie :

    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 : Les tables compartimentées ne prennent pas en charge l'instruction INSERT INTO.

Informations connexes

Exemples de requêtes CTAS

Considérations et restrictions relatives aux requêtes CTAS

AWS OFFICIELA mis à jour il y a 10 mois