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

Date de la dernière mise à jour : 03/01/2020

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 : ces étapes utilisent l’ensemble de données public Global Historical Climatology Network Daily (s3://noaa-ghcn-pds/csv.gz/) pour illustrer la solution. Pour plus d’informations sur cet ensemble 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 ensemble de données, créer l’environnement, puis modifier l’ensemble de données comme suit :

1.    Modifiez le nombre de fichiers dans l’ensemble 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 l’ensemble de données

Utilisez l’interface de ligne de commande AWS (AWS CLI) pour vérifier le nombre de fichiers et la taille de l’ensemble de données :

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

La sortie est 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 10 lignes de l’ensemble de données. Une fois l’environnement créé, utilisez une ou plusieurs des méthodes suivantes pour modifier l’ensemble 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 l’ensemble de données en 20 fichiers, exécutez une instruction similaire à ce qui suit. Remplacez les valeurs dans ces champs :

external_location : l’emplacement Amazon S3 où Athena enregistre le format de votre requête CTAS : le format souhaité pour la sortie (par exemple ORC, PARQUET, AVRO, JSON, ou TEXTFILE) bucket_count : le nombre de fichiers que vous voulez (par exemple, 20) bucketed_by : le champ de hachage et d’enregistrement des données dans le compartiment (par exemple, yearmonthday)

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

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 l’ensemble 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. Remplacez les valeurs dans ces champs :

external_location : emplacement d’Amazon S3 où Athena enregistre le formatde requête CTAS : doit être le même format que les données sources (comme ORC, PARQUET, AVRO, JSON ou TEXTFILE) bucket_count : nombre de fichiers que vous voulez (par exemple, 20) bucketed_by : le champ de hachage et d’enregistrement des données dans le compartiment. Choisissez un champ ayant une cardinalité élevée.

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.    Exécutez la commande suivante pour confirmer que l’ensemble de données contient le nombre de fichiers souhaité :

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

La sortie est 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

Convertissez le format de données et définissez la taille approximative du fichier

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

external_location : emplacement d’Amazon S3 où Athena enregistre le format de requête CTAS : le format dans lequel vous souhaitez convertir le fichier (ORC, PARQUET, AVRO, JSON ou TEXTFILE)

CREATE TABLE "historic_climate_parquet"
WITH (
      external_location = 's3://awsexamplebucket/historic_climate_parquet/',
      format = 'PARQUET') as
select * from historic_climate_gz

2.    Exécutez la commande suivante pour confirmer la taille de l’ensemble de données :

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

La sortie est 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 l’ensemble de données est de 9,8 Go, vous avez besoin de 20 fichiers (9 800/500 = 19,6, arrondis à 20).

4.    Pour convertir l’ensemble de données en fichiers de 500 Mo, exécutez une instruction similaire à ce qui suit. Remplacez les valeurs dans ces champs :

external_location : l’emplacement d’Amazon S3 où Athena enregistre votre requête CTAS bucket_count : le nombre de fichiers que vous voulez (par exemple, 20) bucketed_by : le champ pour hacher et enregistrer les données dans le compartiment. Choisissez un champ ayant une cardinalité élevée.

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.    Exécutez la commande suivante pour confirmer que l’ensemble de données contient le nombre de fichiers souhaité :

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

La sortie est 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

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

Cette page peut-elle être améliorée ?


Vous avez besoin d’aide ?